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

Reply via email to