r22042: Try and clean up my own mess using the API Volker
[samba.git] / source3 / nmbd / nmbd_incomingdgrams.c
index 1450610e190c78f351991ea4c6ba6e50530ae086..ec8aa370ce3e19edfa67fff4240ba721e0572e3f 100644 (file)
@@ -97,18 +97,17 @@ void process_host_announce(struct subnet_record *subrec, struct packet_struct *p
 {
        struct dgram_packet *dgram = &p->packet.dgram;
        int ttl = IVAL(buf,1)/1000;
-       fstring announce_name;
+       unstring announce_name;
        uint32 servertype = IVAL(buf,23);
        fstring comment;
        struct work_record *work;
        struct server_record *servrec;
-       fstring work_name;
-       fstring source_name;
+       unstring work_name;
+       unstring source_name;
 
        START_PROFILE(host_announce);
 
        pull_ascii_fstring(comment, buf+31);
-       comment[42] = 0;
   
        pull_ascii_nstring(announce_name, sizeof(announce_name), buf+5);
        pull_ascii_nstring(source_name, sizeof(source_name), dgram->source_name.name);
@@ -144,7 +143,7 @@ void process_host_announce(struct subnet_record *subrec, struct packet_struct *p
         */
 
        if(strequal(work_name, global_myname()))
-               fstrcpy(work_name,lp_workgroup());
+               unstrcpy(work_name,lp_workgroup());
 
        /*
         * We are being very agressive here in adding a workgroup
@@ -198,12 +197,12 @@ void process_workgroup_announce(struct subnet_record *subrec, struct packet_stru
 {
        struct dgram_packet *dgram = &p->packet.dgram;
        int ttl = IVAL(buf,1)/1000;
-       fstring workgroup_announce_name;
-       fstring master_name;
+       unstring workgroup_announce_name;
+       unstring master_name;
        uint32 servertype = IVAL(buf,23);
        struct work_record *work;
-       fstring source_name;
-       fstring dest_name;
+       unstring source_name;
+       unstring dest_name;
 
        START_PROFILE(workgroup_announce);
 
@@ -255,19 +254,18 @@ void process_local_master_announce(struct subnet_record *subrec, struct packet_s
 {
        struct dgram_packet *dgram = &p->packet.dgram;
        int ttl = IVAL(buf,1)/1000;
-       fstring server_name;
+       unstring server_name;
        uint32 servertype = IVAL(buf,23);
        fstring comment;
-       fstring work_name;
+       unstring work_name;
        struct work_record *work;
        struct server_record *servrec;
-       fstring source_name;
+       unstring source_name;
 
        START_PROFILE(local_master_announce);
 
        pull_ascii_nstring(server_name,sizeof(server_name),buf+5);
        pull_ascii_fstring(comment, buf+31);
-       comment[42] = 0;
        pull_ascii_nstring(source_name, sizeof(source_name), dgram->source_name.name);
        pull_ascii_nstring(work_name, sizeof(work_name), dgram->dest_name.name);
 
@@ -369,7 +367,7 @@ done:
 void process_master_browser_announce(struct subnet_record *subrec, 
                                      struct packet_struct *p,char *buf)
 {
-       fstring local_master_name;
+       unstring local_master_name;
        struct work_record *work;
        struct browse_cache_record *browrec;
 
@@ -418,23 +416,29 @@ done:
   Process an incoming LanMan host announcement packet.
 *******************************************************************/
 
-void process_lm_host_announce(struct subnet_record *subrec, struct packet_struct *p, char *buf)
+void process_lm_host_announce(struct subnet_record *subrec, struct packet_struct *p, char *buf, int len)
 {
        struct dgram_packet *dgram = &p->packet.dgram;
        uint32 servertype = IVAL(buf,1);
        int osmajor=CVAL(buf,5);           /* major version of node software */
        int osminor=CVAL(buf,6);           /* minor version of node software */
        int ttl = SVAL(buf,7);
-       fstring announce_name;
+       unstring announce_name;
        struct work_record *work;
        struct server_record *servrec;
-       fstring work_name;
-       fstring source_name;
+       unstring work_name;
+       unstring source_name;
        fstring comment;
-       char *s = buf+9;
+       char *s = get_safe_str_ptr(buf,len,buf,9);
 
        START_PROFILE(lm_host_announce);
-       s = skip_string(s,1);
+       if (!s) {
+               goto done;
+       }
+       s = skip_string(buf,len,s,1);
+       if (!s) {
+               goto done;
+       }
        pull_ascii(comment, s, sizeof(fstring), 43, STR_TERMINATE);
 
        pull_ascii_nstring(announce_name,sizeof(announce_name),buf+9);
@@ -479,7 +483,7 @@ originate from OS/2 Warp client. Ignoring packet.\n"));
         */
 
        if(strequal(work_name, global_myname()))
-               fstrcpy(work_name,lp_workgroup());
+               unstrcpy(work_name,lp_workgroup());
 
        /*
         * We are being very agressive here in adding a workgroup
@@ -541,11 +545,11 @@ static void send_backup_list_response(struct subnet_record *subrec,
        char outbuf[1024];
        char *p, *countptr;
        unsigned int count = 0;
-       fstring send_to_namestr;
+       unstring send_to_namestr;
 #if 0
   struct server_record *servrec;
 #endif
-       fstring myname;
+       unstring myname;
 
        memset(outbuf,'\0',sizeof(outbuf));
 
@@ -565,12 +569,12 @@ static void send_backup_list_response(struct subnet_record *subrec,
   
        /* We always return at least one name - our own. */
        count = 1;
-       fstrcpy(myname, global_myname());
+       unstrcpy(myname, global_myname());
        strupper_m(myname);
        myname[15]='\0';
        push_pstring_base(p, myname, outbuf);
 
-       p = skip_string(p,1);
+       p = skip_string(outbuf,sizeof(outbuf),p,1);
 
        /* Look for backup browsers in this workgroup. */
 
@@ -606,7 +610,7 @@ static void send_backup_list_response(struct subnet_record *subrec,
     DEBUG(5,("send_backup_list_response: Adding server %s number %d\n",
               p, count));
 
-    p = skip_string(p,1);
+    p = skip_string(outbuf,sizeof(outbuf),p,1);
   }
 #endif
 
@@ -642,7 +646,7 @@ void process_get_backup_list_request(struct subnet_record *subrec,
        unsigned char max_number_requested = CVAL(buf,0);
        uint32 token = IVAL(buf,1); /* Sender's key index for the workgroup. */
        int name_type = dgram->dest_name.name_type;
-       fstring workgroup_name;
+       unstring workgroup_name;
        struct subnet_record *search_subrec = subrec;
 
        START_PROFILE(get_backup_list);
@@ -774,7 +778,7 @@ void process_announce_request(struct subnet_record *subrec, struct packet_struct
 {
        struct dgram_packet *dgram = &p->packet.dgram;
        struct work_record *work;
-       fstring workgroup_name;
+       unstring workgroup_name;
  
        START_PROFILE(announce_request);
 
@@ -799,7 +803,7 @@ void process_announce_request(struct subnet_record *subrec, struct packet_struct
        work->needannounce = True;
 done:
 
-       END_PROFILE(lm_host_announce);
+       END_PROFILE(announce_request);
 }
 
 /*******************************************************************
@@ -811,10 +815,10 @@ done:
   through the "lm announce" parameter in smb.conf)
 ******************************************************************/
 
-void process_lm_announce_request(struct subnet_record *subrec, struct packet_struct *p, char *buf)
+void process_lm_announce_request(struct subnet_record *subrec, struct packet_struct *p, char *buf, int len)
 {
        struct dgram_packet *dgram = &p->packet.dgram;
-       fstring workgroup_name;
+       unstring workgroup_name;
 
        START_PROFILE(lm_announce_request);
 
@@ -840,5 +844,5 @@ void process_lm_announce_request(struct subnet_record *subrec, struct packet_str
 
 done:
 
-       END_PROFILE(lm_host_announce);
+       END_PROFILE(lm_announce_request);
 }