]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
When processing the format flags for a given option consume the
authorShawn Routhier <sar@isc.org>
Wed, 29 Dec 2010 23:01:42 +0000 (23:01 +0000)
committerShawn Routhier <sar@isc.org>
Wed, 29 Dec 2010 23:01:42 +0000 (23:01 +0000)
flag indicating an optional value correctly.  A symptom of this
bug was an infinite loop when trying to parse the slp-service-scope
option.  Thanks to a patch from Marius Tomaschewski.
[ISC-Bugs #22055]

RELNOTES
common/parse.c

index e93ef210caa066994add21a5b0577c1374029ebb..acecb557614cd318c1e6d70b2a544acc2fb616a7 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -159,6 +159,12 @@ work on other platforms. Please report any problems and suggested fixes to
   Thanks to a report from Jiri Popelka at Red Hat.
   [ISC-Bugs #22033], [Red Hat Bug #628258]
 
+- When processing the format flags for a given option consume the
+  flag indicating an optional value correctly.  A symptom of this
+  bug was an infinite loop when trying to parse the slp-service-scope
+  option.  Thanks to a patch from Marius Tomaschewski.
+  [ISC-Bugs #22055]
+
                        Changes since 4.2.0rc1
 
 - Documentation cleanup covering multiple tickets
index f459d239c113fd2866e12ef5228b21793414b352..40e95297aca7f111fdd8ea78cf7b9abfafd5923c 100644 (file)
@@ -4977,8 +4977,28 @@ struct option *option;
                do {
                        if ((*fmt == 'A') || (*fmt == 'a'))
                                break;
-                       if (*fmt == 'o')
+                       if (*fmt == 'o') {
+                               /* consume the optional flag */
+                               fmt++;
                                continue;
+                       }
+
+                       if (fmt[1] == 'o') {
+                               /*
+                                * A value for the current format is
+                                * optional - check to see if the next
+                                * token is a semi-colon if so we don't
+                                * need to parse it and doing so would
+                                * consume the semi-colon which our
+                                * caller is expecting to parse
+                                */
+                               token = peek_token(&val, (unsigned *)0,
+                                                  cfile);
+                               if (token == SEMI) {
+                                       fmt++;
+                                       continue;
+                               }
+                       }
 
                        tmp = *expr;
                        *expr = NULL;