There were similar parts of the code in "no" and "default" prefix
keywords handling. This duplication caused the bug once.

No backport needed.
---
 src/cfgparse.c | 36 ++++++++++++++++++++++--------------
 1 file changed, 22 insertions(+), 14 deletions(-)

diff --git a/src/cfgparse.c b/src/cfgparse.c
index d0b79462a..a7201d3a8 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -133,6 +133,26 @@ struct cfg_kw_list cfg_keywords = {
        .list = LIST_HEAD_INIT(cfg_keywords.list)
 };
 
+/*
+ * Shifts <args> one position to the left.
+ * This function tricky preserves internal allocated structure of the
+ * <args>. We defer the deallocation of the "shifted off" element, by
+ * making it an empty string and moving it into the gap that appears after
+ * the shift.
+ */
+static void
+lshift_args(char **args)
+{
+       int i;
+       char *shifted;
+
+       shifted = args[0];
+       for (i = 0; *args[i + 1]; i++)
+               args[i] = args[i + 1];
+       *shifted = '\0';
+       args[i] = shifted;
+}
+
 /*
  * converts <str> to a list of listeners which are dynamically allocated.
  * The format is "{addr|'*'}:port[-end][,{addr|'*'}:port[-end]]*", where :
@@ -2668,24 +2688,12 @@ int parse_cfg(const struct cfgfile *cfg)
 
                /* check for keyword modifiers "no" and "default" */
                if (strcmp(args[0], "no") == 0) {
-                       char *tmp;
-
                        kwm = KWM_NO;
-                       tmp = args[0];
-                       for (arg=0; *args[arg+1]; arg++)
-                               args[arg] = args[arg+1];                // 
shift args after inversion
-                       *tmp = '\0';                                    // fix 
the next arg to \0
-                       args[arg] = tmp;
+                       lshift_args(args);
                }
                else if (strcmp(args[0], "default") == 0) {
-                       char *tmp;
-
                        kwm = KWM_DEF;
-                       tmp = args[0];
-                       for (arg=0; *args[arg+1]; arg++)
-                               args[arg] = args[arg+1];                // 
shift args after inversion
-                       *tmp = '\0';
-                       args[arg] = tmp;
+                       lshift_args(args);
                }
 
                if (kwm != KWM_STD && strcmp(args[0], "option") != 0 &&
-- 
Egor Shestakov
egor ascii(0x40) ved1 ascii(0x2E) me



Reply via email to