mirror of
https://github.com/samba-team/samba.git
synced 2025-10-23 11:33:16 +03:00
r23044: - use uint32_t for handle id's
- include the session vuid in the SMB2 128-Bit wire handles
as SMB2 oplock breaks doesn't include a TID or VUID in the header
we need to make sure the handle is unique for the whole TCP connection
metze
(This used to be commit 7c29b8a7e6)
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
baa81e2959
commit
10498e8a72
@@ -27,7 +27,7 @@
|
||||
/****************************************************************************
|
||||
init the handle structures
|
||||
****************************************************************************/
|
||||
NTSTATUS smbsrv_init_handles(struct smbsrv_tcon *tcon, uint64_t limit)
|
||||
NTSTATUS smbsrv_init_handles(struct smbsrv_tcon *tcon, uint32_t limit)
|
||||
{
|
||||
/*
|
||||
* the idr_* functions take 'int' as limit,
|
||||
@@ -47,7 +47,7 @@ NTSTATUS smbsrv_init_handles(struct smbsrv_tcon *tcon, uint64_t limit)
|
||||
find a handle given a handle id
|
||||
****************************************************************************/
|
||||
static struct smbsrv_handle *smbsrv_handle_find(struct smbsrv_handles_context *handles_ctx,
|
||||
uint64_t hid, struct timeval request_time)
|
||||
uint32_t hid, struct timeval request_time)
|
||||
{
|
||||
void *p;
|
||||
struct smbsrv_handle *handle;
|
||||
@@ -77,7 +77,7 @@ struct smbsrv_handle *smbsrv_smb_handle_find(struct smbsrv_tcon *smb_tcon,
|
||||
}
|
||||
|
||||
struct smbsrv_handle *smbsrv_smb2_handle_find(struct smbsrv_tcon *smb_tcon,
|
||||
uint64_t hid, struct timeval request_time)
|
||||
uint32_t hid, struct timeval request_time)
|
||||
{
|
||||
return smbsrv_handle_find(&smb_tcon->handles, hid, request_time);
|
||||
}
|
||||
|
||||
@@ -41,9 +41,9 @@ struct ntvfs_handle *smb2srv_pull_handle(struct smb2srv_request *req, const uint
|
||||
{
|
||||
struct smbsrv_tcon *tcon;
|
||||
struct smbsrv_handle *handle;
|
||||
uint64_t hid;
|
||||
uint32_t hid;
|
||||
uint32_t tid;
|
||||
uint32_t pad;
|
||||
uint64_t uid;
|
||||
|
||||
/*
|
||||
* if there're chained requests used the cached handle
|
||||
@@ -56,16 +56,20 @@ struct ntvfs_handle *smb2srv_pull_handle(struct smb2srv_request *req, const uint
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
hid = BVAL(base, offset);
|
||||
tid = IVAL(base, offset + 8);
|
||||
pad = IVAL(base, offset + 12);
|
||||
hid = IVAL(base, offset);
|
||||
tid = IVAL(base, offset + 4);
|
||||
uid = BVAL(base, offset + 8);
|
||||
|
||||
if (pad != UINT32_MAX) {
|
||||
/* if it's the wildcard handle, don't waste time to search it... */
|
||||
if (hid == UINT32_MAX && tid == UINT32_MAX && uid == UINT64_MAX) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* if it's the wildcard handle, don't waste time to search it... */
|
||||
if (hid == UINT64_MAX && tid == UINT32_MAX) {
|
||||
/*
|
||||
* if the (v)uid part doesn't match the given session the handle isn't
|
||||
* valid
|
||||
*/
|
||||
if (uid != req->session->vuid) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -74,7 +78,7 @@ struct ntvfs_handle *smb2srv_pull_handle(struct smb2srv_request *req, const uint
|
||||
* as that TID in the SMB2 header says, but
|
||||
* the request should succeed nevertheless!
|
||||
*
|
||||
* because if this we put the 32 bit TID into the
|
||||
* because of this we put the 32 bit TID into the
|
||||
* 128 bit handle, so that we can extract the tcon from the
|
||||
* handle
|
||||
*/
|
||||
@@ -102,6 +106,8 @@ struct ntvfs_handle *smb2srv_pull_handle(struct smb2srv_request *req, const uint
|
||||
* as the handle may have overwritten the tcon
|
||||
* we need to set it on the request so that the
|
||||
* correct ntvfs context will be used for the ntvfs_*() request
|
||||
*
|
||||
* TODO: check if that's correct for chained requests as well!
|
||||
*/
|
||||
req->tcon = tcon;
|
||||
return handle->ntvfs;
|
||||
@@ -115,9 +121,9 @@ void smb2srv_push_handle(uint8_t *base, uint_t offset, struct ntvfs_handle *ntvf
|
||||
/*
|
||||
* the handle is 128 bit on the wire
|
||||
*/
|
||||
SBVAL(base, offset, handle->hid);
|
||||
SIVAL(base, offset + 8, handle->tcon->tid);
|
||||
SIVAL(base, offset + 12,UINT32_MAX);
|
||||
SIVAL(base, offset, handle->hid);
|
||||
SIVAL(base, offset + 4, handle->tcon->tid);
|
||||
SBVAL(base, offset + 8, handle->session->vuid);
|
||||
}
|
||||
|
||||
static NTSTATUS smb2srv_handle_create_new(void *private_data, struct ntvfs_request *ntvfs, struct ntvfs_handle **_h)
|
||||
|
||||
@@ -185,13 +185,14 @@ struct smbsrv_handle {
|
||||
/*
|
||||
* the value passed over the wire
|
||||
* - 16 bit for smb
|
||||
* - 64 bit for smb2
|
||||
* - 32 bit for smb2
|
||||
* Note: for SMB2 handles are 128 bit
|
||||
* we'll fill the 2nd 64 bit with:
|
||||
* we'll fill them with
|
||||
* - 32 bit HID
|
||||
* - 32 bit TID
|
||||
* - 32 bit 0xFFFFFFFF
|
||||
* - 64 bit VUID
|
||||
*/
|
||||
uint64_t hid;
|
||||
uint32_t hid;
|
||||
|
||||
/*
|
||||
* the ntvfs handle passed to the ntvfs backend
|
||||
|
||||
Reference in New Issue
Block a user