1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-07 09:49:30 +03:00

r11782: - make the TID 32bit in the smbsrv_tcon structure, as SMB2 uses

them
- add a idtree_limit to the tcons substructure of smbsrv_connection
  this controls what the highest TID is we give away to the client
  it's UINT16_MAX (0xFFFF) for the SMB protocol

metze
(This used to be commit f3bf5a2c09)
This commit is contained in:
Stefan Metzmacher
2005-11-18 12:38:39 +00:00
committed by Gerald (Jerry) Carter
parent 509be8d902
commit 3f968be9d5
5 changed files with 51 additions and 18 deletions

View File

@ -83,7 +83,7 @@
} smbsrv_sessions;
typedef struct {
uint16 tid;
uint32 tid;
astring share_name;
astring client_ip;
NTTIME connect_time;

View File

@ -29,19 +29,40 @@
/****************************************************************************
init the tcon structures
****************************************************************************/
NTSTATUS smbsrv_init_tcons(struct smbsrv_connection *smb_conn)
NTSTATUS smbsrv_init_tcons(struct smbsrv_connection *smb_conn, uint32_t limit)
{
smb_conn->tcons.idtree_tid = idr_init(smb_conn);
/*
* the idr_* functions take 'int' as limit,
* and only work with a max limit 0x00FFFFFF
*/
limit &= 0x00FFFFFF;
smb_conn->tcons.idtree_tid = idr_init(smb_conn);
NT_STATUS_HAVE_NO_MEMORY(smb_conn->tcons.idtree_tid);
smb_conn->tcons.idtree_limit = limit;
smb_conn->tcons.list = NULL;
return NT_STATUS_OK;
}
/****************************************************************************
find a tcon given a cnum
****************************************************************************/
struct smbsrv_tcon *smbsrv_tcon_find(struct smbsrv_connection *smb_conn, uint_t tid)
struct smbsrv_tcon *smbsrv_tcon_find(struct smbsrv_connection *smb_conn, uint32_t tid)
{
return idr_find(smb_conn->tcons.idtree_tid, tid);
void *p;
struct smbsrv_tcon *tcon;
if (tid == 0) return NULL;
if (tid > smb_conn->tcons.idtree_limit) return NULL;
p = idr_find(smb_conn->tcons.idtree_tid, tid);
if (!p) return NULL;
tcon = talloc_get_type(p, struct smbsrv_tcon);
return tcon;
}
/*
@ -51,13 +72,14 @@ static int smbsrv_tcon_destructor(void *ptr)
{
struct smbsrv_tcon *tcon = ptr;
DEBUG(3,("%s closed connection to service %s\n",
socket_get_peer_addr(tcon->smb_conn->connection->socket, tcon),
lp_servicename(tcon->service)));
/* tell the ntvfs backend that we are disconnecting */
ntvfs_disconnect(tcon);
if (tcon->ntvfs_ctx) {
ntvfs_disconnect(tcon);
}
idr_remove(tcon->smb_conn->tcons.idtree_tid, tcon->tid);
DLIST_REMOVE(tcon->smb_conn->tcons.list, tcon);
@ -74,20 +96,20 @@ struct smbsrv_tcon *smbsrv_tcon_new(struct smbsrv_connection *smb_conn)
tcon = talloc_zero(smb_conn, struct smbsrv_tcon);
if (!tcon) return NULL;
tcon->smb_conn = smb_conn;
i = idr_get_new_random(smb_conn->tcons.idtree_tid, tcon, UINT16_MAX);
i = idr_get_new_random(smb_conn->tcons.idtree_tid, tcon, smb_conn->tcons.idtree_limit);
if (i == -1) {
DEBUG(1,("ERROR! Out of connection structures\n"));
return NULL;
}
tcon->tid = i;
tcon->smb_conn = smb_conn;
tcon->connect_time = timeval_current();
talloc_set_destructor(tcon, smbsrv_tcon_destructor);
DLIST_ADD(smb_conn->tcons.list, tcon);
talloc_set_destructor(tcon, smbsrv_tcon_destructor);
/* now fill in some statistics */
tcon->statistics.connect_time = timeval_current();
return tcon;
}

View File

@ -82,7 +82,7 @@ static NTSTATUS smbsrv_tcon_information(struct irpc_message *msg,
struct smbsrv_tcon_info *info = &r->out.info.tcons.tcons[i];
info->tid = tcon->tid;
info->share_name = lp_servicename(tcon->service);
info->connect_time = timeval_to_nttime(&tcon->connect_time);
info->connect_time = timeval_to_nttime(&tcon->statistics.connect_time);
info->client_ip = socket_get_peer_addr(smb_conn->connection->socket, r);
i++;
}

View File

@ -648,7 +648,7 @@ NTSTATUS smbsrv_init_smb_connection(struct smbsrv_connection *smb_conn)
status = smbsrv_init_sessions(smb_conn);
NT_STATUS_NOT_OK_RETURN(status);
status = smbsrv_init_tcons(smb_conn);
status = smbsrv_init_tcons(smb_conn, UINT16_MAX);
NT_STATUS_NOT_OK_RETURN(status);
srv_init_signing(smb_conn);

View File

@ -3,7 +3,7 @@
Copyright (C) Andrew Tridgell 2003
Copyright (C) James J Myers 2003 <myersjj@samba.org>
Copyright (C) Stefan Metzmacher 2004
Copyright (C) Stefan Metzmacher 2004-2005
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
@ -65,7 +65,12 @@ struct smbsrv_tcon {
/* the server context that this was created on */
struct smbsrv_connection *smb_conn;
uint16_t tid; /* an index passed over the wire (the TID) */
/*
* an index passed over the wire:
* - 16 bit for smb
* - 32 bit for smb2
*/
uint32_t tid; /* an index passed over the wire (the TID) */
int service;
BOOL read_only;
@ -86,7 +91,10 @@ struct smbsrv_tcon {
struct smbsrv_session *session;
} sec_share;
struct timeval connect_time;
/* some statictics for the management tools */
struct {
struct timeval connect_time;
} statistics;
};
/* a set of flags to control handling of request structures */
@ -225,6 +233,9 @@ struct smbsrv_connection {
/* an id tree used to allocate tids */
struct idr_context *idtree_tid;
/* this is the limit of vuid values for this connection */
uint32_t idtree_limit;
/* list of open tree connects */
struct smbsrv_tcon *list;
} tcons;