summaryrefslogtreecommitdiffstats
path: root/source/nmbd
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2006-01-23 14:02:17 +0000
committerGerald Carter <jerry@samba.org>2006-01-23 14:02:17 +0000
commite6d82c2061d217b7ef4403a98cd7ded0d6125a2c (patch)
treebb3aef68e8f00d7c6c7ffa6b0cf07fd464067d5b /source/nmbd
parent51763121149c4c0031804f338f17b2b066f17dee (diff)
downloadsamba-e6d82c2061d217b7ef4403a98cd7ded0d6125a2c.tar.gz
samba-e6d82c2061d217b7ef4403a98cd7ded0d6125a2c.tar.xz
samba-e6d82c2061d217b7ef4403a98cd7ded0d6125a2c.zip
r13081: correct fix for the segv in nmbd caused by a double free on namerec.
Diffstat (limited to 'source/nmbd')
-rw-r--r--source/nmbd/nmbd_namelistdb.c11
-rw-r--r--source/nmbd/nmbd_winsserver.c5
2 files changed, 8 insertions, 8 deletions
diff --git a/source/nmbd/nmbd_namelistdb.c b/source/nmbd/nmbd_namelistdb.c
index baaf5dbd548..60023a7ed5e 100644
--- a/source/nmbd/nmbd_namelistdb.c
+++ b/source/nmbd/nmbd_namelistdb.c
@@ -80,14 +80,13 @@ static void upcase_name( struct nmb_name *target, const struct nmb_name *source
void remove_name_from_namelist(struct subnet_record *subrec,
struct name_record *namerec )
{
- if (subrec == wins_server_subnet) {
+ if (subrec == wins_server_subnet)
remove_name_from_wins_namelist(namerec);
- return;
- }
-
- subrec->namelist_changed = True;
+ else {
+ subrec->namelist_changed = True;
+ DLIST_REMOVE(subrec->namelist, namerec);
+ }
- DLIST_REMOVE(subrec->namelist, namerec);
SAFE_FREE(namerec->data.ip);
ZERO_STRUCTP(namerec);
SAFE_FREE(namerec);
diff --git a/source/nmbd/nmbd_winsserver.c b/source/nmbd/nmbd_winsserver.c
index 5c234bf8dcc..9983efe5ebb 100644
--- a/source/nmbd/nmbd_winsserver.c
+++ b/source/nmbd/nmbd_winsserver.c
@@ -290,8 +290,9 @@ BOOL remove_name_from_wins_namelist(struct name_record *namerec)
DLIST_REMOVE(wins_server_subnet->namelist, namerec);
SAFE_FREE(namerec->data.ip);
- ZERO_STRUCTP(namerec);
- SAFE_FREE(namerec);
+
+ /* namerec must be freed by the caller */
+
return (ret == 0) ? True : False;
}