Check error returns from strupper_m() (in all reasonable places).
[samba.git] / source3 / nmbd / nmbd_browsesync.c
index b261907b92a9562e6df6a38d6e16de1410d265ad..b56baedf270dcd101cc751cf486409c7c0224a1f 100644 (file)
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
 */
 
 #include "includes.h"
+#include "nmbd/nmbd.h"
 
 /* This is our local master browser list database. */
 extern struct browse_cache_record *lmb_browserlist;
@@ -99,12 +99,12 @@ As a local master browser, send an announce packet to the domain master browser.
 
 static void announce_local_master_browser_to_domain_master_browser( struct work_record *work)
 {
-       pstring outbuf;
+       char outbuf[1024];
        unstring myname;
        unstring dmb_name;
        char *p;
 
-       if(ismyip(work->dmb_addr)) {
+       if(ismyip_v4(work->dmb_addr)) {
                if( DEBUGLVL( 2 ) ) {
                        dbgtext( "announce_local_master_browser_to_domain_master_browser:\n" );
                        dbgtext( "We are both a domain and a local master browser for " );
@@ -119,11 +119,14 @@ static void announce_local_master_browser_to_domain_master_browser( struct work_
        SCVAL(p,0,ANN_MasterAnnouncement);
        p++;
 
-       unstrcpy(myname, global_myname());
-       strupper_m(myname);
+       unstrcpy(myname, lp_netbios_name());
+       if (!strupper_m(myname)) {
+               DEBUG(2,("strupper_m %s failed\n", myname));
+               return;
+       }
        myname[15]='\0';
        /* The call below does CH_UNIX -> CH_DOS conversion. JRA */
-       push_pstring_base(p, myname, outbuf);
+       push_ascii(p, myname, sizeof(outbuf)-PTR_DIFF(p,outbuf)-1, STR_TERMINATE);
 
        p = skip_string(outbuf,sizeof(outbuf),p);
 
@@ -137,7 +140,7 @@ static void announce_local_master_browser_to_domain_master_browser( struct work_
        /* Target name for send_mailslot must be in UNIX charset. */
        pull_ascii_nstring(dmb_name, sizeof(dmb_name), work->dmb_name.name);
        send_mailslot(True, BROWSE_MAILSLOT, outbuf,PTR_DIFF(p,outbuf),
-               global_myname(), 0x0, dmb_name, 0x0, 
+               lp_netbios_name(), 0x0, dmb_name, 0x0,
                work->dmb_addr, FIRST_SUBNET->myip, DGRAM_PORT);
 }
 
@@ -292,7 +295,7 @@ static void find_domain_master_name_query_success(struct subnet_record *subrec,
 
   /* First check if we already have a dmb for this workgroup. */
 
-       if(!is_zero_ip(work->dmb_addr) && ip_equal(work->dmb_addr, answer_ip)) {
+       if(!is_zero_ip_v4(work->dmb_addr) && ip_equal_v4(work->dmb_addr, answer_ip)) {
                /* Do the local master browser announcement to the domain
                        master browser name and IP. */
                announce_local_master_browser_to_domain_master_browser( work );
@@ -301,7 +304,7 @@ static void find_domain_master_name_query_success(struct subnet_record *subrec,
                sync_with_dmb(work);
                return;
        } else {
-               zero_ip(&work->dmb_addr);
+               zero_ip_v4(&work->dmb_addr);
        }
 
        /* Now initiate the node status request. */
@@ -330,7 +333,7 @@ static void find_domain_master_name_query_success(struct subnet_record *subrec,
        userdata->copy_fn = NULL;
        userdata->free_fn = NULL;
        userdata->userdata_len = strlen(work->work_group)+1;
-       overmalloc_safe_strcpy(userdata->data, work->work_group, size - sizeof(*userdata) - 1);
+       strlcpy(userdata->data, work->work_group, size - sizeof(*userdata));
 
        node_status( subrec, &nmbname, answer_ip, 
                domain_master_node_status_success,
@@ -435,7 +438,7 @@ static void get_domain_master_name_node_status_success(struct subnet_record *sub
                        if(!(nb_flags & NB_GROUP) && (name_type == 0x00) && 
                                        server_name[0] == 0) {
                                /* this is almost certainly the server netbios name */
-                               unstrcpy(server_name, qname);
+                               strlcpy(server_name, qname, sizeof(server_name));
                                continue;
                        }
 
@@ -461,7 +464,9 @@ static void get_domain_master_name_node_status_success(struct subnet_record *sub
                                                return;
 
                                        /* remember who the master is */
-                                       unstrcpy(work->local_master_browser_name, server_name);
+                                       strlcpy(work->local_master_browser_name,
+                                               server_name,
+                                               sizeof(work->local_master_browser_name));
                                        make_nmb_name(&nmbname, server_name, 0x20);
                                        work->dmb_name = nmbname;
                                        work->dmb_addr = from_ip;
@@ -469,7 +474,7 @@ static void get_domain_master_name_node_status_success(struct subnet_record *sub
                                break;
                        }
                }
-       } else if( DEBUGLVL( 0 ) ) {
+       } else if( DEBUGLVL( 1 ) ) {
                dbgtext( "get_domain_master_name_node_status_success:\n" );
                dbgtext( "Failed to find a WORKGROUP<0x1b> name in reply from IP " );
                dbgtext( "%s.\n", inet_ntoa(from_ip) );
@@ -483,7 +488,7 @@ static void get_domain_master_name_node_status_success(struct subnet_record *sub
 static void get_domain_master_name_node_status_fail(struct subnet_record *subrec,
                        struct response_record *rrec)
 {
-       if( DEBUGLVL( 0 ) ) {
+       if( DEBUGLVL( 2 ) ) {
                dbgtext( "get_domain_master_name_node_status_fail:\n" );
                dbgtext( "Doing a node status request to the domain master browser " );
                dbgtext( "at IP %s failed.\n", inet_ntoa(rrec->packet->ip) );
@@ -527,7 +532,7 @@ static void find_all_domain_master_names_query_success(struct subnet_record *sub
                 * Don't send node status requests to ourself.
                 */
 
-               if(ismyip( send_ip )) {
+               if(ismyip_v4( send_ip )) {
                        if( DEBUGLVL( 5 ) ) {
                                dbgtext( "find_all_domain_master_names_query_succes:\n" );
                                dbgtext( "Not sending node status to our own IP " );
@@ -645,6 +650,11 @@ void sync_all_dmbs(time_t t)
                }
        }
 
+       /* leave if we don't have to do any syncs */
+       if (count == 0) {
+               return;
+       }
+
        /* sync with a probability of 1/count */
        for (work=unicast_subnet->workgrouplist; work; work = work->next) {
                if (strcmp(lp_workgroup(), work->work_group)) {