Modified fix for bugid #784. Based on a patch from moriyama@miraclelinux.com (MORIYAM...
authorJeremy Allison <jra@samba.org>
Sat, 13 Mar 2004 02:16:26 +0000 (02:16 +0000)
committerJeremy Allison <jra@samba.org>
Sat, 13 Mar 2004 02:16:26 +0000 (02:16 +0000)
Don't use nstrings to hold workgroup and netbios names. The problem with them is that MB netbios
and workgroup names in unix charset (particularly utf8) may be up to 3x bigger than the name
when represented in dos charset (ie. cp932). So go back to using fstrings for these but
translate into nstrings (ie. 16 byte length values) for transport on the wire.
Jeremy.

25 files changed:
source/include/nameserv.h
source/lib/charcnv.c
source/lib/util_str.c
source/libsmb/libsmbclient.c
source/libsmb/namequery.c
source/libsmb/nmblib.c
source/nmbd/asyncdns.c
source/nmbd/nmbd_become_dmb.c
source/nmbd/nmbd_become_lmb.c
source/nmbd/nmbd_browserdb.c
source/nmbd/nmbd_browsesync.c
source/nmbd/nmbd_elections.c
source/nmbd/nmbd_incomingdgrams.c
source/nmbd/nmbd_incomingrequests.c
source/nmbd/nmbd_logonnames.c
source/nmbd/nmbd_mynames.c
source/nmbd/nmbd_namelistdb.c
source/nmbd/nmbd_nameregister.c
source/nmbd/nmbd_packets.c
source/nmbd/nmbd_processlogon.c
source/nmbd/nmbd_synclists.c
source/nmbd/nmbd_winsproxy.c
source/nmbd/nmbd_winsserver.c
source/nmbd/nmbd_workgroupdb.c
source/smbd/negprot.c

index 1e867d620bc6975b52244950c206715335fb5559..5362960d62b59ca5be95b561972b81b2c004ad3a 100644 (file)
@@ -226,8 +226,8 @@ struct name_record {
 /* Browser cache for synchronising browse lists. */
 struct browse_cache_record {
        ubi_dlNode     node[1];
-       nstring        lmb_name;
-       nstring        work_group;
+       fstring        lmb_name;
+       fstring        work_group;
        struct in_addr ip;
        time_t         sync_time;
        time_t         death_time; /* The time the record must be removed. */
@@ -265,9 +265,9 @@ struct work_record {
        enum logon_state log_state;
 
        /* Work group info. */
-       nstring work_group;
+       fstring work_group;
        int     token;        /* Used when communicating with backup browsers. */
-       nstring local_master_browser_name;      /* Current local master browser. */
+       fstring local_master_browser_name;      /* Current local master browser. */
 
        /* Announce info. */
        time_t lastannounce_time;
index 7227a946bc647dd5e168baa26ccca73093291b5b..d38bfdb5349794c7dbec8e5e7edeaa2285e440ca 100644 (file)
@@ -839,7 +839,7 @@ size_t push_ascii_nstring(void *dest, const char *src)
        }
 
        dest_len = 0;
-       for (i = 0; i < buffer_len; i++) {
+       for (i = 0; buffer[i] != 0 && (i < buffer_len); i++) {
                unsigned char mb[10];
                /* Convert one smb_ucs2_t character at a time. */
                size_t mb_len = convert_string(CH_UCS2, CH_DOS, buffer+i, sizeof(smb_ucs2_t), mb, sizeof(mb), False);
@@ -847,6 +847,7 @@ size_t push_ascii_nstring(void *dest, const char *src)
                        memcpy((char *)dest + dest_len, mb, mb_len);
                        dest_len += mb_len;
                } else {
+                       errno = E2BIG;
                        break;
                }
        }
@@ -912,9 +913,11 @@ size_t pull_ascii_fstring(char *dest, const void *src)
        return pull_ascii(dest, src, sizeof(fstring), -1, STR_TERMINATE);
 }
 
-size_t pull_ascii_nstring(char *dest, const void *src)
+/* When pulling an nstring it can expand into a larger size (dos cp -> utf8). Cope with this. */
+
+size_t pull_ascii_nstring(char *dest, size_t dest_len, const void *src)
 {
-       return pull_ascii(dest, src, sizeof(nstring), sizeof(nstring), STR_TERMINATE);
+       return pull_ascii(dest, src, dest_len, sizeof(nstring), STR_TERMINATE);
 }
 
 /**
index b8cf052862f3e07dd55992ad848f688f50903372..2be8b7eb64cce9f5889bd282fb6b45ffb9d0236c 100644 (file)
@@ -1307,7 +1307,6 @@ char *strstr_m(const char *src, const char *findstr)
        char *retp;
 
        size_t findstr_len = 0;
-       size_t find_w_len;
 
        /* for correctness */
        if (!findstr[0]) {
index 37e794478d3e0f78ec07133babc6ff8d94e86137..35e8a9786b134b64e78ef1e56227768063c649f0 100644 (file)
@@ -1787,7 +1787,7 @@ static SMBCFILE *smbc_opendir_ctx(SMBCCTX *context, const char *fname)
                        if (!is_ipaddress(server) &&  /* Not an IP addr so check next */
                            (resolve_name(server, &rem_ip, 0x1d) ||   /* Found LMB */
                                     resolve_name(server, &rem_ip, 0x1b) )) { /* Found DMB */
-                               pstring buserver;
+                               fstring buserver;
 
                                dir->dir_type = SMBC_SERVER;
 
index b6d1f8bda223eaebaed54fc0567e7bcb908e627e..b9bc4e11664da2b06f8eb8f7a6b6fe996a0cbf4a 100644 (file)
@@ -163,7 +163,7 @@ struct node_status *node_status_query(int fd,struct nmb_name *name,
  a servers name given its IP. Return the matched name in *name.
 **************************************************************************/
 
-BOOL name_status_find(const char *q_name, int q_type, int type, struct in_addr to_ip, char *name)
+BOOL name_status_find(const char *q_name, int q_type, int type, struct in_addr to_ip, fstring name)
 {
        struct node_status *status = NULL;
        struct nmb_name nname;
@@ -202,7 +202,7 @@ BOOL name_status_find(const char *q_name, int q_type, int type, struct in_addr t
        if (i == count)
                goto done;
 
-       pull_ascii_nstring(name, status[i].name);
+       pull_ascii_nstring(name, sizeof(fstring), status[i].name);
 
        /* Store the result in the cache. */
        /* but don't store an entry for 0x1c names here.  Here we have 
index cbe495cd959c5e74aade0601229afed3178740a3..bc2cca0e0e30c43282f039ba9a6093b3deecd89f 100644 (file)
@@ -285,7 +285,7 @@ static void put_name(char *dest, const char *name, int pad, unsigned int name_ty
 static int put_nmb_name(char *buf,int offset,struct nmb_name *name)
 {
        int ret,m;
-       fstring buf1;
+       nstring buf1;
        char *p;
 
        if (strcmp(name->name,"*") == 0) {
@@ -1230,17 +1230,24 @@ static int name_interpret(char *in, fstring name)
 int name_mangle( char *In, char *Out, char name_type )
 {
        int   i;
-       int   c;
        int   len;
-       char  buf[20];
+       nstring buf;
        char *p = Out;
 
        /* Safely copy the input string, In, into buf[]. */
-       memset( buf, 0, 20 );
-       if (strcmp(In,"*") == 0) {
-               buf[0] = '*';
-       } else {
-               slprintf( buf, sizeof(buf) - 1, "%-15.15s%c", In, name_type );
+       if (strcmp(In,"*") == 0)
+               put_name(buf, "*", '\0', 0x00);
+       else {
+               /* We use an fstring here as mb dos names can expend x3 when
+                  going to utf8. */
+               fstring buf_unix;
+               nstring buf_dos;
+
+               pull_ascii_fstring(buf_unix, In);
+               strupper_m(buf_unix);
+
+               push_ascii_nstring(buf_dos, buf_unix);
+               put_name(buf, buf_dos, ' ', name_type);
        }
 
        /* Place the length of the first field into the output buffer. */
@@ -1249,9 +1256,8 @@ int name_mangle( char *In, char *Out, char name_type )
 
        /* Now convert the name to the rfc1001/1002 format. */
        for( i = 0; i < MAX_NETBIOSNAME_LEN; i++ ) {
-               c = toupper( buf[i] );
-               p[i*2]     = ( (c >> 4) & 0x000F ) + 'A';
-               p[(i*2)+1] = (c & 0x000F) + 'A';
+               p[i*2]     = ( (buf[i] >> 4) & 0x000F ) + 'A';
+               p[(i*2)+1] = (buf[i] & 0x000F) + 'A';
        }
        p += 32;
        p[0] = '\0';
index 6d5d487b112f5826ed55d8229e14ce3bfa4d6286..dafbff7af20da923bc93d148519dbb921c351d47 100644 (file)
@@ -27,9 +27,9 @@
 static struct name_record *add_dns_result(struct nmb_name *question, struct in_addr addr)
 {
        int name_type = question->name_type;
-       nstring qname;
+       fstring qname;
 
-       pull_ascii_nstring(qname, question->name);
+       pull_ascii_nstring(qname, sizeof(qname), question->name);
   
        if (!addr.s_addr) {
                /* add the fail to WINS cache of names. give it 1 hour in the cache */
index 46d37fbb817801bc59887c4ca8ebf94f6020fd96..c9b0a2258071a83af38b9843586c98bdab495446 100644 (file)
@@ -37,11 +37,11 @@ static void become_domain_master_fail(struct subnet_record *subrec,
                                       struct response_record *rrec,
                                       struct nmb_name *fail_name)
 {
-       nstring failname;
+       fstring failname;
        struct work_record *work;
        struct server_record *servrec;
 
-       pull_ascii_nstring(failname, fail_name->name);
+       pull_ascii_nstring(failname, sizeof(failname), fail_name->name);
        work = find_workgroup_on_subnet(subrec, failname);
        if(!work) {
                DEBUG(0,("become_domain_master_fail: Error - cannot find \
@@ -80,11 +80,11 @@ static void become_domain_master_stage2(struct subnet_record *subrec,
                                         uint16 nb_flags,
                                         int ttl, struct in_addr registered_ip)
 {
-       nstring regname;
+       fstring regname;
        struct work_record *work;
        struct server_record *servrec;
 
-       pull_ascii_nstring(regname, registered_name->name);
+       pull_ascii_nstring(regname, sizeof(regname), registered_name->name);
        work = find_workgroup_on_subnet( subrec, regname);
 
        if(!work) {
@@ -200,8 +200,8 @@ static void become_domain_master_query_success(struct subnet_record *subrec,
                         struct nmb_name *nmbname, struct in_addr ip, 
                         struct res_rec *rrec)
 {
-       nstring name;
-       pull_ascii_nstring(name, nmbname->name);
+       fstring name;
+       pull_ascii_nstring(name, sizeof(name), nmbname->name);
 
        /* If the given ip is not ours, then we can't become a domain
                controler as the name is already registered.
@@ -241,7 +241,7 @@ static void become_domain_master_query_fail(struct subnet_record *subrec,
                                     struct response_record *rrec,
                                     struct nmb_name *question_name, int fail_code)
 {
-       nstring name;
+       fstring name;
 
        /* If the query was unicast, and the error is not NAM_ERR (name didn't exist),
                then this is a failure. Otherwise, not finding the name is what we want. */
@@ -254,7 +254,7 @@ querying WINS server for name %s.\n",
        }
 
        /* Otherwise - not having the name allows us to register it. */
-       pull_ascii_nstring(name, question_name->name);
+       pull_ascii_nstring(name, sizeof(name), question_name->name);
        become_domain_master_stage1(subrec, name);
 }
 
index 2370c7ba3668ff30f84e1a7076fe652717dba9f0..8d66320f3eb762f6fa8b72cefb07a32261eadd49 100644 (file)
@@ -33,11 +33,11 @@ extern uint16 samba_nb_type; /* Samba's NetBIOS name type. */
 void insert_permanent_name_into_unicast( struct subnet_record *subrec, 
                                                 struct nmb_name *nmbname, uint16 nb_type )
 {
-       nstring name;
+       fstring name;
        struct name_record *namerec;
 
        if((namerec = find_name_on_subnet(unicast_subnet, nmbname, FIND_SELF_NAME)) == NULL) {
-               pull_ascii_nstring(name, nmbname->name);
+               pull_ascii_nstring(name, sizeof(name), nmbname->name);
                /* The name needs to be created on the unicast subnet. */
                (void)add_name_to_subnet( unicast_subnet, name,
                                nmbname->name_type, nb_type,
@@ -135,7 +135,7 @@ static void unbecome_local_master_success(struct subnet_record *subrec,
                              struct in_addr released_ip)
 { 
        BOOL force_new_election = False;
-       nstring relname;
+       fstring relname;
 
        memcpy((char *)&force_new_election, userdata->data, sizeof(BOOL));
 
@@ -143,7 +143,7 @@ static void unbecome_local_master_success(struct subnet_record *subrec,
                nmb_namestr(released_name)));
 
        /* Now reset the workgroup and server state. */
-       pull_ascii_nstring(relname, released_name->name);
+       pull_ascii_nstring(relname, sizeof(relname), released_name->name);
        reset_workgroup_state( subrec, relname, force_new_election );
 
        if( DEBUGLVL( 0 ) ) {
@@ -166,7 +166,7 @@ static void unbecome_local_master_fail(struct subnet_record *subrec, struct resp
        struct name_record *namerec;
        struct userdata_struct *userdata = rrec->userdata;
        BOOL force_new_election = False;
-       nstring failname;
+       fstring failname;
 
        memcpy((char *)&force_new_election, userdata->data, sizeof(BOOL));
 
@@ -179,7 +179,7 @@ Removing from namelist anyway.\n", nmb_namestr(fail_name)));
                remove_name_from_namelist(subrec, namerec);
 
        /* Now reset the workgroup and server state. */
-       pull_ascii_nstring(failname, fail_name->name);
+       pull_ascii_nstring(failname, sizeof(failname), fail_name->name);
        reset_workgroup_state( subrec, failname, force_new_election );
 
        if( DEBUGLVL( 0 ) ) {
@@ -330,9 +330,9 @@ static void become_local_master_stage2(struct subnet_record *subrec,
        struct server_record *sl;
        struct work_record *work;
        struct server_record *servrec;
-       nstring regname;
+       fstring regname;
 
-       pull_ascii_nstring(regname, registered_name->name);
+       pull_ascii_nstring(regname, sizeof(regname), registered_name->name);
        work = find_workgroup_on_subnet( subrec, regname);
 
        if(!work) {
@@ -410,13 +410,13 @@ static void become_local_master_fail2(struct subnet_record *subrec,
                                       struct response_record *rrec,
                                       struct nmb_name *fail_name)
 {
-       nstring failname;
+       fstring failname;
        struct work_record *work;
 
        DEBUG(0,("become_local_master_fail2: failed to register name %s on subnet %s. \
 Failed to become a local master browser.\n", nmb_namestr(fail_name), subrec->subnet_name));
 
-       pull_ascii_nstring(failname, fail_name->name);
+       pull_ascii_nstring(failname, sizeof(failname), fail_name->name);
        work = find_workgroup_on_subnet( subrec, failname);
 
        if(!work) {
@@ -590,5 +590,5 @@ local_master_browser_name for workgroup %s to workgroup name.\n",
   }
 #endif
 
-       nstrcpy(work->local_master_browser_name, newname);
+       fstrcpy(work->local_master_browser_name, newname);
 }
index 443edf599d058eaa5d5486435e51aeb5a7ce2bab..d78125915698b746af7db63c10d6b2035870cac5 100644 (file)
@@ -106,8 +106,8 @@ struct browse_cache_record *create_browser_in_lmb_cache( const char *work_name,
        /* Allow the new lmb to miss an announce period before we remove it. */
        browc->death_time = now + ( (CHECK_TIME_MST_ANNOUNCE + 2) * 60 );
 
-       nstrcpy(  browc->lmb_name, browser_name);
-       nstrcpy(  browc->work_group, work_name);
+       fstrcpy( browc->lmb_name, browser_name);
+       fstrcpy( browc->work_group, work_name);
        strupper_m( browc->lmb_name );
        strupper_m( browc->work_group );
   
index 6cde88651f9cbd3f9877bf02242b674f08d0a79f..454c34976766c8f9ed8263acff83155245ecf24b 100644 (file)
@@ -146,7 +146,7 @@ As a local master browser, do a sync with a domain master browser.
 
 static void sync_with_dmb(struct work_record *work)
 {
-       nstring dmb_name;
+       fstring dmb_name;
 
        if( DEBUGLVL( 2 ) ) {
                dbgtext( "sync_with_dmb:\n" );
@@ -156,7 +156,7 @@ static void sync_with_dmb(struct work_record *work)
                dbgtext( "for workgroup %s\n", work->work_group );
        }
 
-       pull_ascii_nstring(dmb_name, work->dmb_name.name);
+       pull_ascii_nstring(dmb_name, sizeof(fstring), work->dmb_name.name);
        sync_browse_lists(work, dmb_name, work->dmb_name.name_type, 
                work->dmb_addr, False, True);
 }
@@ -197,11 +197,11 @@ static void domain_master_node_status_success(struct subnet_record *subrec,
                p += 1;
 
                while (numnames--) {
-                       nstring qname;
+                       fstring qname;
                        uint16 nb_flags;
                        int name_type;
 
-                       pull_ascii_nstring(qname, p);
+                       pull_ascii_nstring(qname, sizeof(qname), p);
                        name_type = CVAL(p,15);
                        nb_flags = get_nb_flags(&p[16]);
                        trim_char(qname,'\0',' ');
@@ -278,9 +278,9 @@ static void find_domain_master_name_query_success(struct subnet_record *subrec,
        struct nmb_name nmbname;
        struct userdata_struct *userdata;
        size_t size = sizeof(struct userdata_struct) + sizeof(fstring)+1;
-       nstring qname;
+       fstring qname;
 
-       pull_ascii_nstring(qname, q_name->name);
+       pull_ascii_nstring(qname, sizeof(qname), q_name->name);
        if( !(work = find_workgroup_on_subnet(subrec, qname)) ) {
                if( DEBUGLVL( 0 ) ) {
                        dbgtext( "find_domain_master_name_query_success:\n" );
@@ -420,11 +420,11 @@ static void get_domain_master_name_node_status_success(struct subnet_record *sub
                p += 1;
 
                while (numnames--) {
-                       nstring qname;
+                       fstring qname;
                        uint16 nb_flags;
                        int name_type;
 
-                       pull_ascii_nstring(qname, p);
+                       pull_ascii_nstring(qname, sizeof(qname), p);
                        name_type = CVAL(p,15);
                        nb_flags = get_nb_flags(&p[16]);
                        trim_char(qname,'\0',' ');
@@ -460,7 +460,7 @@ static void get_domain_master_name_node_status_success(struct subnet_record *sub
                                                return;
 
                                        /* remember who the master is */
-                                       nstrcpy(work->local_master_browser_name, server_name);
+                                       fstrcpy(work->local_master_browser_name, server_name);
                                        make_nmb_name(&nmbname, server_name, 0x20);
                                        work->dmb_name = nmbname;
                                        work->dmb_addr = from_ip;
@@ -647,7 +647,7 @@ void sync_all_dmbs(time_t t)
        /* sync with a probability of 1/count */
        for (work=unicast_subnet->workgrouplist; work; work = work->next) {
                if (strncmp(lp_workgroup(), work->work_group, sizeof(nstring))) {
-                       nstring dmb_name;
+                       fstring dmb_name;
 
                        if (((unsigned)sys_random()) % count != 0)
                                continue;
@@ -662,7 +662,7 @@ void sync_all_dmbs(time_t t)
                                              0x20);
                        }
 
-                       pull_ascii_nstring(dmb_name, work->dmb_name.name);
+                       pull_ascii_nstring(dmb_name, sizeof(dmb_name), work->dmb_name.name);
 
                        DEBUG(3,("Initiating DMB<->DMB sync with %s(%s)\n",
                                 dmb_name, inet_ntoa(work->dmb_addr)));
index 19b00f1f4d23177db114bdf9e55f8de33994c1c5..882c26ce8083b5277dee77862df77fa36598ac44 100644 (file)
@@ -70,8 +70,8 @@ static void check_for_master_browser_success(struct subnet_record *subrec,
                                  struct nmb_name *answer_name,
                                  struct in_addr answer_ip, struct res_rec *rrec)
 {
-       nstring aname;
-       pull_ascii_nstring(aname, answer_name->name);
+       fstring aname;
+       pull_ascii_nstring(aname, sizeof(aname), answer_name->name);
        DEBUG(3,("check_for_master_browser_success: Local master browser for workgroup %s exists at \
 IP %s (just checking).\n", aname, inet_ntoa(answer_ip) ));
 }
@@ -85,10 +85,10 @@ static void check_for_master_browser_fail( struct subnet_record *subrec,
                                            struct nmb_name *question_name,
                                            int fail_code)
 {
-       nstring workgroup_name;
+       fstring workgroup_name;
        struct work_record *work;
 
-       pull_ascii_nstring(workgroup_name,question_name->name);
+       pull_ascii_nstring(workgroup_name,sizeof(workgroup_name),question_name->name);
 
        work = find_workgroup_on_subnet(subrec, workgroup_name);
        if(work == NULL) {
@@ -263,12 +263,12 @@ void process_election(struct subnet_record *subrec, struct packet_struct *p, cha
        int version = CVAL(buf,0);
        uint32 criterion = IVAL(buf,1);
        int timeup = IVAL(buf,5)/1000;
-       nstring server_name;
+       fstring server_name;
        struct work_record *work;
-       nstring workgroup_name;
+       fstring workgroup_name;
 
-       pull_ascii_nstring(server_name, buf+13);
-       pull_ascii_nstring(workgroup_name, dgram->dest_name.name);
+       pull_ascii_nstring(server_name, sizeof(server_name), buf+13);
+       pull_ascii_nstring(workgroup_name, sizeof(workgroup_name), dgram->dest_name.name);
 
        START_PROFILE(election);
        server_name[15] = 0;  
index f646e397162a424c5f71ac02a24c2fc3def0771d..1450610e190c78f351991ea4c6ba6e50530ae086 100644 (file)
@@ -97,21 +97,21 @@ 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;
-       nstring announce_name;
+       fstring announce_name;
        uint32 servertype = IVAL(buf,23);
        fstring comment;
        struct work_record *work;
        struct server_record *servrec;
-       nstring work_name;
-       nstring source_name;
+       fstring work_name;
+       fstring source_name;
 
        START_PROFILE(host_announce);
 
        pull_ascii_fstring(comment, buf+31);
        comment[42] = 0;
   
-       pull_ascii_nstring(announce_name, buf+5);
-       pull_ascii_nstring(source_name, dgram->source_name.name);
+       pull_ascii_nstring(announce_name, sizeof(announce_name), buf+5);
+       pull_ascii_nstring(source_name, sizeof(source_name), dgram->source_name.name);
 
        DEBUG(3,("process_host_announce: from %s<%02x> IP %s to \
 %s for server %s.\n", source_name, source_name[15], inet_ntoa(p->ip),
@@ -133,7 +133,7 @@ void process_host_announce(struct subnet_record *subrec, struct packet_struct *p
        }
 
        /* For a host announce the workgroup name is the destination name. */
-       pull_ascii_nstring(work_name, dgram->dest_name.name);
+       pull_ascii_nstring(work_name, sizeof(work_name), dgram->dest_name.name);
 
        /*
         * Syntax servers version 5.1 send HostAnnounce packets to
@@ -144,7 +144,7 @@ void process_host_announce(struct subnet_record *subrec, struct packet_struct *p
         */
 
        if(strequal(work_name, global_myname()))
-               nstrcpy(work_name,lp_workgroup());
+               fstrcpy(work_name,lp_workgroup());
 
        /*
         * We are being very agressive here in adding a workgroup
@@ -198,19 +198,19 @@ void process_workgroup_announce(struct subnet_record *subrec, struct packet_stru
 {
        struct dgram_packet *dgram = &p->packet.dgram;
        int ttl = IVAL(buf,1)/1000;
-       nstring workgroup_announce_name;
-       nstring master_name;
+       fstring workgroup_announce_name;
+       fstring master_name;
        uint32 servertype = IVAL(buf,23);
        struct work_record *work;
-       nstring source_name;
-       nstring dest_name;
+       fstring source_name;
+       fstring dest_name;
 
        START_PROFILE(workgroup_announce);
 
-       pull_ascii_nstring(workgroup_announce_name,buf+5);
-       pull_ascii_nstring(master_name,buf+31);
-       pull_ascii_nstring(source_name,dgram->source_name.name);
-       pull_ascii_nstring(dest_name,dgram->dest_name.name);
+       pull_ascii_nstring(workgroup_announce_name,sizeof(workgroup_announce_name),buf+5);
+       pull_ascii_nstring(master_name,sizeof(master_name),buf+31);
+       pull_ascii_nstring(source_name,sizeof(source_name),dgram->source_name.name);
+       pull_ascii_nstring(dest_name,sizeof(dest_name),dgram->dest_name.name);
 
        DEBUG(3,("process_workgroup_announce: from %s<%02x> IP %s to \
 %s for workgroup %s.\n", source_name, source_name[15], inet_ntoa(p->ip),
@@ -255,21 +255,21 @@ 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;
-       nstring server_name;
+       fstring server_name;
        uint32 servertype = IVAL(buf,23);
        fstring comment;
-       nstring work_name;
+       fstring work_name;
        struct work_record *work;
        struct server_record *servrec;
-       nstring source_name;
+       fstring source_name;
 
        START_PROFILE(local_master_announce);
 
-       pull_ascii_nstring(server_name,buf+5);
+       pull_ascii_nstring(server_name,sizeof(server_name),buf+5);
        pull_ascii_fstring(comment, buf+31);
        comment[42] = 0;
-       pull_ascii_nstring(source_name, dgram->source_name.name);
-       pull_ascii_nstring(work_name, dgram->dest_name.name);
+       pull_ascii_nstring(source_name, sizeof(source_name), dgram->source_name.name);
+       pull_ascii_nstring(work_name, sizeof(work_name), dgram->dest_name.name);
 
        DEBUG(3,("process_local_master_announce: from %s<%02x> IP %s to \
 %s for server %s.\n", source_name, source_name[15], inet_ntoa(p->ip),
@@ -369,13 +369,13 @@ done:
 void process_master_browser_announce(struct subnet_record *subrec, 
                                      struct packet_struct *p,char *buf)
 {
-       nstring local_master_name;
+       fstring local_master_name;
        struct work_record *work;
        struct browse_cache_record *browrec;
 
        START_PROFILE(master_browser_announce);
 
-       pull_ascii_nstring(local_master_name,buf);
+       pull_ascii_nstring(local_master_name,sizeof(local_master_name),buf);
   
        DEBUG(3,("process_master_browser_announce: Local master announce from %s IP %s.\n",
                local_master_name, inet_ntoa(p->ip)));
@@ -425,11 +425,11 @@ void process_lm_host_announce(struct subnet_record *subrec, struct packet_struct
        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);
-       nstring announce_name;
+       fstring announce_name;
        struct work_record *work;
        struct server_record *servrec;
-       nstring work_name;
-       nstring source_name;
+       fstring work_name;
+       fstring source_name;
        fstring comment;
        char *s = buf+9;
 
@@ -437,10 +437,10 @@ void process_lm_host_announce(struct subnet_record *subrec, struct packet_struct
        s = skip_string(s,1);
        pull_ascii(comment, s, sizeof(fstring), 43, STR_TERMINATE);
 
-       pull_ascii_nstring(announce_name,buf+9);
-       pull_ascii_nstring(source_name,dgram->source_name.name);
+       pull_ascii_nstring(announce_name,sizeof(announce_name),buf+9);
+       pull_ascii_nstring(source_name,sizeof(source_name),dgram->source_name.name);
        /* For a LanMan host announce the workgroup name is the destination name. */
-       pull_ascii_nstring(work_name,dgram->dest_name.name);
+       pull_ascii_nstring(work_name,sizeof(work_name),dgram->dest_name.name);
 
        DEBUG(3,("process_lm_host_announce: LM Announcement from %s IP %s to \
 %s for server %s.\n", nmb_namestr(&dgram->source_name), inet_ntoa(p->ip),
@@ -479,7 +479,7 @@ originate from OS/2 Warp client. Ignoring packet.\n"));
         */
 
        if(strequal(work_name, global_myname()))
-               nstrcpy(work_name,lp_workgroup());
+               fstrcpy(work_name,lp_workgroup());
 
        /*
         * We are being very agressive here in adding a workgroup
@@ -541,7 +541,7 @@ static void send_backup_list_response(struct subnet_record *subrec,
        char outbuf[1024];
        char *p, *countptr;
        unsigned int count = 0;
-       nstring send_to_namestr;
+       fstring send_to_namestr;
 #if 0
   struct server_record *servrec;
 #endif
@@ -612,7 +612,7 @@ static void send_backup_list_response(struct subnet_record *subrec,
 
        SCVAL(countptr, 0, count);
 
-       pull_ascii_nstring(send_to_namestr, send_to_name->name);
+       pull_ascii_nstring(send_to_namestr, sizeof(send_to_namestr), send_to_name->name);
 
        DEBUG(4,("send_backup_list_response: sending response to %s<00> IP %s with %d servers.\n",
                send_to_namestr, inet_ntoa(sendto_ip), count));
@@ -642,11 +642,11 @@ 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;
-       nstring workgroup_name;
+       fstring workgroup_name;
        struct subnet_record *search_subrec = subrec;
 
        START_PROFILE(get_backup_list);
-       pull_ascii_nstring(workgroup_name, dgram->dest_name.name);
+       pull_ascii_nstring(workgroup_name, sizeof(workgroup_name), dgram->dest_name.name);
 
        DEBUG(3,("process_get_backup_list_request: request from %s IP %s to %s.\n",
                nmb_namestr(&dgram->source_name), inet_ntoa(p->ip),
@@ -774,11 +774,11 @@ void process_announce_request(struct subnet_record *subrec, struct packet_struct
 {
        struct dgram_packet *dgram = &p->packet.dgram;
        struct work_record *work;
-       nstring workgroup_name;
+       fstring workgroup_name;
  
        START_PROFILE(announce_request);
 
-       pull_ascii_nstring(workgroup_name, dgram->dest_name.name);
+       pull_ascii_nstring(workgroup_name, sizeof(workgroup_name), dgram->dest_name.name);
        DEBUG(3,("process_announce_request: Announce request from %s IP %s to %s.\n",
                nmb_namestr(&dgram->source_name), inet_ntoa(p->ip),
                nmb_namestr(&dgram->dest_name)));
@@ -814,11 +814,11 @@ done:
 void process_lm_announce_request(struct subnet_record *subrec, struct packet_struct *p, char *buf)
 {
        struct dgram_packet *dgram = &p->packet.dgram;
-       nstring workgroup_name;
+       fstring workgroup_name;
 
        START_PROFILE(lm_announce_request);
 
-       pull_ascii_nstring(workgroup_name, dgram->dest_name.name);
+       pull_ascii_nstring(workgroup_name, sizeof(workgroup_name), dgram->dest_name.name);
        DEBUG(3,("process_lm_announce_request: Announce request from %s IP %s to %s.\n",
                nmb_namestr(&dgram->source_name), inet_ntoa(p->ip),
                nmb_namestr(&dgram->dest_name)));
index dd999fbdf774832e21da6741e497700aad753410..d43cefc0df07c0ef063a4ea25de2729fc7397712 100644 (file)
@@ -58,7 +58,7 @@ void process_name_release_request(struct subnet_record *subrec,
        struct nmb_packet *nmb = &p->packet.nmb;
        struct in_addr owner_ip;
        struct nmb_name *question = &nmb->question.question_name;
-       nstring qname;
+       fstring qname;
        BOOL bcast = nmb->header.nm_flags.bcast;
        uint16 nb_flags = get_nb_flags(nmb->additional->rdata);
        BOOL group = (nb_flags & NB_GROUP) ? True : False;
@@ -98,7 +98,7 @@ subnet %s from owner IP %s\n",
         * names and *don't set the group bit* !!!!!
         */
 
-       pull_ascii_nstring(qname, question->name);
+       pull_ascii_nstring(qname, sizeof(qname), question->name);
        if( !group && !ismyip(owner_ip) && strequal(qname, lp_workgroup()) && 
                        ((question->name_type == 0x0) || (question->name_type == 0x1e))) {
                DEBUG(6,("process_name_release_request: FTP OnNet bug workaround. Ignoring \
@@ -275,11 +275,13 @@ We put our own names first, then in alphabetical order.
 
 static int status_compare(char *n1,char *n2)
 {
-       nstring name1, name2;
+       fstring name1, name2;
        int l1,l2,l3;
 
-       pull_ascii_nstring(name1, n1);
-       pull_ascii_nstring(name2, n2);
+       memset(name1, '\0', sizeof(name1));
+       memset(name2, '\0', sizeof(name2));
+       pull_ascii_nstring(name1, sizeof(name1), n1);
+       pull_ascii_nstring(name2, sizeof(name2), n2);
        n1 = name1;
        n2 = name2;
 
@@ -298,7 +300,7 @@ static int status_compare(char *n1,char *n2)
                        (l1!=l3 || strncmp(n1,global_myname(),l3) != 0))
                return 1;
 
-       return memcmp(n1,n2,sizeof(nstring));
+       return memcmp(n1,n2,sizeof(fstring));
 }
 
 /****************************************************************************
@@ -308,14 +310,14 @@ static int status_compare(char *n1,char *n2)
 void process_node_status_request(struct subnet_record *subrec, struct packet_struct *p)
 {
        struct nmb_packet *nmb = &p->packet.nmb;
-       nstring qname;
+       fstring qname;
        int ques_type = nmb->question.question_name.name_type;
        char rdata[MAX_DGRAM_SIZE];
        char *countptr, *buf, *bufend, *buf0;
        int names_added,i;
        struct name_record *namerec;
 
-       pull_ascii_nstring(qname, nmb->question.question_name.name);
+       pull_ascii_nstring(qname, sizeof(qname), nmb->question.question_name.name);
 
        DEBUG(3,("process_node_status_request: status request for name %s from IP %s on \
 subnet %s.\n", nmb_namestr(&nmb->question.question_name), inet_ntoa(p->ip), subrec->subnet_name));
@@ -342,9 +344,9 @@ subnet %s - name not found.\n", nmb_namestr(&nmb->question.question_name),
        while (buf < bufend) {
                if( (namerec->data.source == SELF_NAME) || (namerec->data.source == PERMANENT_NAME) ) {
                        int name_type = namerec->name.name_type;
-                       nstring name;
+                       fstring name;
 
-                       pull_ascii_nstring(name, namerec->name.name);
+                       pull_ascii_nstring(name, sizeof(name), namerec->name.name);
                        strupper_m(name);
                        if (!strequal(name,"*") &&
                                        !strequal(name,"__SAMBA__") &&
@@ -352,10 +354,11 @@ subnet %s - name not found.\n", nmb_namestr(&nmb->question.question_name),
                                        ques_type < 0x1b || ques_type >= 0x20 ||
                                        strequal(qname, name))) {
                                /* Start with the name. */
-                               nstring tmp_name;
-                               memset(tmp_name,'\0',sizeof(tmp_name));
-                               snprintf(tmp_name, sizeof(tmp_name), "%-15.15s",name);
-                               push_ascii_nstring(buf, tmp_name);
+                               size_t len;
+                               push_ascii_nstring(buf, name);
+                               len = strlen(buf);
+                               memset(buf + len, ' ', MAX_NETBIOSNAME_LEN - len - 1);
+                               buf[MAX_NETBIOSNAME_LEN - 1] = '\0';
 
                                /* Put the name type and netbios flags in the buffer. */
 
index f79fc56f7bd0fab34c0dcdf52d7e67ea90e0054e..b6e841139f9a6e91e11c8cbd5620b500ec833cbd 100644 (file)
@@ -35,11 +35,11 @@ static void become_logon_server_fail(struct subnet_record *subrec,
                                       struct response_record *rrec,
                                       struct nmb_name *fail_name)
 {
-       nstring failname;
+       fstring failname;
        struct work_record *work;
        struct server_record *servrec;
 
-       pull_ascii_nstring(failname, fail_name->name);
+       pull_ascii_nstring(failname, sizeof(failname), fail_name->name);
        work = find_workgroup_on_subnet(subrec, failname);
        if(!work) {
                DEBUG(0,("become_logon_server_fail: Error - cannot find \
@@ -76,11 +76,11 @@ static void become_logon_server_success(struct subnet_record *subrec,
                                         uint16 nb_flags,
                                         int ttl, struct in_addr registered_ip)
 {
-       nstring reg_name;
+       fstring reg_name;
        struct work_record *work;
        struct server_record *servrec;
 
-       pull_ascii_nstring(reg_name, registered_name->name);
+       pull_ascii_nstring(reg_name, sizeof(reg_name), registered_name->name);
        work = find_workgroup_on_subnet( subrec, reg_name);
        if(!work) {
                DEBUG(0,("become_logon_server_success: Error - cannot find \
index f02fbe1640f411c08c19e897cf1dddbdb45a5c7f..83a8361ed986884a3163a4b221a6e7194ad02c00 100644 (file)
@@ -93,8 +93,8 @@ static void insert_refresh_name_into_unicast( struct subnet_record *subrec,
        }
 
        if((namerec = find_name_on_subnet(unicast_subnet, nmbname, FIND_SELF_NAME)) == NULL) {
-               nstring name;
-               pull_ascii_nstring(name, nmbname->name);
+               fstring name;
+               pull_ascii_nstring(name, sizeof(name), nmbname->name);
                /* The name needs to be created on the unicast subnet. */
                (void)add_name_to_subnet( unicast_subnet, name,
                                nmbname->name_type, nb_type,
index d1c9afd6081a61dde01b88bbe35ad125c6d8fbe5..9f89abdbb28d7a3813e28bdd245414b5e65fb2c7 100644 (file)
@@ -45,13 +45,13 @@ void set_samba_nb_type(void)
 static void upcase_name( struct nmb_name *target, struct nmb_name *source )
 {
        int i;
-       nstring targ;
+       fstring targ;
        fstring scope;
 
        if( NULL != source )
                memcpy( target, source, sizeof( struct nmb_name ) );
 
-       pull_ascii_nstring(targ, target->name);
+       pull_ascii_nstring(targ, sizeof(targ), target->name);
        strupper_m( targ );
        push_ascii_nstring( target->name, targ);
 
@@ -255,8 +255,8 @@ void standard_success_register(struct subnet_record *subrec,
 
        namerec = find_name_on_subnet( subrec, nmbname, FIND_SELF_NAME );
        if( NULL == namerec ) {
-               nstring name;
-               pull_ascii_nstring(name, nmbname->name);
+               fstring name;
+               pull_ascii_nstring(name, sizeof(name), nmbname->name);
                add_name_to_subnet( subrec, name, nmbname->name_type,
                        nb_flags, ttl, SELF_NAME, 1, &registered_ip );
        } else {
index 0397f56512524275fac3cbbcc87ed5e4f2029b76..4fbdd143e1f60e842b4130d3085330c9353a9e16 100644 (file)
@@ -85,8 +85,8 @@ static void register_name_response(struct subnet_record *subrec,
                 */
                
 #if 1 /* OLD_SAMBA_SERVER_HACK */
-               nstring ans_name;
-               pull_ascii_nstring(ans_name, answer_name->name);
+               fstring ans_name;
+               pull_ascii_nstring(ans_name, sizeof(ans_name), answer_name->name);
                if((nmb->header.rcode == ACT_ERR) && strequal(lp_workgroup(), ans_name) &&
                   (answer_name->name_type == 0x1b)) {
                        /* Pretend we did not get this. */
@@ -418,7 +418,7 @@ static void multihomed_register_name(struct nmb_name *nmbname, uint16 nb_flags,
        struct subnet_record *subrec;
        char **wins_tags;
        struct in_addr *ip_list;
-       nstring name;
+       fstring name;
 
        for(subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec) )
                num_ips++;
@@ -434,7 +434,7 @@ static void multihomed_register_name(struct nmb_name *nmbname, uint16 nb_flags,
                ip_list[i] = subrec->myip;
        }
 
-       pull_ascii_nstring(name, nmbname->name);
+       pull_ascii_nstring(name, sizeof(name), nmbname->name);
        add_name_to_subnet(unicast_subnet, name, nmbname->name_type,
                           nb_flags, lp_max_ttl(), SELF_NAME,
                           num_ips, ip_list);
@@ -473,17 +473,18 @@ void register_name(struct subnet_record *subrec,
        struct nmb_name nmbname;
        nstring nname;
 
-        if (strlen(name)+1 > sizeof(nstring)) {
-               memcpy(nname, name,sizeof(nstring)-1);
-               nname[sizeof(nstring)-1] = '\0';
+       errno = 0;
+       push_ascii_nstring(nname, name);
+        if (errno == E2BIG) {
+               fstring tname;
+               pull_ascii_nstring(tname, sizeof(tname), nname);
                DEBUG(0,("register_name: NetBIOS name %s is too long. Truncating to %s\n",
-                       name, nname));
+                       name, tname));
+               make_nmb_name(&nmbname, tname, type);
        } else {
-               nstrcpy(nname,name);
+               make_nmb_name(&nmbname, name, type);
        }
 
-       make_nmb_name(&nmbname, nname, type);
-
        /* Always set the NB_ACTIVE flag on the name we are
           registering. Doesn't make sense without it.
        */
index c318689fd19fb0f69c7cfea8b3dd6d19ecec66f0..b5cbaab00b7850eae547cddeeddcf4832d893492 100644 (file)
@@ -1034,7 +1034,7 @@ static void process_browse_packet(struct packet_struct *p, char *buf,int len)
        int command = CVAL(buf,0);
        struct subnet_record *subrec = find_subnet_for_dgram_browse_packet(p);
        char scope[64];
-       nstring src_name;
+       fstring src_name;
 
        /* Drop the packet if it's a different NetBIOS scope, or the source is from one of our names. */
        pull_ascii(scope, dgram->dest_name.scope, 64, 64, STR_TERMINATE);
@@ -1044,7 +1044,7 @@ mismatch with our scope (%s).\n", inet_ntoa(p->ip), scope, global_scope()));
                return;
        }
 
-       pull_ascii_nstring(src_name, dgram->source_name.name);
+       pull_ascii_nstring(src_name, sizeof(src_name), dgram->source_name.name);
        if (is_myname(src_name)) {
                DEBUG(0,("process_browse_packet: Discarding datagram from IP %s. Source name \
 %s is one of our names !\n", inet_ntoa(p->ip), nmb_namestr(&dgram->source_name)));
@@ -1121,7 +1121,7 @@ static void process_lanman_packet(struct packet_struct *p, char *buf,int len)
        int command = SVAL(buf,0);
        struct subnet_record *subrec = find_subnet_for_dgram_browse_packet(p);
        char scope[64];
-       nstring src_name;
+       fstring src_name;
 
        /* Drop the packet if it's a different NetBIOS scope, or the source is from one of our names. */
 
@@ -1132,7 +1132,7 @@ mismatch with our scope (%s).\n", inet_ntoa(p->ip), scope, global_scope()));
                return;
        }
 
-       pull_ascii_nstring(src_name, dgram->source_name.name);
+       pull_ascii_nstring(src_name, sizeof(src_name), dgram->source_name.name);
        if (is_myname(src_name)) {
                DEBUG(0,("process_lanman_packet: Discarding datagram from IP %s. Source name \
 %s is one of our names !\n", inet_ntoa(p->ip), nmb_namestr(&dgram->source_name)));
index 13aefabd26f81e05962cb48e6b7740c84454b9c0..ff2aea6c08d50e24496193c8725d0fbf0e07a133 100644 (file)
@@ -141,7 +141,7 @@ logons are not enabled.\n", inet_ntoa(p->ip) ));
                case QUERYFORPDC:
                        {
                                fstring mach_str, getdc_str;
-                               nstring source_name;
+                               fstring source_name;
                                char *q = buf + 2;
                                char *machine = q;
 
@@ -220,7 +220,7 @@ reporting %s domain %s 0x%x ntversion=%x lm_nt token=%x lm_20 token=%x\n",
                                dump_data(4, outbuf, PTR_DIFF(q, outbuf));
 
                                pull_ascii_fstring(getdc_str, getdc);
-                               pull_ascii_nstring(source_name, dgram->source_name.name);
+                               pull_ascii_nstring(source_name, sizeof(source_name), dgram->source_name.name);
 
                                send_mailslot(True, getdc_str,
                                        outbuf,PTR_DIFF(q,outbuf),
@@ -435,7 +435,7 @@ reporting %s domain %s 0x%x ntversion=%x lm_nt token=%x lm_20 token=%x\n",
                                dump_data(4, outbuf, PTR_DIFF(q, outbuf));
 
                                pull_ascii_fstring(getdc_str, getdc);
-                               pull_ascii_nstring(source_name, dgram->source_name.name);
+                               pull_ascii_nstring(source_name, sizeof(source_name), dgram->source_name.name);
 
                                send_mailslot(True, getdc,
                                        outbuf,PTR_DIFF(q,outbuf),
index 6a0576a5a439291fba2fb072eaadb9c8b1314381..424af1e2e3cd515f91333afa896c7158b935b01e 100644 (file)
@@ -31,8 +31,8 @@
 
 struct sync_record {
        struct sync_record *next, *prev;
-       nstring workgroup;
-       nstring server;
+       fstring workgroup;
+       fstring server;
        pstring fname;
        struct in_addr ip;
        pid_t pid;
@@ -148,8 +148,8 @@ done:
 
        ZERO_STRUCTP(s);
        
-       nstrcpy(s->workgroup, work->work_group);
-       nstrcpy(s->server, name);
+       fstrcpy(s->workgroup, work->work_group);
+       fstrcpy(s->server, name);
        s->ip = ip;
 
        slprintf(s->fname, sizeof(pstring)-1,
@@ -206,7 +206,7 @@ static void complete_one(struct sync_record *s,
                                                          sname, lp_max_ttl());
                        if (work) {
                                /* remember who the master is */
-                               nstrcpy(work->local_master_browser_name, comment);
+                               fstrcpy(work->local_master_browser_name, comment);
                        }
                }
                return;
index bace112752f7071261be7f9f82d27daa68c66f1d..d91818698e87b1602118d14281d8588b615b3853 100644 (file)
@@ -30,7 +30,7 @@ static void wins_proxy_name_query_request_success( struct subnet_record *subrec,
                         struct userdata_struct *userdata,
                         struct nmb_name *nmbname, struct in_addr ip, struct res_rec *rrec)
 {
-       nstring name;
+       fstring name;
        struct packet_struct *original_packet;
        struct subnet_record *orig_broadcast_subnet;
        struct name_record *namerec;
@@ -73,7 +73,7 @@ returned for name %s.\n", nmb_namestr(nmbname) ));
        if(rrec == PERMANENT_TTL)
                ttl = lp_max_ttl();
 
-       pull_ascii_nstring(name, nmbname->name);
+       pull_ascii_nstring(name, sizeof(name), nmbname->name);
        namerec = add_name_to_subnet( orig_broadcast_subnet, name,
                                        nmbname->name_type, nb_flags, ttl,
                                        WINS_PROXY_NAME, num_ips, iplist );
@@ -193,7 +193,7 @@ void make_wins_proxy_name_query_request( struct subnet_record *subrec,
        long *ud[(sizeof(struct userdata_struct) + sizeof(struct subrec *) + 
                sizeof(struct packet_struct *))/sizeof(long *) + 1];
        struct userdata_struct *userdata = (struct userdata_struct *)ud;
-       nstring qname;
+       fstring qname;
 
        memset(ud, '\0', sizeof(ud));
  
@@ -205,7 +205,7 @@ void make_wins_proxy_name_query_request( struct subnet_record *subrec,
                        sizeof(struct packet_struct *));
 
        /* Now use the unicast subnet to query the name with the WINS server. */
-       pull_ascii_nstring(qname, question_name->name);
+       pull_ascii_nstring(qname, sizeof(qname), question_name->name);
        query_name( unicast_subnet, qname, question_name->name_type,
                wins_proxy_name_query_request_success,
                wins_proxy_name_query_request_fail,
index aae1cf633f90fbc8b92a6807b21324222f340933..fd7718e2a69cdf93eb40f1278aafce8ab9f9e8d0 100644 (file)
@@ -744,7 +744,7 @@ querying for name %s in order to replace it and this reply.\n", nmb_namestr(ques
 void wins_process_name_registration_request(struct subnet_record *subrec,
                                             struct packet_struct *p)
 {
-       nstring name;
+       fstring name;
        struct nmb_packet *nmb = &p->packet.nmb;
        struct nmb_name *question = &nmb->question.question_name;
        BOOL bcast = nmb->header.nm_flags.bcast;
@@ -906,7 +906,7 @@ already exists in WINS as a GROUP name.\n", nmb_namestr(question) ));
         */
 
        if ( namerec != NULL )
-               pull_ascii_nstring(name, namerec->name.name);
+               pull_ascii_nstring(name, sizeof(name), namerec->name.name);
                
        if( is_myname(name) ) {
                if(!ismyip(from_ip)) {
@@ -983,7 +983,7 @@ is one of our (WINS server) names. Denying registration.\n", nmb_namestr(questio
                 * code. JRA.
                 */
 
-               pull_ascii_nstring(name, question->name);
+               pull_ascii_nstring(name, sizeof(name), question->name);
                query_name_from_wins_server( *namerec->data.ip,
                                name,
                                question->name_type, 
@@ -997,7 +997,7 @@ is one of our (WINS server) names. Denying registration.\n", nmb_namestr(questio
         * Name did not exist - add it.
         */
 
-       pull_ascii_nstring(name, question->name);
+       pull_ascii_nstring(name, sizeof(name), question->name);
        add_name_to_subnet( subrec, name, question->name_type,
                        nb_flags, ttl, REGISTER_NAME, 1, &from_ip);
 
@@ -1119,7 +1119,7 @@ void wins_process_multihomed_name_registration_request( struct subnet_record *su
        struct in_addr from_ip;
        BOOL group = (nb_flags & NB_GROUP) ? True : False;
        struct in_addr our_fake_ip = *interpret_addr2("0.0.0.0");
-       nstring qname;
+       fstring qname;
 
        putip((char *)&from_ip,&nmb->additional->rdata[2]);
 
@@ -1318,7 +1318,7 @@ is one of our (WINS server) names. Denying registration.\n", nmb_namestr(questio
                 * not the person who sent the packet 
                 */
 
-               pull_ascii_nstring( qname, question->name);
+               pull_ascii_nstring( qname, sizeof(qname), question->name);
                query_name_from_wins_server( namerec->data.ip[0],
                                qname,
                                question->name_type, 
@@ -1333,7 +1333,7 @@ is one of our (WINS server) names. Denying registration.\n", nmb_namestr(questio
         * Name did not exist - add it.
         */
 
-       pull_ascii_nstring( qname, question->name);
+       pull_ascii_nstring( qname, sizeof(qname), question->name);
        add_name_to_subnet( subrec, qname, question->name_type,
                        nb_flags, ttl, REGISTER_NAME, 1, &from_ip);
 
@@ -1479,7 +1479,7 @@ void wins_process_name_query_request(struct subnet_record *subrec,
        struct nmb_packet *nmb = &p->packet.nmb;
        struct nmb_name *question = &nmb->question.question_name;
        struct name_record *namerec = NULL;
-       nstring qname;
+       fstring qname;
 
        DEBUG(3,("wins_process_name_query: name query for name %s from IP %s\n", 
                nmb_namestr(question), inet_ntoa(p->ip) ));
@@ -1491,7 +1491,7 @@ void wins_process_name_query_request(struct subnet_record *subrec,
         * to discover other domains that may not have a presence on their subnet.
         */
 
-       pull_ascii_nstring(qname, question->name);
+       pull_ascii_nstring(qname, sizeof(qname), question->name);
        if(strequal( qname, "*") && (question->name_type == 0x1b)) {
                process_wins_dmb_query_request( subrec, p);
                return;
@@ -1845,8 +1845,8 @@ void wins_write_database(BOOL background)
                DEBUGADD(4,("%2x\n", namerec->data.nb_flags ));
 
                if( namerec->data.source == REGISTER_NAME ) {
-                       nstring name;
-                       pull_ascii_nstring(name, namerec->name.name);
+                       fstring name;
+                       pull_ascii_nstring(name, sizeof(name), namerec->name.name);
                        x_fprintf(fp, "\"%s#%02x\" %d ", name,namerec->name.name_type, /* Ignore scope. */
                                (int)namerec->data.death_time);
 
index b9fab4b278c12508cfc2273bc9b7b6ec5cdee5a3..bd2737ef972773f575376fef2038b84e2b7724b2 100644 (file)
@@ -48,6 +48,8 @@ static struct work_record *create_workgroup(const char *name, int ttl)
 {
        struct work_record *work;
        struct subnet_record *subrec;
+        nstring nname;
+                                                                                                                         
        int t = -1;
   
        if((work = (struct work_record *)malloc(sizeof(*work))) == NULL) {
@@ -55,15 +57,18 @@ static struct work_record *create_workgroup(const char *name, int ttl)
                return NULL;
        }
        memset((char *)work, '\0', sizeof(*work));
-       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);
-       }
+
+        errno = 0;
+        push_ascii_nstring(nname, name);
+        if (errno == E2BIG) {
+               fstring tname;
+                pull_ascii_nstring(tname, sizeof(tname), nname);
+               fstrcpy(work->work_group,tname);
+                DEBUG(0,("create_workgroup: workgroup name %s is too long. Truncating to %s\n",
+                       name, tname));
+        } else {
+               fstrcpy(work->work_group,name);
+        }
        work->serverlist = NULL;
   
        work->RunningElection = False;
index 28e3cf97d1f9ad2a87dc96cfe61e6f66d0cfab8a..96961368fb18907703b4af54249dd21888687db7 100644 (file)
@@ -169,6 +169,8 @@ static int reply_lanman2(char *inbuf, char *outbuf)
 static int negprot_spnego(char *p)
 {
        DATA_BLOB blob;
+       nstring dos_name;
+       fstring unix_name;
        uint8 guid[17];
        const char *OIDs_krb5[] = {OID_KERBEROS5,
                                   OID_KERBEROS5_OLD,
@@ -181,7 +183,11 @@ static int negprot_spnego(char *p)
        global_spnego_negotiated = True;
 
        ZERO_STRUCT(guid);
-       safe_strcpy((char *)guid, global_myname(), sizeof(guid)-1);
+
+       safe_strcpy(unix_name, global_myname(), sizeof(unix_name)-1);
+       strlower_m(unix_name);
+       push_ascii_nstring(dos_name, unix_name);
+       safe_strcpy((char *)guid, dos_name, sizeof(guid)-1);
 
 #ifdef DEVELOPER
        /* valgrind fixer... */
@@ -192,8 +198,6 @@ static int negprot_spnego(char *p)
        }
 #endif
 
-       strlower_m((char *)guid);
-
 #if 0
        /* strangely enough, NT does not sent the single OID NTLMSSP when
           not a ADS member, it sends no OIDs at all