s3:libads: Return ADS_STATUS from ads_build_path()
authorSamuel Cabrero <scabrero@samba.org>
Wed, 15 Jun 2022 08:38:51 +0000 (10:38 +0200)
committerJeremy Allison <jra@samba.org>
Mon, 27 Jun 2022 15:50:30 +0000 (15:50 +0000)
Signed-off-by: Samuel Cabrero <scabrero@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/libads/ads_proto.h
source3/libads/ads_struct.c
source3/libads/ldap.c

index 8f75e77a94eebaadaa18d464fe5ce97b60b348b2..7ed363462d457d083b5f1030d4cfd28e7f8cb3fa 100644 (file)
@@ -40,7 +40,11 @@ enum ads_sasl_state_e {
 
 /* The following definitions come from libads/ads_struct.c  */
 
-char *ads_build_path(const char *realm, const char *sep, const char *field, int reverse);
+ADS_STATUS ads_build_path(const char *realm,
+                         const char *sep,
+                         const char *field,
+                         int reverse,
+                         char **_path);
 char *ads_build_dn(const char *realm);
 char *ads_build_domain(const char *dn);
 ADS_STRUCT *ads_init(TALLOC_CTX *mem_ctx,
index 5453a00a853aa81954c96f844d9981deaf27231e..fdd80b3934a72049391505f182c2659746f6cc14 100644 (file)
 /* return a ldap dn path from a string, given separators and field name
    caller must free
 */
-char *ads_build_path(const char *realm, const char *sep, const char *field, int reverse)
+ADS_STATUS ads_build_path(const char *realm,
+                         const char *sep,
+                         const char *field,
+                         int reverse,
+                         char **_path)
 {
        char *p, *r;
        int numbits = 0;
@@ -32,10 +36,12 @@ char *ads_build_path(const char *realm, const char *sep, const char *field, int
        int len;
        char *saveptr;
 
+       *_path = NULL;
+
        r = SMB_STRDUP(realm);
 
        if (!r || !*r) {
-               return r;
+               return ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
        }
 
        for (p=r; *p; p++) {
@@ -49,21 +55,21 @@ char *ads_build_path(const char *realm, const char *sep, const char *field, int
        ret = (char *)SMB_MALLOC(len);
        if (!ret) {
                free(r);
-               return NULL;
+               return ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
        }
 
        if (strlcpy(ret,field, len) >= len) {
                /* Truncate ! */
                free(r);
                free(ret);
-               return NULL;
+               return ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
        }
        p=strtok_r(r, sep, &saveptr);
        if (p) {
                if (strlcat(ret, p, len) >= len) {
                        free(r);
                        free(ret);
-                       return NULL;
+                       return ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
                }
 
                while ((p=strtok_r(NULL, sep, &saveptr)) != NULL) {
@@ -76,7 +82,7 @@ char *ads_build_path(const char *realm, const char *sep, const char *field, int
                        free(ret);
                        if (retval == -1) {
                                free(r);
-                               return NULL;
+                               return ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
                        }
                        ret = SMB_STRDUP(s);
                        free(s);
@@ -84,7 +90,10 @@ char *ads_build_path(const char *realm, const char *sep, const char *field, int
        }
 
        free(r);
-       return ret;
+
+       *_path = ret;
+
+       return ADS_ERROR_NT(NT_STATUS_OK);
 }
 
 /* return a dn of the form "dc=AA,dc=BB,dc=CC" from a 
@@ -93,7 +102,15 @@ char *ads_build_path(const char *realm, const char *sep, const char *field, int
 */
 char *ads_build_dn(const char *realm)
 {
-       return ads_build_path(realm, ".", "dc=", 0);
+       ADS_STATUS status;
+       char *dn = NULL;
+
+       status = ads_build_path(realm, ".", "dc=", 0, &dn);
+       if (!ADS_ERR_OK(status)) {
+               return NULL;
+       }
+
+       return dn;
 }
 
 /* return a DNS name in the for aa.bb.cc from the DN  
index e7117b79ede3e1acefa308b527eaddf10d13638e..3e859ed9039a70d1173b50ff172793bef1df9d15 100755 (executable)
@@ -1762,7 +1762,9 @@ ADS_STATUS ads_del_dn(ADS_STRUCT *ads, char *del_dn)
  **/
 char *ads_ou_string(ADS_STRUCT *ads, const char *org_unit)
 {
+       ADS_STATUS status;
        char *ret = NULL;
+       char *dn = NULL;
 
        if (!org_unit || !*org_unit) {
 
@@ -1779,7 +1781,12 @@ char *ads_ou_string(ADS_STRUCT *ads, const char *org_unit)
        /* jmcd: removed "\\" from the separation chars, because it is
           needed as an escape for chars like '#' which are valid in an
           OU name */
-       return ads_build_path(org_unit, "/", "ou=", 1);
+       status = ads_build_path(org_unit, "/", "ou=", 1, &dn);
+       if (!ADS_ERR_OK(status)) {
+               return NULL;
+       }
+
+       return dn;
 }
 
 /**