]> granicus.if.org Git - pdns/commitdiff
Using a variable format string opens up all kinds of cans of worms.
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 9 Oct 2019 12:39:29 +0000 (14:39 +0200)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 9 Oct 2019 12:39:29 +0000 (14:39 +0200)
pdns/zoneparser-tng.cc

index 49841c4b7308a913c61b9440353996b4be5d38d6..7ac0c5fe645d553068b5abc53e4534e24191bc5c 100644 (file)
@@ -193,11 +193,22 @@ bool ZoneParserTNG::getTemplateLine()
         char radix='d';
         sscanf(spec.c_str(), "%d,%d,%c", &offset, &width, &radix);  // parse format specifier
 
-        char sformat[12];
-        snprintf(sformat, sizeof(sformat), "%%0%d%c", width, radix); // make into printf-style format
-
         char tmp[80];
-        snprintf(tmp, sizeof(tmp), sformat, d_templatecounter + offset); // and do the actual printing
+        switch (radix) {
+        case 'o':
+          snprintf(tmp, sizeof(tmp), "%0*o", width, d_templatecounter + offset);
+          break;
+        case 'x':
+          snprintf(tmp, sizeof(tmp), "%0*x", width, d_templatecounter + offset);
+          break;
+        case 'X':
+          snprintf(tmp, sizeof(tmp), "%0*X", width, d_templatecounter + offset);
+          break;
+        case 'd':
+        default:
+          snprintf(tmp, sizeof(tmp), "%0*d", width, d_templatecounter + offset);
+          break;
+        }
         outpart+=tmp;
       }
       else