The branch, master has been updated via f75934e2dc95d99dfbbc80f26eb3d1d1efe08604 (commit) via 7229e9a4762f1fee15708ac20de9c40ce75f85a2 (commit) via fedac72dfc4c220f653dd243de221dad56650bac (commit) via d30b1c9fa9d03246124dc7db8bb583c260adb0d1 (commit) via 14888c21acaf34da047937b29833d7788bafe11d (commit) via 91d13b68be55728a85b3832e2da9267dbf4f2464 (commit) from e96338bf2b9ff6767a54c6127cdda34591b98c0d (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit f75934e2dc95d99dfbbc80f26eb3d1d1efe08604 Author: Stefan Metzmacher <me...@samba.org> Date: Tue Aug 11 18:31:27 2009 +0200 s3:smbd: as check_path_syntax() changes the string, we need to copy the string before metze commit 7229e9a4762f1fee15708ac20de9c40ce75f85a2 Author: Stefan Metzmacher <me...@samba.org> Date: Tue Aug 11 18:29:06 2009 +0200 s3:smbd: avoid 'goto out' in smbd_smb2_create_send() metze commit fedac72dfc4c220f653dd243de221dad56650bac Author: Stefan Metzmacher <me...@samba.org> Date: Tue Aug 11 18:09:05 2009 +0200 s3:smbd: make sure we don't call conn_free() with a NULL pointer for SMB2 metze commit d30b1c9fa9d03246124dc7db8bb583c260adb0d1 Author: Stefan Metzmacher <me...@samba.org> Date: Tue Aug 11 18:08:26 2009 +0200 s3:smbd: correctly invalidate vuids when SMB2 is used metze commit 14888c21acaf34da047937b29833d7788bafe11d Author: Stefan Metzmacher <me...@samba.org> Date: Tue Aug 11 13:52:07 2009 +0200 s3:lib: map ECONNRESET to NT_STATUS_CONNECTION_RESET metze commit 91d13b68be55728a85b3832e2da9267dbf4f2464 Author: Matt Kraai <mkr...@beckman.com> Date: Wed Aug 12 08:49:24 2009 +0200 libreplace: undef AI_ADDRCONFIG on QNX 6.3.0 (fix bug #6630) Some of the functions in source3/lib/util_sock.c use AI_ADDRCONFIG. On QNX 6.3.0, this macro is defined but, if it's used, getaddrinfo will fail. This prevents smbd from opening any sockets. If I undefine AI_ADDRCONFIG on such systems and allow lib/replace/system/network.h to define it to be 0, this works around the issue. Signed-off-by: Stefan Metzmacher <me...@samba.org> ----------------------------------------------------------------------- Summary of changes: lib/replace/system/network.h | 14 +++++++++++++ source3/lib/errmap_unix.c | 3 ++ source3/smbd/password.c | 4 +++ source3/smbd/smb2_create.c | 43 +++++++++++++++++++++-------------------- source3/smbd/smb2_sesssetup.c | 1 + source3/smbd/smb2_tcon.c | 4 ++- 6 files changed, 47 insertions(+), 22 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/replace/system/network.h b/lib/replace/system/network.h index c836410..1f51035 100644 --- a/lib/replace/system/network.h +++ b/lib/replace/system/network.h @@ -195,6 +195,20 @@ int rep_socketpair(int d, int type, int protocol, int sv[2]); #endif #endif +/* + * Some of the functions in source3/lib/util_sock.c use AI_ADDRCONFIG. On QNX + * 6.3.0, this macro is defined but, if it's used, getaddrinfo will fail. This + * prevents smbd from opening any sockets. + * + * If I undefine AI_ADDRCONFIG on such systems and define it to be 0, + * this works around the issue. + */ +#ifdef __QNX__ +#include <sys/neutrino.h> +#if _NTO_VERSION == 630 +#undef AI_ADDRCONFIG +#endif +#endif #ifndef AI_ADDRCONFIG /* * logic copied from AI_NUMERICHOST diff --git a/source3/lib/errmap_unix.c b/source3/lib/errmap_unix.c index 00c5475..d43598b 100644 --- a/source3/lib/errmap_unix.c +++ b/source3/lib/errmap_unix.c @@ -87,6 +87,9 @@ const struct unix_error_map unix_dos_nt_errmap[] = { #ifdef ECONNABORTED { ECONNABORTED, ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_ABORTED}, #endif +#ifdef ECONNRESET + { ECONNRESET, ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_RESET}, +#endif #ifdef ENODEV { ENODEV, ERRDOS, 55, NT_STATUS_DEVICE_DOES_NOT_EXIST}, #endif diff --git a/source3/smbd/password.c b/source3/smbd/password.c index b1a7497..4c1cef4 100644 --- a/source3/smbd/password.c +++ b/source3/smbd/password.c @@ -128,6 +128,10 @@ void invalidate_vuid(struct smbd_server_connection *sconn, uint16 vuid) void invalidate_all_vuids(struct smbd_server_connection *sconn) { + if (sconn->allow_smb2) { + return; + } + while (sconn->smb1.sessions.validated_users != NULL) { invalidate_vuid(sconn, sconn->smb1.sessions.validated_users->vuid); diff --git a/source3/smbd/smb2_create.c b/source3/smbd/smb2_create.c index 1517ab8..fe414bb 100644 --- a/source3/smbd/smb2_create.c +++ b/source3/smbd/smb2_create.c @@ -272,7 +272,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx, smbreq = smbd_smb2_fake_smb_request(smb2req); if (tevent_req_nomem(smbreq, req)) { - goto out; + return tevent_req_post(req, ev); } if (IS_IPC(smbreq->conn)) { @@ -280,7 +280,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx, if (!lp_nt_pipe_support()) { tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED); - goto out; + return tevent_req_post(req, ev); } /* Strip \\ off the name. */ @@ -291,7 +291,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx, status = open_np_file(smbreq, pipe_name, &result); if (!NT_STATUS_IS_OK(status)) { tevent_req_nterror(req, status); - goto out; + return tevent_req_post(req, ev); } info = FILE_WAS_OPENED; ZERO_STRUCT(sbuf); @@ -299,7 +299,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx, status = file_new(smbreq, smbreq->conn, &result); if(!NT_STATUS_IS_OK(status)) { tevent_req_nterror(req, status); - goto out; + return tevent_req_post(req, ev); } status = print_fsp_open(smbreq, @@ -311,35 +311,39 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx, if (!NT_STATUS_IS_OK(status)) { file_free(smbreq, result); tevent_req_nterror(req, status); - goto out; + return tevent_req_post(req, ev); } info = FILE_WAS_CREATED; } else { + char *fname; struct smb_filename *smb_fname = NULL; /* these are ignored for SMB2 */ in_create_options &= ~(0x10);/* NTCREATEX_OPTIONS_SYNC_ALERT */ in_create_options &= ~(0x20);/* NTCREATEX_OPTIONS_ASYNC_ALERT */ + fname = talloc_strdup(state, in_name); + if (tevent_req_nomem(fname, req)) { + return tevent_req_post(req, ev); + } + /* convert '\\' into '/' */ - status = check_path_syntax(in_name); + status = check_path_syntax(fname); if (!NT_STATUS_IS_OK(status)) { tevent_req_nterror(req, status); - TALLOC_FREE(smb_fname); - goto out; + return tevent_req_post(req, ev); } - status = filename_convert(talloc_tos(), - smbreq->conn, - smbreq->flags2 & FLAGS2_DFS_PATHNAMES, - in_name, - 0, - NULL, - &smb_fname); + status = filename_convert(req, + smbreq->conn, + smbreq->flags2 & FLAGS2_DFS_PATHNAMES, + fname, + 0, + NULL, + &smb_fname); if (!NT_STATUS_IS_OK(status)) { tevent_req_nterror(req, status); - TALLOC_FREE(smb_fname); - goto out; + return tevent_req_post(req, ev); } status = SMB_VFS_CREATE_FILE(smbreq->conn, @@ -359,11 +363,9 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx, &info); if (!NT_STATUS_IS_OK(status)) { tevent_req_nterror(req, status); - TALLOC_FREE(smb_fname); - goto out; + return tevent_req_post(req, ev); } sbuf = smb_fname->st; - TALLOC_FREE(smb_fname); } smb2req->compat_chain_fsp = smbreq->chain_fsp; @@ -389,7 +391,6 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx, state->out_file_id_volatile = result->fnum; tevent_req_done(req); - out: return tevent_req_post(req, ev); } diff --git a/source3/smbd/smb2_sesssetup.c b/source3/smbd/smb2_sesssetup.c index eae26ed..9b1dc8c 100644 --- a/source3/smbd/smb2_sesssetup.c +++ b/source3/smbd/smb2_sesssetup.c @@ -131,6 +131,7 @@ static int smbd_smb2_session_destructor(struct smbd_smb2_session *session) idr_remove(session->sconn->smb2.sessions.idtree, session->vuid); DLIST_REMOVE(session->sconn->smb2.sessions.list, session); + invalidate_vuid(session->sconn, session->vuid); session->vuid = 0; session->status = NT_STATUS_USER_SESSION_DELETED; diff --git a/source3/smbd/smb2_tcon.c b/source3/smbd/smb2_tcon.c index 5137f5c..4ed3fb5 100644 --- a/source3/smbd/smb2_tcon.c +++ b/source3/smbd/smb2_tcon.c @@ -127,7 +127,9 @@ static int smbd_smb2_tcon_destructor(struct smbd_smb2_tcon *tcon) idr_remove(tcon->session->tcons.idtree, tcon->tid); DLIST_REMOVE(tcon->session->tcons.list, tcon); - conn_free(tcon->compat_conn); + if (tcon->compat_conn) { + conn_free(tcon->compat_conn); + } tcon->compat_conn = NULL; tcon->tid = 0; -- Samba Shared Repository