summaryrefslogtreecommitdiff
path: root/source3/nmbd/nmbd_workgroupdb.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2003-08-28 18:12:59 +0000
committerJeremy Allison <jra@samba.org>2003-08-28 18:12:59 +0000
commit6872f392f1a8cd667aecc8df0b15da66f58c9407 (patch)
tree64adecb7953a5031dbe0fa6a90e840f0c13aac1e /source3/nmbd/nmbd_workgroupdb.c
parent76bcb93c66395f6d3e7bd960489094fcafa9fa89 (diff)
downloadsamba-6872f392f1a8cd667aecc8df0b15da66f58c9407.tar.gz
samba-6872f392f1a8cd667aecc8df0b15da66f58c9407.tar.bz2
samba-6872f392f1a8cd667aecc8df0b15da66f58c9407.zip
Fixed off-by-one bugs in workgroup name comparisons. Complain when a
workgroup name is >15 characters. Jeremy. (This used to be commit 35a0b3c035d50474eda97b015676885722737a95)
Diffstat (limited to 'source3/nmbd/nmbd_workgroupdb.c')
-rw-r--r--source3/nmbd/nmbd_workgroupdb.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/source3/nmbd/nmbd_workgroupdb.c b/source3/nmbd/nmbd_workgroupdb.c
index c957b517cf..b9fab4b278 100644
--- a/source3/nmbd/nmbd_workgroupdb.c
+++ b/source3/nmbd/nmbd_workgroupdb.c
@@ -56,7 +56,14 @@ static struct work_record *create_workgroup(const char *name, int ttl)
}
memset((char *)work, '\0', sizeof(*work));
- nstrcpy(work->work_group,name);
+ if (strlen(name)+1 > sizeof(nstring)) {
+ memcpy(work->work_group,name,sizeof(nstring)-1);
+ work->work_group[sizeof(nstring)-1] = '\0';
+ DEBUG(0,("create_workgroup: workgroup name %s is too long. Truncating to %s\n",
+ name, work->work_group ));
+ } else {
+ nstrcpy(work->work_group,name);
+ }
work->serverlist = NULL;
work->RunningElection = False;
@@ -76,7 +83,7 @@ static struct work_record *create_workgroup(const char *name, int ttl)
for (subrec = FIRST_SUBNET; subrec && (t == -1); subrec = NEXT_SUBNET_INCLUDING_UNICAST(subrec)) {
struct work_record *w;
for (w = subrec->workgrouplist; w && t == -1; w = w->next) {
- if (strnequal(w->work_group, work->work_group, sizeof(nstring)))
+ if (strnequal(w->work_group, work->work_group, sizeof(nstring)-1))
t = w->token;
}
}
@@ -150,7 +157,7 @@ struct work_record *find_workgroup_on_subnet(struct subnet_record *subrec,
name, subrec->subnet_name));
for (ret = subrec->workgrouplist; ret; ret = ret->next) {
- if (strnequal(ret->work_group,name,sizeof(nstring))) {
+ if (strnequal(ret->work_group,name,sizeof(nstring)-1)) {
DEBUGADD(4, ("found.\n"));
return(ret);
}
@@ -211,7 +218,7 @@ void initiate_myworkgroup_startup(struct subnet_record *subrec, struct work_reco
{
int i;
- if(!strnequal(lp_workgroup(), work->work_group,sizeof(nstring)))
+ if(!strnequal(lp_workgroup(), work->work_group,sizeof(nstring)-1))
return;
/* If this is a broadcast subnet then start elections on it if we are so configured. */