From 1b9f7931bd826a174f14a5290057c5dcce20e19a Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 30 Apr 2015 12:05:17 -0700 Subject: [PATCH 1/2] s3: nmbd: Ensure we only set work_changed = true if we modify the record. https://bugzilla.samba.org/show_bug.cgi?id=11254 Signed-off-by: Jeremy Allison Reviewed-by: Andreas Schneider (cherry picked from commit db6572ef80e20b0e577b9e9fb5d233f8bdd20713) --- source3/nmbd/nmbd_incomingdgrams.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/source3/nmbd/nmbd_incomingdgrams.c b/source3/nmbd/nmbd_incomingdgrams.c index 153a86d..2dc684e 100644 --- a/source3/nmbd/nmbd_incomingdgrams.c +++ b/source3/nmbd/nmbd_incomingdgrams.c @@ -336,12 +336,25 @@ a local master browser for workgroup %s and we think we are master. Forcing elec ttl, comment); } else { /* Update the record. */ - servrec->serv.type = servertype|SV_TYPE_LOCAL_LIST_ONLY; + if (servrec->serv.type != + (servertype|SV_TYPE_LOCAL_LIST_ONLY)) { + servrec->serv.type = + servertype|SV_TYPE_LOCAL_LIST_ONLY; + subrec->work_changed = true; + } + if (!strequal(servrec->serv.comment,comment)) { + strlcpy(servrec->serv.comment, + comment, + sizeof(servrec->serv.comment)); + subrec->work_changed = true; + } update_server_ttl(servrec, ttl); - strlcpy(servrec->serv.comment,comment,sizeof(servrec->serv.comment)); } - - set_workgroup_local_master_browser_name( work, server_name ); + + if (!strequal(work->local_master_browser_name, server_name)) { + set_workgroup_local_master_browser_name( work, server_name ); + subrec->work_changed = true; + } } else { /* * This server is announcing it is going down. Remove it from the @@ -353,7 +366,6 @@ a local master browser for workgroup %s and we think we are master. Forcing elec } } - subrec->work_changed = True; done: END_PROFILE(local_master_announce); -- 2.2.0.rc0.207.ga3a616c From d91d267d7ab55fd7fc96886c67917c74978dfdfd Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 1 May 2015 09:56:59 -0700 Subject: [PATCH 2/2] s3: nmbd: Don't set work_changed = True inside update_server_ttl(). This is taken care of inside expire_servers() when it calls remove_server_from_workgroup(). Ensure the only functions in nmbd_serverlistdb.c that set subnet->work_changed are: remove_all_servers() add_server_to_workgroup() remove_server_from_workgroup() Fix inspired by a change from Volker. https://bugzilla.samba.org/show_bug.cgi?id=11254 Signed-off-by: Jeremy Allison Reviewed-by: Andreas Schneider (cherry picked from commit c3c820a661c092de31d56c16c8cd1ec57999d2f7) --- source3/nmbd/nmbd_serverlistdb.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/source3/nmbd/nmbd_serverlistdb.c b/source3/nmbd/nmbd_serverlistdb.c index f697f05..70a71ae 100644 --- a/source3/nmbd/nmbd_serverlistdb.c +++ b/source3/nmbd/nmbd_serverlistdb.c @@ -133,8 +133,6 @@ workgroup %s. This is a bug.\n", name, work->work_group)); DEBUG(3,("create_server_on_workgroup: Created server entry %s of type %x (%s) on \ workgroup %s.\n", name,servertype,comment, work->work_group)); - work->subnet->work_changed = True; - return(servrec); } @@ -151,8 +149,6 @@ void update_server_ttl(struct server_record *servrec, int ttl) servrec->death_time = PERMANENT_TTL; else servrec->death_time = (ttl != PERMANENT_TTL) ? time(NULL)+(ttl*3) : PERMANENT_TTL; - - servrec->subnet->work_changed = True; } /******************************************************************* @@ -172,7 +168,6 @@ void expire_servers(struct work_record *work, time_t t) if ((servrec->death_time != PERMANENT_TTL) && ((t == -1) || (servrec->death_time < t))) { DEBUG(3,("expire_old_servers: Removing timed out server %s\n",servrec->serv.name)); remove_server_from_workgroup(work, servrec); - work->subnet->work_changed = True; } } } -- 2.2.0.rc0.207.ga3a616c