From 6b9dbbcd249360fb9acd61d6900baccf621c9cce Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 13 Mar 2004 02:16:21 +0000 Subject: [PATCH] Modified fix for bugid #784. Based on a patch from moriyama@miraclelinux.com (MORIYAMA Masayuki). 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. (This used to be commit b4ea493599ab414f7828b83f40a5a8b43479ff64) --- source3/include/nameserv.h | 8 ++-- source3/lib/charcnv.c | 9 +++-- source3/lib/util_str.c | 1 - source3/libsmb/libsmbclient.c | 2 +- source3/libsmb/namequery.c | 4 +- source3/libsmb/nmblib.c | 28 +++++++------ source3/nmbd/asyncdns.c | 4 +- source3/nmbd/nmbd_become_dmb.c | 16 ++++---- source3/nmbd/nmbd_become_lmb.c | 22 +++++------ source3/nmbd/nmbd_browserdb.c | 4 +- source3/nmbd/nmbd_browsesync.c | 22 +++++------ source3/nmbd/nmbd_elections.c | 16 ++++---- source3/nmbd/nmbd_incomingdgrams.c | 76 ++++++++++++++++++------------------ source3/nmbd/nmbd_incomingrequests.c | 31 ++++++++------- source3/nmbd/nmbd_logonnames.c | 8 ++-- source3/nmbd/nmbd_mynames.c | 4 +- source3/nmbd/nmbd_namelistdb.c | 8 ++-- source3/nmbd/nmbd_nameregister.c | 23 +++++------ source3/nmbd/nmbd_packets.c | 8 ++-- source3/nmbd/nmbd_processlogon.c | 6 +-- source3/nmbd/nmbd_synclists.c | 10 ++--- source3/nmbd/nmbd_winsproxy.c | 8 ++-- source3/nmbd/nmbd_winsserver.c | 22 +++++------ source3/nmbd/nmbd_workgroupdb.c | 23 ++++++----- source3/smbd/negprot.c | 10 +++-- 25 files changed, 197 insertions(+), 176 deletions(-) diff --git a/source3/include/nameserv.h b/source3/include/nameserv.h index 1e867d620bc..5362960d62b 100644 --- a/source3/include/nameserv.h +++ b/source3/include/nameserv.h @@ -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; diff --git a/source3/lib/charcnv.c b/source3/lib/charcnv.c index 38bb239a12c..28ecf761d30 100644 --- a/source3/lib/charcnv.c +++ b/source3/lib/charcnv.c @@ -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); } /** diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c index b8cf052862f..2be8b7eb64c 100644 --- a/source3/lib/util_str.c +++ b/source3/lib/util_str.c @@ -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]) { diff --git a/source3/libsmb/libsmbclient.c b/source3/libsmb/libsmbclient.c index 37e794478d3..35e8a9786b1 100644 --- a/source3/libsmb/libsmbclient.c +++ b/source3/libsmb/libsmbclient.c @@ -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; diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index b6d1f8bda22..b9bc4e11664 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -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 diff --git a/source3/libsmb/nmblib.c b/source3/libsmb/nmblib.c index cbe495cd959..bc2cca0e0e3 100644 --- a/source3/libsmb/nmblib.c +++ b/source3/libsmb/nmblib.c @@ -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'; diff --git a/source3/nmbd/asyncdns.c b/source3/nmbd/asyncdns.c index 6d5d487b112..dafbff7af20 100644 --- a/source3/nmbd/asyncdns.c +++ b/source3/nmbd/asyncdns.c @@ -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 */ diff --git a/source3/nmbd/nmbd_become_dmb.c b/source3/nmbd/nmbd_become_dmb.c index 46d37fbb817..c9b0a225807 100644 --- a/source3/nmbd/nmbd_become_dmb.c +++ b/source3/nmbd/nmbd_become_dmb.c @@ -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); } diff --git a/source3/nmbd/nmbd_become_lmb.c b/source3/nmbd/nmbd_become_lmb.c index 2370c7ba366..8d66320f3eb 100644 --- a/source3/nmbd/nmbd_become_lmb.c +++ b/source3/nmbd/nmbd_become_lmb.c @@ -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); } diff --git a/source3/nmbd/nmbd_browserdb.c b/source3/nmbd/nmbd_browserdb.c index 443edf599d0..d7812591569 100644 --- a/source3/nmbd/nmbd_browserdb.c +++ b/source3/nmbd/nmbd_browserdb.c @@ -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 ); diff --git a/source3/nmbd/nmbd_browsesync.c b/source3/nmbd/nmbd_browsesync.c index 6cde88651f9..454c3497676 100644 --- a/source3/nmbd/nmbd_browsesync.c +++ b/source3/nmbd/nmbd_browsesync.c @@ -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))); diff --git a/source3/nmbd/nmbd_elections.c b/source3/nmbd/nmbd_elections.c index 19b00f1f4d2..882c26ce808 100644 --- a/source3/nmbd/nmbd_elections.c +++ b/source3/nmbd/nmbd_elections.c @@ -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; diff --git a/source3/nmbd/nmbd_incomingdgrams.c b/source3/nmbd/nmbd_incomingdgrams.c index f646e397162..1450610e190 100644 --- a/source3/nmbd/nmbd_incomingdgrams.c +++ b/source3/nmbd/nmbd_incomingdgrams.c @@ -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))); diff --git a/source3/nmbd/nmbd_incomingrequests.c b/source3/nmbd/nmbd_incomingrequests.c index dd999fbdf77..d43cefc0df0 100644 --- a/source3/nmbd/nmbd_incomingrequests.c +++ b/source3/nmbd/nmbd_incomingrequests.c @@ -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. */ diff --git a/source3/nmbd/nmbd_logonnames.c b/source3/nmbd/nmbd_logonnames.c index f79fc56f7bd..b6e841139f9 100644 --- a/source3/nmbd/nmbd_logonnames.c +++ b/source3/nmbd/nmbd_logonnames.c @@ -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 \ diff --git a/source3/nmbd/nmbd_mynames.c b/source3/nmbd/nmbd_mynames.c index f02fbe1640f..83a8361ed98 100644 --- a/source3/nmbd/nmbd_mynames.c +++ b/source3/nmbd/nmbd_mynames.c @@ -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, diff --git a/source3/nmbd/nmbd_namelistdb.c b/source3/nmbd/nmbd_namelistdb.c index d1c9afd6081..9f89abdbb28 100644 --- a/source3/nmbd/nmbd_namelistdb.c +++ b/source3/nmbd/nmbd_namelistdb.c @@ -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, ®istered_ip ); } else { diff --git a/source3/nmbd/nmbd_nameregister.c b/source3/nmbd/nmbd_nameregister.c index 0397f565125..4fbdd143e1f 100644 --- a/source3/nmbd/nmbd_nameregister.c +++ b/source3/nmbd/nmbd_nameregister.c @@ -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. */ diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c index c318689fd19..b5cbaab00b7 100644 --- a/source3/nmbd/nmbd_packets.c +++ b/source3/nmbd/nmbd_packets.c @@ -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))); diff --git a/source3/nmbd/nmbd_processlogon.c b/source3/nmbd/nmbd_processlogon.c index 7350d8237fe..617a7be6cb7 100644 --- a/source3/nmbd/nmbd_processlogon.c +++ b/source3/nmbd/nmbd_processlogon.c @@ -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), @@ -432,7 +432,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), diff --git a/source3/nmbd/nmbd_synclists.c b/source3/nmbd/nmbd_synclists.c index 6a0576a5a43..424af1e2e3c 100644 --- a/source3/nmbd/nmbd_synclists.c +++ b/source3/nmbd/nmbd_synclists.c @@ -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; diff --git a/source3/nmbd/nmbd_winsproxy.c b/source3/nmbd/nmbd_winsproxy.c index bace112752f..d91818698e8 100644 --- a/source3/nmbd/nmbd_winsproxy.c +++ b/source3/nmbd/nmbd_winsproxy.c @@ -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, diff --git a/source3/nmbd/nmbd_winsserver.c b/source3/nmbd/nmbd_winsserver.c index 36940724207..7279014194f 100644 --- a/source3/nmbd/nmbd_winsserver.c +++ b/source3/nmbd/nmbd_winsserver.c @@ -704,7 +704,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; @@ -866,7 +866,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)) { @@ -943,7 +943,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, @@ -957,7 +957,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); @@ -1079,7 +1079,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]); @@ -1278,7 +1278,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, @@ -1293,7 +1293,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); @@ -1439,7 +1439,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) )); @@ -1451,7 +1451,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; @@ -1805,8 +1805,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); diff --git a/source3/nmbd/nmbd_workgroupdb.c b/source3/nmbd/nmbd_workgroupdb.c index b9fab4b278c..bd2737ef972 100644 --- a/source3/nmbd/nmbd_workgroupdb.c +++ b/source3/nmbd/nmbd_workgroupdb.c @@ -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; diff --git a/source3/smbd/negprot.c b/source3/smbd/negprot.c index 28e3cf97d1f..96961368fb1 100644 --- a/source3/smbd/negprot.c +++ b/source3/smbd/negprot.c @@ -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 -- 2.11.4.GIT