Fixed off-by-one bugs in workgroup name comparisons. Complain when a
authorJeremy Allison <jra@samba.org>
Thu, 28 Aug 2003 18:12:59 +0000 (18:12 +0000)
committerJeremy Allison <jra@samba.org>
Thu, 28 Aug 2003 18:12:59 +0000 (18:12 +0000)
workgroup name is >15 characters.
Jeremy.
(This used to be commit 35a0b3c035d50474eda97b015676885722737a95)

source3/nmbd/nmbd_elections.c
source3/nmbd/nmbd_serverlistdb.c
source3/nmbd/nmbd_workgroupdb.c

index e341f6f7fb1ea7008fb1a082537921299f1bc0e2..fabc0eddca2120894a22a5596a6a7d8cd7a77fe0 100644 (file)
@@ -97,7 +97,7 @@ static void check_for_master_browser_fail( struct subnet_record *subrec,
                return;
        }
 
-       if (strnequal(work->work_group, lp_workgroup(), sizeof(nstring))) {
+       if (strnequal(work->work_group, lp_workgroup(), sizeof(nstring)-1)) {
 
                if (lp_local_master()) {
                        /* We have discovered that there is no local master
@@ -145,7 +145,7 @@ void check_master_browser_exists(time_t t)
                struct work_record *work;
 
                for (work = subrec->workgrouplist; work; work = work->next) {
-                       if (strnequal(work->work_group, workgroup_name, sizeof(nstring)) && !AM_LOCAL_MASTER_BROWSER(work)) {
+                       if (strnequal(work->work_group, workgroup_name, sizeof(nstring)-1) && !AM_LOCAL_MASTER_BROWSER(work)) {
                                /* Do a name query for the local master browser on this net. */
                                query_name( subrec, work->work_group, 0x1d,
                                        check_for_master_browser_success,
@@ -284,7 +284,7 @@ void process_election(struct subnet_record *subrec, struct packet_struct *p, cha
                goto done;
        }
 
-       if (!strnequal(work->work_group, lp_workgroup(), sizeof(nstring))) {
+       if (!strnequal(work->work_group, lp_workgroup(), sizeof(nstring)-1)) {
                DEBUG(3,("process_election: ignoring election request for workgroup %s on subnet %s as this \
 is not my workgroup.\n", work->work_group, subrec->subnet_name ));
                goto done;
@@ -381,7 +381,7 @@ void nmbd_message_election(int msg_type, pid_t src, void *buf, size_t len)
        for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) {
                struct work_record *work;
                for (work = subrec->workgrouplist; work; work = work->next) {
-                       if (strnequal(work->work_group, lp_workgroup(), sizeof(nstring))) {
+                       if (strnequal(work->work_group, lp_workgroup(), sizeof(nstring)-1)) {
                                work->needelection = True;
                                work->ElectionCount=0;
                                work->mst_state = lp_local_master() ? MST_POTENTIAL : MST_NONE;
index ecde45cfb9afa22163e54c1c3de4d71962d7722a..a5008f803b48f28f353d28d0bec726587d67d8af 100644 (file)
@@ -251,7 +251,7 @@ static uint32 write_this_workgroup_name( struct subnet_record *subrec,
 {
        struct subnet_record *ssub;
 
-       if(strnequal(lp_workgroup(), work->work_group, sizeof(nstring)))
+       if(strnequal(lp_workgroup(), work->work_group, sizeof(nstring)-1))
                return 0;
 
        /* This is a workgroup we have seen on a broadcast subnet. All
index c957b517cf7dec9606a5e8fb7667418dd8c1c979..b9fab4b278c12508cfc2273bc9b7b6ec5cdee5a3 100644 (file)
@@ -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. */