]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: startup: hap_register_feature() fix for partial feature name
authorWilliam Lallemand <wlallemand@haproxy.com>
Mon, 17 Feb 2025 13:38:49 +0000 (14:38 +0100)
committerWilliam Lallemand <wlallemand@haproxy.com>
Mon, 17 Feb 2025 13:56:09 +0000 (14:56 +0100)
In patch 2fe4cbd8e ("MINOR: startup: allow hap_register_feature() to
enable a feature in the list"), the ability to overwrite a '-' in the
feature list was added. However the code was not tokenizing correctly
the string, and partial feature name found in the name could result in
having the same feature name multiple time.

This patch rewrites the lookup of the string by tokenizing it correctly.

src/haproxy.c

index 8bcd30ab1e3c57dd82ea046f45a521503217e9a3..31d20d55fb24b0996d0c5d7d98ab8d52b0c53abd 100644 (file)
@@ -347,7 +347,8 @@ void hap_register_feature(const char *name)
        static int must_free = 0;
        int new_len = strlen(build_features) + 2 + strlen(name);
        char *new_features;
-       char *found, *endp;
+       char *startp, *endp;
+       int found = 0;
 
        new_features = malloc(new_len + 1);
        if (!new_features)
@@ -355,23 +356,39 @@ void hap_register_feature(const char *name)
 
        strlcpy2(new_features, build_features, new_len);
 
+       startp = new_features;
+
        /* look if the string already exists */
-       /* must be a complete feature name with a space of end of string behind (eg OPENSSL vs OPENSSL_AWSLC) */
-       found = strstr(new_features, name);
-       endp = found+strlen(name);
+       while (startp) {
+               char *sign = startp;
+
+               /* tokenize for simpler strcmp */
+               endp = strchr(startp, ' ');
+               if (endp)
+                       *endp = '\0';
 
-       if (found && (*endp == ' ' || *endp == '\0')) {
+               startp++; /* skip sign */
 
-               /* if the feature name was found with a '-' replace it by a '+' */
-               if ((found-1 >= new_features) && (*(found-1) == '-')) {
-                       *(found-1) = '+';
+               if (strcmp(startp, name) == 0) {
+                       *sign = '+';
+                       found = 1;
                }
 
-       } else {
-               /* if we didn't find the feature add it to the string */
-               snprintf(new_features, new_len + 1, "%s +%s", build_features, name);
+               /* couldn't find a space, that's the end of the string */
+               if (!endp)
+                       break;
+
+               *endp = ' ';
+               startp = endp + 1;
+
+               if (found)
+                       break;
        }
 
+       /* if we didn't find the feature add it to the string */
+       if (!found)
+               snprintf(new_features, new_len + 1, "%s +%s", build_features, name);
+
        if (must_free)
                ha_free(&build_features);