Fix skipping of lines when deleting a section with the cfg library.
authorJustin Pettit <jpettit@nicira.com>
Mon, 30 Mar 2009 08:08:38 +0000 (01:08 -0700)
committerJustin Pettit <jpettit@nicira.com>
Mon, 30 Mar 2009 08:08:38 +0000 (01:08 -0700)
When deleting a section in the "cfg" library, the cfg_del_section
function would check each line in the configuration to see if it was
part of the section to be deleted.  The way it deleted was essentially
to move all future lines "down" to replace the line to be deleted.
However, it always incremented the pointer to the next entry, which
could cause it to skip over other entries that should have been deleted.
We now only increment the pointer if we didn't delete a line.

lib/cfg.c

index 0bb50b42fce7fe7229be2c344bda60b706d837fe..66a5aca5ce79d7a694b5779465f005e201bd3c03 100644 (file)
--- a/lib/cfg.c
+++ b/lib/cfg.c
@@ -516,9 +516,14 @@ cfg_del_section(const char *section_, ...)
     ds_put_char(&section, '.');
     va_end(args);
 
-    for (p = cfg.names; *p; p++) { /* XXX this is inefficient */
+    for (p = cfg.names; *p; ) { /* XXX this is inefficient */
         if (!strncmp(section.string, *p, section.length)) {
+            /* Delete this matching entry in-place, so don't move on to
+             * the next entry. */
             svec_del(&cfg, *p);
+        } else {
+            /* Move onto the next entry. */
+            p++;
         }
     }
     ds_destroy(&section);