The branch, v3-4-test has been updated via 1d9dc38... Fix bug 7045 - Bad (non memory copying) interfaces in smbc_setXXXX calls. from b8ff43e... WHATSNEW: Update changes since 3.4.4.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-4-test - Log ----------------------------------------------------------------- commit 1d9dc38aec417c8ccc9fa34d32015ee57d877ba9 Author: Jeremy Allison <j...@samba.org> Date: Fri Jan 15 17:49:56 2010 -0800 Fix bug 7045 - Bad (non memory copying) interfaces in smbc_setXXXX calls. In smbc_free_context libsmbclient just called free() on the string options so it assumes the callers have malloced them before setting them via smbc_set calls. Change to correctly malloc/free string options to the library. Protect against SMB_STRDUP of null. Contains 2d41b1ab78639abe4ae030ff482573f464564dd7 and f85b6ee90b88c7f7b2a92c8a5f3e2ebe59c1087b from master. Jeremy ----------------------------------------------------------------------- Summary of changes: source3/libsmb/libsmb_context.c | 26 +++++++++++++++++++------- source3/libsmb/libsmb_setget.c | 15 ++++++++++++--- 2 files changed, 31 insertions(+), 10 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/libsmb/libsmb_context.c b/source3/libsmb/libsmb_context.c index f85f2df..09e1ab8 100644 --- a/source3/libsmb/libsmb_context.c +++ b/source3/libsmb/libsmb_context.c @@ -192,13 +192,8 @@ smbc_free_context(SMBCCTX *context, } /* Things we have to clean up */ - free(smbc_getWorkgroup(context)); smbc_setWorkgroup(context, NULL); - - free(smbc_getNetbiosName(context)); smbc_setNetbiosName(context, NULL); - - free(smbc_getUser(context)); smbc_setUser(context, NULL); DEBUG(3, ("Context %p successfully freed\n", context)); @@ -426,7 +421,6 @@ SMBCCTX * smbc_init_context(SMBCCTX *context) { int pid; - char *user = NULL; char *home = NULL; if (!context) { @@ -535,7 +529,7 @@ smbc_init_context(SMBCCTX *context) /* * FIXME: Is this the best way to get the user info? */ - user = getenv("USER"); + char *user = getenv("USER"); /* walk around as "guest" if no username can be found */ if (!user) { user = SMB_STRDUP("guest"); @@ -549,6 +543,12 @@ smbc_init_context(SMBCCTX *context) } smbc_setUser(context, user); + SAFE_FREE(user); + + if (!smbc_getUser(context)) { + errno = ENOMEM; + return NULL; + } } if (!smbc_getNetbiosName(context)) { @@ -581,6 +581,12 @@ smbc_init_context(SMBCCTX *context) } smbc_setNetbiosName(context, netbios_name); + SAFE_FREE(netbios_name); + + if (!smbc_getNetbiosName(context)) { + errno = ENOMEM; + return NULL; + } } DEBUG(1, ("Using netbios name %s.\n", smbc_getNetbiosName(context))); @@ -602,6 +608,12 @@ smbc_init_context(SMBCCTX *context) } smbc_setWorkgroup(context, workgroup); + SAFE_FREE(workgroup); + + if (!smbc_getWorkgroup(context)) { + errno = ENOMEM; + return NULL; + } } DEBUG(1, ("Using workgroup %s.\n", smbc_getWorkgroup(context))); diff --git a/source3/libsmb/libsmb_setget.c b/source3/libsmb/libsmb_setget.c index 3493e4f..7113c62 100644 --- a/source3/libsmb/libsmb_setget.c +++ b/source3/libsmb/libsmb_setget.c @@ -39,7 +39,10 @@ smbc_getNetbiosName(SMBCCTX *c) void smbc_setNetbiosName(SMBCCTX *c, char * netbios_name) { - c->netbios_name = netbios_name; + SAFE_FREE(c->netbios_name); + if (netbios_name) { + c->netbios_name = SMB_STRDUP(netbios_name); + } } /** Get the workgroup used for making connections */ @@ -53,7 +56,10 @@ smbc_getWorkgroup(SMBCCTX *c) void smbc_setWorkgroup(SMBCCTX *c, char * workgroup) { - c->workgroup = workgroup; + SAFE_FREE(c->workgroup); + if (workgroup) { + c->workgroup = SMB_STRDUP(workgroup); + } } /** Get the username used for making connections */ @@ -67,7 +73,10 @@ smbc_getUser(SMBCCTX *c) void smbc_setUser(SMBCCTX *c, char * user) { - c->user = user; + SAFE_FREE(c->user); + if (user) { + c->user = SMB_STRDUP(user); + } } /** Get the debug level */ -- Samba Shared Repository