]> granicus.if.org Git - pdns/commitdiff
remove fgets use so we can now read infinitely long lines of text from trusted files...
authorBert Hubert <bert.hubert@netherlabs.nl>
Mon, 7 Jun 2010 21:56:57 +0000 (21:56 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Mon, 7 Jun 2010 21:56:57 +0000 (21:56 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1625 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/dnssecinfra.cc
pdns/misc.cc
pdns/misc.hh
pdns/reczones.cc
pdns/zoneparser-tng.cc

index 51e26a1f401d4b6a98657c260bf6df1dbedacb51..4d37b2deee4babc20b44879bf99a960b4c973f84 100644 (file)
@@ -19,8 +19,6 @@ using namespace std;
 
 DNSKEYRecordContent getRSAKeyFromISC(rsa_context* rsa, const char* fname)
 {
-  char line[1024];
-
   string sline;
   string key,value;
   map<string, mpi*> places;
@@ -43,9 +41,8 @@ DNSKEYRecordContent getRSAKeyFromISC(rsa_context* rsa, const char* fname)
   unsigned char decoded[1024];
   DNSKEYRecordContent drc;
   string modulus, exponent;
-  while(fgets(line, sizeof(line),fp)) {
-    sline.assign(line);
-    tie(key,value)=splitField(line, ':');
+  while(stringfgets(fp, sline)) {
+    tie(key,value)=splitField(sline, ':');
     trim(value);
 
     if(places.count(key)) {
index 36daa8a6c189b84183ad91e024418cc22c98f25d..c5eaec1ed03de4fcb644813a07ef56741d9b309d 100644 (file)
@@ -685,3 +685,18 @@ int makeIPv6sockaddr(const std::string& addr, struct sockaddr_in6* ret)
   freeaddrinfo(res);
   return 0;
 }
+
+//! read a line of text from a FILE* to a std::string, returns false on 'no data'
+bool stringfgets(FILE* fp, std::string& line)
+{
+  char buffer[1024];
+  line.clear();
+  
+  do {
+    if(!fgets(buffer, sizeof(buffer), fp))
+      return !line.empty();
+    
+    line.append(buffer); 
+  } while(!strchr(buffer, '\n'));
+  return true;
+}
index 4b138da6220265cdd79e93b338149984cd3a60b8..50d9e3515bee408f287f0c780d890cbb66adf70a 100644 (file)
@@ -387,4 +387,5 @@ string makeRelative(const std::string& fqdn, const std::string& zone);
 string labelReverse(const std::string& qname);
 std::string dotConcat(const std::string& a, const std::string &b);
 int makeIPv6sockaddr(const std::string& addr, struct sockaddr_in6* ret);
+bool stringfgets(FILE* fp, std::string& line);
 #endif
index 6a3c489b6242cb6003d69c3474a0b5979f502b2e..b91fa18e2e36393c3af54fdb5f7ea6465a8fdf2c 100644 (file)
@@ -351,10 +351,10 @@ SyncRes::domainmap_t* parseAuthAndForwards()
 
     shared_ptr<FILE> fp=shared_ptr<FILE>(rfp, fclose);
     
-    char line[1024];
+    string line;
     int linenum=0;
     uint64_t before = newMap->size();
-    while(linenum++, fgets(line, sizeof(line)-1, fp.get())) {
+    while(linenum++, stringfgets(fp.get(), line)) {
       string domain, instructions;
       tie(domain, instructions)=splitField(line, '=');
       trim(domain);
index ff46f170386cbf55f90b98c4bba41cb57fe34466..4e6df058818611f82c09948a3208c8e92a2b68a7 100644 (file)
@@ -411,13 +411,12 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr)
   return true;
 }
 
+
 bool ZoneParserTNG::getLine()
 {
   while(!d_filestates.empty()) {
-    char buffer[16384];
-    if(fgets(buffer, sizeof(buffer)-1, d_filestates.top().d_fp)) {
+    if(stringfgets(d_filestates.top().d_fp, d_line)) {
       d_filestates.top().d_lineno++;
-      d_line=buffer;
       return true;
     }
     fclose(d_filestates.top().d_fp);