]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s4:smb_server/smb: only create a new session with vuid == 0
authorStefan Metzmacher <metze@samba.org>
Sun, 6 May 2012 19:09:47 +0000 (21:09 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 8 May 2012 23:02:16 +0000 (01:02 +0200)
metze

source4/smb_server/session.c
source4/smb_server/smb/sesssetup.c
source4/smb_server/smb2/sesssetup.c

index 3cb657604144fb2c0fb2fdb6b40122ca87192469..aa8d752fdedbb7b37de99e188c527136401c11e6 100644 (file)
@@ -85,12 +85,9 @@ struct smbsrv_session *smbsrv_session_find_sesssetup(struct smbsrv_connection *s
        p = idr_find(smb_conn->sessions.idtree_vuid, vuid);
        if (!p) return NULL;
 
-       /* only return an unfinished session */
-       sess = talloc_get_type(p, struct smbsrv_session);
-       if (sess && !sess->session_info) {
-               return sess;
-       }
-       return NULL;
+       sess = talloc_get_type_abort(p, struct smbsrv_session);
+
+       return sess;
 }
 
 /*
index 57460fa72d0870f63fda62e6b15aa7f7cc5ade66..b26c1281ddaf354367f20f51b5dc7d34a7b2a4e2 100644 (file)
@@ -435,8 +435,7 @@ static void sesssetup_spnego(struct smbsrv_request *req, union smb_sesssetup *se
        vuid = SVAL(req->in.hdr,HDR_UID);
 
        /* lookup an existing session */
-       smb_sess = smbsrv_session_find_sesssetup(req->smb_conn, vuid);
-       if (!smb_sess) {
+       if (vuid == 0) {
                struct gensec_security *gensec_ctx;
 
                status = samba_server_gensec_start(req,
@@ -466,10 +465,17 @@ static void sesssetup_spnego(struct smbsrv_request *req, union smb_sesssetup *se
                        status = NT_STATUS_INSUFFICIENT_RESOURCES;
                        goto failed;
                }
+       } else {
+               smb_sess = smbsrv_session_find_sesssetup(req->smb_conn, vuid);
        }
 
        if (!smb_sess) {
-               status = NT_STATUS_ACCESS_DENIED;
+               status = NT_STATUS_DOS(ERRSRV, ERRbaduid);
+               goto failed;
+       }
+
+       if (smb_sess->session_info) {
+               status = NT_STATUS_INVALID_PARAMETER;
                goto failed;
        }
 
index 41f629b978f159df17a0689ff3c319a10c112d36..35a148403007409de3fa9d76c4bb266fbf92e505 100644 (file)
@@ -167,6 +167,11 @@ static void smb2srv_sesssetup_backend(struct smb2srv_request *req, union smb_ses
        }
 
        if (!smb_sess) {
+               status = NT_STATUS_USER_SESSION_DELETED;
+               goto failed;
+       }
+
+       if (smb_sess->session_info) {
                /* see WSPP test suite - test 11 */
                status = NT_STATUS_REQUEST_NOT_ACCEPTED;
                goto failed;