diff options
-rw-r--r-- | source3/Makefile.in | 2 | ||||
-rw-r--r-- | source3/smbd/globals.h | 2 | ||||
-rw-r--r-- | source3/smbd/smb2_glue.c | 51 |
3 files changed, 54 insertions, 1 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in index e82a0aff35..eb3761d49c 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -751,7 +751,7 @@ SMBD_OBJ_SRV = smbd/files.o smbd/chgpasswd.o smbd/connection.o \ smbd/file_access.o \ smbd/dnsregister.o smbd/globals.o \ smbd/smb2_server.o smbd/smb2_negprot.o \ - smbd/smb2_sesssetup.o smbd/smb2_tcon.o \ + smbd/smb2_sesssetup.o smbd/smb2_tcon.o smbd/smb2_glue.o \ smbd/smb2_keepalive.o smbd/smb2_signing.o \ $(MANGLE_OBJ) @VFS_STATIC@ diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h index e8821d71a4..6cf5439a3f 100644 --- a/source3/smbd/globals.h +++ b/source3/smbd/globals.h @@ -189,6 +189,8 @@ NTSTATUS smbd_smb2_request_done(struct smbd_smb2_request *req, NTSTATUS smbd_smb2_request_check_session(struct smbd_smb2_request *req); NTSTATUS smbd_smb2_request_check_tcon(struct smbd_smb2_request *req); +struct smb_request *smbd_smb2_fake_smb_request(struct smbd_smb2_request *req); + NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req); NTSTATUS smbd_smb2_request_process_sesssetup(struct smbd_smb2_request *req); NTSTATUS smbd_smb2_request_process_logoff(struct smbd_smb2_request *req); diff --git a/source3/smbd/smb2_glue.c b/source3/smbd/smb2_glue.c new file mode 100644 index 0000000000..c3c38542a0 --- /dev/null +++ b/source3/smbd/smb2_glue.c @@ -0,0 +1,51 @@ +/* + Unix SMB/CIFS implementation. + Core SMB2 server + + Copyright (C) Stefan Metzmacher 2009 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "includes.h" +#include "smbd/globals.h" +#include "../source4/libcli/smb2/smb2_constants.h" + +struct smb_request *smbd_smb2_fake_smb_request(struct smbd_smb2_request *req) +{ + struct smb_request *smbreq; + const uint8_t *inhdr; + int i = req->current_idx; + + inhdr = (const uint8_t *)req->in.vector[i+0].iov_base; + + smbreq = talloc_zero(req, struct smb_request); + if (smbreq == NULL) { + return NULL; + } + + smbreq->vuid = req->session->compat_vuser->vuid; + smbreq->tid = req->tcon->compat_conn->cnum; + smbreq->conn = req->tcon->compat_conn; + smbreq->smbpid = (uint16_t)IVAL(inhdr, SMB2_HDR_PID); + smbreq->flags2 = FLAGS2_UNICODE_STRINGS | + FLAGS2_32_BIT_ERROR_CODES | + FLAGS2_LONG_PATH_COMPONENTS | + FLAGS2_IS_LONG_NAME; + if (IVAL(inhdr, SMB2_HDR_FLAGS) & SMB2_HDR_FLAG_DFS) { + smbreq->flags2 |= FLAGS2_DFS_PATHNAMES; + } + + return smbreq; +} |