s3:ads fix dn parsing name was always null
authorSimo Sorce <idra@samba.org>
Mon, 1 Mar 2010 19:50:50 +0000 (14:50 -0500)
committerKarolin Seeger <kseeger@samba.org>
Wed, 3 Mar 2010 13:36:42 +0000 (14:36 +0100)
While there also use ldap_exploded_dn instead of ldb_dn_validate()
so we can remove a huge dependency that is hanging there only for one very
minor marginal use.

Signed-off-by: Günther Deschner <gd@samba.org>
(cherry picked from commit 8492f92843aa17eaf4a3ea9d5a9c6319afc97854)

Fix bug #7204 (net ads join createcomputer=Servers/Unix fails with out of
memory).

source3/libads/ldap.c

index 4005ed66002166ef4ed478e292a24d99f9da2656..1fd5aa34e352d9e081bdd2e8d014d10ef84dad64 100644 (file)
@@ -3855,39 +3855,36 @@ ADS_STATUS ads_check_ou_dn(TALLOC_CTX *mem_ctx,
                           ADS_STRUCT *ads,
                           const char **account_ou)
 {
-       struct ldb_dn *name_dn = NULL;
-       const char *name = NULL;
-       char *ou_string = NULL;
-       struct ldb_context *ldb = ldb_init(mem_ctx, NULL);
-
-       name_dn = ldb_dn_new(mem_ctx, ldb, *account_ou);
-       if (name_dn && ldb_dn_validate(name_dn)) {
-               talloc_free(ldb);
+       char **exploded_dn;
+       const char *name;
+       char *ou_string;
+
+       exploded_dn = ldap_explode_dn(*account_ou, 0);
+       if (exploded_dn) {
+               ldap_value_free(exploded_dn);
                return ADS_SUCCESS;
        }
 
        ou_string = ads_ou_string(ads, *account_ou);
        if (!ou_string) {
-               talloc_free(ldb);
                return ADS_ERROR_LDAP(LDAP_INVALID_DN_SYNTAX);
        }
 
-       name_dn = ldb_dn_new_fmt(mem_ctx, ldb, "%s,%s", ou_string,
-                                ads->config.bind_path);
+       name = talloc_asprintf(mem_ctx, "%s,%s", ou_string,
+                              ads->config.bind_path);
        SAFE_FREE(ou_string);
 
-       if (!name_dn || !ldb_dn_validate(name_dn)) {
-               talloc_free(ldb);
-               return ADS_ERROR_LDAP(LDAP_INVALID_DN_SYNTAX);
+       if (!name) {
+               return ADS_ERROR_LDAP(LDAP_NO_MEMORY);
        }
 
-       *account_ou = talloc_strdup(mem_ctx, name);
-       if (!*account_ou) {
-               talloc_free(ldb);
-               return ADS_ERROR_LDAP(LDAP_NO_MEMORY);
+       exploded_dn = ldap_explode_dn(name, 0);
+       if (!exploded_dn) {
+               return ADS_ERROR_LDAP(LDAP_INVALID_DN_SYNTAX);
        }
+       ldap_value_free(exploded_dn);
 
-       talloc_free(ldb);
+       *account_ou = name;
        return ADS_SUCCESS;
 }