summaryrefslogtreecommitdiff
path: root/source3/auth/server_info.c
diff options
context:
space:
mode:
authorSimo Sorce <ssorce@redhat.com>2010-05-27 19:22:02 -0400
committerSimo Sorce <ssorce@redhat.com>2010-05-27 19:23:54 -0400
commit3bb819581b1dc2624a9e52c2cae065cc3bda6a4b (patch)
tree2e9101e8a4cb4edef8e180d577c24588c0e2cbf6 /source3/auth/server_info.c
parent2a6a696e32798f2a2aabef61dfa421da6328d069 (diff)
downloadsamba-3bb819581b1dc2624a9e52c2cae065cc3bda6a4b.tar.gz
samba-3bb819581b1dc2624a9e52c2cae065cc3bda6a4b.tar.bz2
samba-3bb819581b1dc2624a9e52c2cae065cc3bda6a4b.zip
Fix Out of memory checks
Günther pushed an older version of the patch "s3:auth add function to copy a netr_SamInfo3 structure" that was missing these fixes.
Diffstat (limited to 'source3/auth/server_info.c')
-rw-r--r--source3/auth/server_info.c96
1 files changed, 59 insertions, 37 deletions
diff --git a/source3/auth/server_info.c b/source3/auth/server_info.c
index d9b25bda68..27f0487a4d 100644
--- a/source3/auth/server_info.c
+++ b/source3/auth/server_info.c
@@ -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;
}