Fix Out of memory checks
authorSimo Sorce <ssorce@redhat.com>
Thu, 27 May 2010 23:22:02 +0000 (19:22 -0400)
committerSimo Sorce <ssorce@redhat.com>
Thu, 27 May 2010 23:23:54 +0000 (19:23 -0400)
Günther pushed an older version of the patch "s3:auth add function to copy a
netr_SamInfo3 structure" that was missing these fixes.

source3/auth/server_info.c

index d9b25bda68bbe5b9fae4a5992e0b2dccefdf9d74..27f0487a4d7cea22ab89ac227dbea721da9c7adf 100644 (file)
@@ -393,51 +393,73 @@ struct netr_SamInfo3 *copy_netr_SamInfo3(TALLOC_CTX *mem_ctx,
 {
        struct netr_SamInfo3 *info3;
 
-       info3 = talloc(mem_ctx, struct netr_SamInfo3);
+       info3 = talloc_zero(mem_ctx, struct netr_SamInfo3);
        if (!info3) return NULL;
 
        /* first copy all, then realloc pointers */
        info3->base = orig->base;
 
-       info3->base.account_name.string =
-               talloc_strdup(info3, orig->base.account_name.string);
-       RET_NOMEM(info3->base.account_name.string);
-       info3->base.full_name.string =
-               talloc_strdup(info3, orig->base.full_name.string);
-       RET_NOMEM(info3->base.full_name.string);
-       info3->base.logon_script.string =
-               talloc_strdup(info3, orig->base.logon_script.string);
-       RET_NOMEM(info3->base.logon_script.string);
-       info3->base.profile_path.string =
-               talloc_strdup(info3, orig->base.profile_path.string);
-       RET_NOMEM(info3->base.profile_path.string);
-       info3->base.home_directory.string =
-               talloc_strdup(info3, orig->base.home_directory.string);
-       RET_NOMEM(info3->base.home_directory.string);
-       info3->base.home_drive.string =
-               talloc_strdup(info3, orig->base.home_drive.string);
-       RET_NOMEM(info3->base.home_drive.string);
-
-       info3->base.groups.rids =
-               talloc_memdup(info3, orig->base.groups.rids,
-                       (sizeof(struct samr_RidWithAttribute) *
-                               orig->base.groups.count));
-       RET_NOMEM(info3->base.groups.rids);
-
-       info3->base.logon_server.string =
-               talloc_strdup(info3, orig->base.logon_server.string);
-       RET_NOMEM(info3->base.logon_server.string);
-       info3->base.domain.string =
-               talloc_strdup(info3, orig->base.domain.string);
-       RET_NOMEM(info3->base.domain.string);
+       if (orig->base.account_name.string) {
+               info3->base.account_name.string =
+                       talloc_strdup(info3, orig->base.account_name.string);
+               RET_NOMEM(info3->base.account_name.string);
+       }
+       if (orig->base.full_name.string) {
+               info3->base.full_name.string =
+                       talloc_strdup(info3, orig->base.full_name.string);
+               RET_NOMEM(info3->base.full_name.string);
+       }
+       if (orig->base.logon_script.string) {
+               info3->base.logon_script.string =
+                       talloc_strdup(info3, orig->base.logon_script.string);
+               RET_NOMEM(info3->base.logon_script.string);
+       }
+       if (orig->base.profile_path.string) {
+               info3->base.profile_path.string =
+                       talloc_strdup(info3, orig->base.profile_path.string);
+               RET_NOMEM(info3->base.profile_path.string);
+       }
+       if (orig->base.home_directory.string) {
+               info3->base.home_directory.string =
+                       talloc_strdup(info3, orig->base.home_directory.string);
+               RET_NOMEM(info3->base.home_directory.string);
+       }
+       if (orig->base.home_drive.string) {
+               info3->base.home_drive.string =
+                       talloc_strdup(info3, orig->base.home_drive.string);
+               RET_NOMEM(info3->base.home_drive.string);
+       }
 
-       info3->base.domain_sid = sid_dup_talloc(info3, orig->base.domain_sid);
-       RET_NOMEM(info3->base.domain_sid);
+       if (orig->base.groups.count) {
+               info3->base.groups.rids =
+                       talloc_memdup(info3, orig->base.groups.rids,
+                               (sizeof(struct samr_RidWithAttribute) *
+                                       orig->base.groups.count));
+               RET_NOMEM(info3->base.groups.rids);
+       }
+
+       if (orig->base.logon_server.string) {
+               info3->base.logon_server.string =
+                       talloc_strdup(info3, orig->base.logon_server.string);
+               RET_NOMEM(info3->base.logon_server.string);
+       }
+       if (orig->base.domain.string) {
+               info3->base.domain.string =
+                       talloc_strdup(info3, orig->base.domain.string);
+               RET_NOMEM(info3->base.domain.string);
+       }
+
+       if (orig->base.domain_sid) {
+               info3->base.domain_sid = sid_dup_talloc(info3, orig->base.domain_sid);
+               RET_NOMEM(info3->base.domain_sid);
+       }
 
-       info3->sids = talloc_memdup(info3, orig->sids,
-                                   (sizeof(struct netr_SidAttr) *
+       if (orig->sidcount) {
+               info3->sids = talloc_memdup(info3, orig->sids,
+                                           (sizeof(struct netr_SidAttr) *
                                                        orig->sidcount));
-       RET_NOMEM(info3->sids);
+               RET_NOMEM(info3->sids);
+       }
 
        return info3;
 }