]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Ensure ldap controls are freed on error
authorNick Porter <nick@portercomputing.co.uk>
Mon, 10 Feb 2025 14:03:21 +0000 (14:03 +0000)
committerNick Porter <nick@portercomputing.co.uk>
Mon, 10 Feb 2025 14:03:21 +0000 (14:03 +0000)
src/lib/ldap/util.c

index 7d786dfe762e765e2dda2fc25ed4c9474df0fc9e..201d18a916c5258f73d5d9e1f9d20f76b102d5a0 100644 (file)
@@ -333,8 +333,14 @@ int fr_ldap_parse_url_extensions(LDAPControl **sss, size_t sss_len, char *extens
                        int             ret;
 
                        if (!fr_sbuff_next_if_char(&sbuff, '=')) {
+                               LDAPControl **s = sss;
                                fr_strerror_const("Server side sort extension must be "
                                                  "in the format \"[!]sss=<key>[,key]\"");
+                       error:
+                               while (s < sss_p) {
+                                       if (*s) ldap_control_free(*s);
+                                       s++;
+                               }
                                return -1;
                        }
 
@@ -342,7 +348,7 @@ int fr_ldap_parse_url_extensions(LDAPControl **sss, size_t sss_len, char *extens
                        if (ret != LDAP_SUCCESS) {
                                fr_strerror_printf("Invalid server side sort value \"%s\": %s",
                                                   fr_sbuff_current(&sbuff), ldap_err2string(ret));
-                               return -1;
+                               goto error;
                        }
 
                        if (*sss_p) ldap_control_free(*sss_p);
@@ -352,7 +358,7 @@ int fr_ldap_parse_url_extensions(LDAPControl **sss, size_t sss_len, char *extens
                        if (ret != LDAP_SUCCESS) {
                                fr_strerror_printf("Failed creating server sort control: %s",
                                                   ldap_err2string(ret));
-                               return -1;
+                               goto error;
                        }
                        sss_p++;