From: Samuel Cabrero Date: Wed, 15 Jun 2022 08:38:51 +0000 (+0200) Subject: s3:libads: Return ADS_STATUS from ads_build_path() X-Git-Tag: tevent-0.13.0~231 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9530ca8537250e84f00f9a55f2e955a06c613f18;p=thirdparty%2Fsamba.git s3:libads: Return ADS_STATUS from ads_build_path() Signed-off-by: Samuel Cabrero Reviewed-by: Jeremy Allison --- diff --git a/source3/libads/ads_proto.h b/source3/libads/ads_proto.h index 8f75e77a94e..7ed363462d4 100644 --- a/source3/libads/ads_proto.h +++ b/source3/libads/ads_proto.h @@ -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, diff --git a/source3/libads/ads_struct.c b/source3/libads/ads_struct.c index 5453a00a853..fdd80b3934a 100644 --- a/source3/libads/ads_struct.c +++ b/source3/libads/ads_struct.c @@ -24,7 +24,11 @@ /* 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 diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c index e7117b79ede..3e859ed9039 100755 --- a/source3/libads/ldap.c +++ b/source3/libads/ldap.c @@ -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; } /**