From: Jeremy Allison Date: Tue, 31 Mar 2015 21:40:23 +0000 (-0700) Subject: s3: libsmbclient: After getting attribute server, ensure main srv pointer is still... X-Git-Tag: samba-4.1.18~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1cd5d85cad2f2f29a5f9d2b4decd538db4e0e1d6;p=thirdparty%2Fsamba.git s3: libsmbclient: After getting attribute server, ensure main srv pointer is still valid. Bug #11186: Crash seen in libsmbclient due to free of server structure during SMBC_getxattr() call Bug: https://bugzilla.samba.org/show_bug.cgi?id=11186 Signed-off-by: Jeremy Allison Reviewed-by: David Disseldorp Autobuild-User(master): David Disseldorp Autobuild-Date(master): Tue Apr 14 02:58:43 CEST 2015 on sn-devel-104 (cherry picked from commit 2d4db4a65e1e8924470741378fe249f22196eceb) --- diff --git a/source3/libsmb/libsmb_xattr.c b/source3/libsmb/libsmb_xattr.c index 8e6590a5367..edc62f3bf3e 100644 --- a/source3/libsmb/libsmb_xattr.c +++ b/source3/libsmb/libsmb_xattr.c @@ -2072,6 +2072,25 @@ SMBC_getxattr_ctx(SMBCCTX *context, if (! srv->no_nt_session) { ipc_srv = SMBC_attr_server(frame, context, server, port, share, &workgroup, &user, &password); + /* + * SMBC_attr_server() can cause the original + * server to be removed from the cache. + * If so we must error out here as the srv + * pointer has been freed. + */ + if (smbc_getFunctionGetCachedServer(context)(context, + server, + share, + workgroup, + user) != srv) { +#if defined(ECONNRESET) + errno = ECONNRESET; +#else + errno = ETIMEDOUT; +#endif + TALLOC_FREE(frame); + return -1; + } if (! ipc_srv) { srv->no_nt_session = True; } @@ -2207,9 +2226,31 @@ SMBC_removexattr_ctx(SMBCCTX *context, } if (! srv->no_nt_session) { + int saved_errno; ipc_srv = SMBC_attr_server(frame, context, server, port, share, &workgroup, &user, &password); + saved_errno = errno; + /* + * SMBC_attr_server() can cause the original + * server to be removed from the cache. + * If so we must error out here as the srv + * pointer has been freed. + */ + if (smbc_getFunctionGetCachedServer(context)(context, + server, + share, + workgroup, + user) != srv) { +#if defined(ECONNRESET) + errno = ECONNRESET; +#else + errno = ETIMEDOUT; +#endif + TALLOC_FREE(frame); + return -1; + } if (! ipc_srv) { + errno = saved_errno; srv->no_nt_session = True; } } else {