mirror of
https://github.com/samba-team/samba.git
synced 2025-12-07 20:23:50 +03:00
r22561: Fix a memleak in lanman.c: Nobody would free the session_list.
Volker
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
4616c29b9f
commit
5d428400f7
@@ -769,13 +769,12 @@ static void init_srv_sess_info_0(pipes_struct *p, struct srvsvc_NetSessCtr0 *ss0
|
|||||||
{
|
{
|
||||||
struct sessionid *session_list;
|
struct sessionid *session_list;
|
||||||
uint32 num_entries = 0;
|
uint32 num_entries = 0;
|
||||||
(*stot) = list_sessions(&session_list);
|
(*stot) = list_sessions(p->mem_ctx, &session_list);
|
||||||
|
|
||||||
if (ss0 == NULL) {
|
if (ss0 == NULL) {
|
||||||
if (snum) {
|
if (snum) {
|
||||||
(*snum) = 0;
|
(*snum) = 0;
|
||||||
}
|
}
|
||||||
SAFE_FREE(session_list);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -799,7 +798,6 @@ static void init_srv_sess_info_0(pipes_struct *p, struct srvsvc_NetSessCtr0 *ss0
|
|||||||
ss0->array = NULL;
|
ss0->array = NULL;
|
||||||
ss0->count = 0;
|
ss0->count = 0;
|
||||||
}
|
}
|
||||||
SAFE_FREE(session_list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
@@ -859,7 +857,7 @@ static void init_srv_sess_info_1(pipes_struct *p, struct srvsvc_NetSessCtr1 *ss1
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*stot) = list_sessions(&session_list);
|
(*stot) = list_sessions(p->mem_ctx, &session_list);
|
||||||
|
|
||||||
ss1->array = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetSessInfo1, *stot);
|
ss1->array = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetSessInfo1, *stot);
|
||||||
|
|
||||||
@@ -900,8 +898,6 @@ static void init_srv_sess_info_1(pipes_struct *p, struct srvsvc_NetSessCtr1 *ss1
|
|||||||
if ((*snum) >= (*stot)) {
|
if ((*snum) >= (*stot)) {
|
||||||
(*snum) = 0;
|
(*snum) = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SAFE_FREE(session_list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
@@ -1222,7 +1218,7 @@ WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r)
|
|||||||
memmove(machine, &machine[1], strlen(machine));
|
memmove(machine, &machine[1], strlen(machine));
|
||||||
}
|
}
|
||||||
|
|
||||||
num_sessions = list_sessions(&session_list);
|
num_sessions = list_sessions(p->mem_ctx, &session_list);
|
||||||
|
|
||||||
DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
|
DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
|
||||||
|
|
||||||
@@ -1248,10 +1244,7 @@ WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r)
|
|||||||
|
|
||||||
DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
|
DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
|
||||||
|
|
||||||
|
|
||||||
done:
|
done:
|
||||||
SAFE_FREE(session_list);
|
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4213,7 +4213,7 @@ static BOOL api_RNetSessionEnum(connection_struct *conn, uint16 vuid,
|
|||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
|
|
||||||
num_sessions = list_sessions(&session_list);
|
num_sessions = list_sessions(tmp_talloc_ctx(), &session_list);
|
||||||
|
|
||||||
if (mdrcnt > 0) {
|
if (mdrcnt > 0) {
|
||||||
*rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
|
*rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
|
||||||
|
|||||||
@@ -218,6 +218,7 @@ BOOL session_traverse(int (*fn)(TDB_CONTEXT *, TDB_DATA, TDB_DATA, void *),
|
|||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
struct session_list {
|
struct session_list {
|
||||||
|
TALLOC_CTX *mem_ctx;
|
||||||
int count;
|
int count;
|
||||||
struct sessionid *sessions;
|
struct sessionid *sessions;
|
||||||
};
|
};
|
||||||
@@ -230,7 +231,9 @@ static int gather_sessioninfo(TDB_CONTEXT *stdb, TDB_DATA kbuf, TDB_DATA dbuf, v
|
|||||||
|
|
||||||
i = sesslist->count;
|
i = sesslist->count;
|
||||||
|
|
||||||
sesslist->sessions = SMB_REALLOC_ARRAY(sesslist->sessions, struct sessionid, i+1);
|
sesslist->sessions = TALLOC_REALLOC_ARRAY(
|
||||||
|
sesslist->mem_ctx, sesslist->sessions, struct sessionid, i+1);
|
||||||
|
|
||||||
if (!sesslist->sessions) {
|
if (!sesslist->sessions) {
|
||||||
sesslist->count = 0;
|
sesslist->count = 0;
|
||||||
return -1;
|
return -1;
|
||||||
@@ -248,10 +251,11 @@ static int gather_sessioninfo(TDB_CONTEXT *stdb, TDB_DATA kbuf, TDB_DATA dbuf, v
|
|||||||
/********************************************************************
|
/********************************************************************
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
int list_sessions(struct sessionid **session_list)
|
int list_sessions(TALLOC_CTX *mem_ctx, struct sessionid **session_list)
|
||||||
{
|
{
|
||||||
struct session_list sesslist;
|
struct session_list sesslist;
|
||||||
|
|
||||||
|
sesslist.mem_ctx = mem_ctx;
|
||||||
sesslist.count = 0;
|
sesslist.count = 0;
|
||||||
sesslist.sessions = NULL;
|
sesslist.sessions = NULL;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user