From 82290216ad827c9f8f74ffd3aa6a37dca28174e1 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 3 Sep 1997 20:15:40 +0000 Subject: nameannounce.c nameresp.c nameserv.c nameservreply.c proto.h : Removed broadcast and recurse parameters in the queue_netbios_pkt_wins() call - they are not needed as they should always be 'false' and 'true' respectively. Also fixed a bug with secure name registration (WINS server code). server.c: Finally fixed problem with error 267 being returned to Win95. It is needed by NT. This is a horrid fix and I would appreciate a better one :-). Jeremy (jallison@whistle.com) (This used to be commit fa1305d1894a28331ba80d9de038ebf31ba902d6) --- source3/include/proto.h | 1 - source3/nameannounce.c | 2 +- source3/nameresp.c | 14 ++++++-------- source3/nameserv.c | 6 +++--- source3/nameservreply.c | 35 ++++++++++++++++++----------------- source3/smbd/server.c | 16 ++++++++++++++-- 6 files changed, 42 insertions(+), 32 deletions(-) diff --git a/source3/include/proto.h b/source3/include/proto.h index 5c770d7fcc..d1b28c860d 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -502,7 +502,6 @@ struct response_record *queue_netbios_pkt_wins( int fd,int quest_type,enum state_type state, char *name,int name_type,int nb_flags, time_t ttl, int server_type, char *my_name, char *my_comment, - BOOL bcast,BOOL recurse, struct in_addr send_ip, struct in_addr reply_to_ip); struct response_record *queue_netbios_packet(struct subnet_record *d, int fd,int quest_type,enum state_type state,char *name, diff --git a/source3/nameannounce.c b/source3/nameannounce.c index 2f169e9287..684ef41258 100644 --- a/source3/nameannounce.c +++ b/source3/nameannounce.c @@ -430,7 +430,7 @@ workgroup %s\n", am_master, work->work_group)); NMB_QUERY,NAME_QUERY_DOM_SRV_CHK, name, type, 0,0,0, work->work_group,NULL, - False, True, ipzero, ipzero); + ipzero, ipzero); } else if(lp_wins_support()) { diff --git a/source3/nameresp.c b/source3/nameresp.c index 23e70a7064..f44171f4b6 100644 --- a/source3/nameresp.c +++ b/source3/nameresp.c @@ -117,7 +117,7 @@ static void dead_netbios_entry(struct subnet_record *d, add_name_respond(d,n->fd,d->myip, n->response_id ,&n->name, n->nb_flags, GET_TTL(0), - n->reply_to_ip, False, n->reply_to_ip); + n->reply_to_ip, True, n->reply_to_ip); if (!n->bcast && n->num_msgs == 0) { @@ -250,7 +250,6 @@ struct response_record *queue_netbios_pkt_wins( int fd,int quest_type,enum state_type state, char *name,int name_type,int nb_flags, time_t ttl, int server_type, char *my_name, char *my_comment, - BOOL bcast,BOOL recurse, struct in_addr send_ip, struct in_addr reply_to_ip) { /* XXXX note: please see rfc1001.txt section 10 for details on this @@ -260,30 +259,29 @@ struct response_record *queue_netbios_pkt_wins( */ if ((!lp_wins_support()) && (*lp_wins_server())) - { + { /* samba is not a WINS server, and we are using a WINS server */ struct in_addr real_wins_ip; real_wins_ip = *interpret_addr2(lp_wins_server()); - if (!zero_ip(real_wins_ip)) + if (!zero_ip(real_wins_ip)) { - bcast = False; send_ip = real_wins_ip; } - else + else { /* oops. smb.conf's wins server parameter MUST be a host_name or an ip_address. */ DEBUG(0,("invalid smb.conf parameter 'wins server'\n")); } - } + } if (zero_ip(send_ip)) return NULL; return queue_netbios_packet(wins_subnet,fd, quest_type, state, name, name_type, nb_flags, ttl, server_type,my_name,my_comment, - bcast, recurse, send_ip, reply_to_ip); + False, True, send_ip, reply_to_ip); } diff --git a/source3/nameserv.c b/source3/nameserv.c index 96bb1c0eac..ccd0ef379c 100644 --- a/source3/nameserv.c +++ b/source3/nameserv.c @@ -103,7 +103,7 @@ void remove_name_entry(struct subnet_record *d, char *name,int type) /* not a WINS server: we have to release them on the network */ queue_netbios_pkt_wins(ClientNMB,NMB_REL,NAME_RELEASE, name, type, 0, 0,0,NULL,NULL, - False, True, ipzero, ipzero); + ipzero, ipzero); } } else @@ -163,7 +163,7 @@ void add_my_name_entry(struct subnet_record *d,char *name,int type,int nb_flags) queue_netbios_pkt_wins(ClientNMB, re_reg ? NMB_REG_REFRESH : NMB_REG, NAME_REGISTER, name, type, nb_flags, GET_TTL(0),0,NULL,NULL, - False, True, ipzero, ipzero); + ipzero, ipzero); } } else @@ -308,7 +308,7 @@ for domain master on workgroup %s\n", myworkgroup)); NAME_QUERY_DOMAIN, myworkgroup, 0x1b, 0, 0,0,NULL,NULL, - False, True, ipzero, ipzero); + ipzero, ipzero); } } } diff --git a/source3/nameservreply.c b/source3/nameservreply.c index f3048dd1b5..5b9c476549 100644 --- a/source3/nameservreply.c +++ b/source3/nameservreply.c @@ -98,7 +98,7 @@ void add_name_respond(struct subnet_record *d, int fd, struct in_addr from_ip, /* see rfc1002.txt - 4.2.10 and 4.2.11 */ send_name_response(fd,from_ip, response_id, NMB_REG, new_owner, - True, False, + True, True, name, nb_flags, ttl, reply_to_ip); } @@ -183,7 +183,6 @@ void reply_name_reg(struct packet_struct *p) int qname_type = question->name_type; BOOL bcast = nmb->header.nm_flags.bcast; - BOOL release_is_to_wins_server = nmb->header.nm_flags.recursion_desired; int ttl = GET_TTL(nmb->additional->ttl); int nb_flags = nmb->additional->rdata[0]; @@ -314,21 +313,21 @@ void reply_name_reg(struct packet_struct *p) /* initiate some enquiries to the current owner. */ queue_netbios_packet(d,ClientNMB,NMB_QUERY, - NAME_REGISTER_CHALLENGE, - reply_name->name,reply_name->name_type, - nb_flags,0,0,NULL,NULL, - True, False, + NAME_REGISTER_CHALLENGE, + reply_name->name,reply_name->name_type, + nb_flags,0,0,NULL,NULL, + False, False, n->ip_flgs[0].ip, p->ip); } else { - /* Send a NAME REGISTRATION RESPONSE (pos/neg) see rfc1002.txt 4.2.13-14 + /* Send a NAME REGISTRATION RESPONSE (pos/neg) see rfc1002.txt 4.2.5-6 or an END-NODE CHALLENGE REGISTRATION RESPONSE see rfc1002.txt 4.2.7 */ send_name_response(p->fd,p->ip, nmb->header.name_trn_id, NMB_REG, success, - release_is_to_wins_server, False, + True, True, reply_name, nb_flags, ttl, ip); } } @@ -517,8 +516,8 @@ void reply_name_query(struct packet_struct *p) int name_type = question->name_type; BOOL bcast = nmb->header.nm_flags.bcast; - BOOL query_is_to_wins_server = nmb->header.nm_flags.recursion_desired; - + BOOL query_is_to_wins_server = (!bcast && + nmb->header.nm_flags.recursion_desired); int ttl=0; int rcode = 0; int nb_flags = 0; @@ -527,6 +526,7 @@ void reply_name_query(struct packet_struct *p) struct subnet_record *d = NULL; BOOL success = True; struct name_record *n = NULL; + BOOL acting_as_wins_server = lp_wins_support(); /* directed queries are for WINS server: broadcasts are local SELF queries. the exception is Domain Master names. */ @@ -656,11 +656,12 @@ void reply_name_query(struct packet_struct *p) /* see rfc1002.txt 4.2.13 */ reply_netbios_packet(p,nmb->header.name_trn_id, - rcode,NMB_QUERY,0, - query_is_to_wins_server, /* recursion_available flag */ - True, /* recursion_desired_flag */ - &nmb->question.question_name, - 0x20, 0x01, - ttl, - rdata, success ? 6 : 0); + rcode,NMB_QUERY,0, + (query_is_to_wins_server && acting_as_wins_server ? + True : False), /* recursion_available flag */ + True, /* recursion_desired_flag */ + &nmb->question.question_name, + 0x20, 0x01, + ttl, + rdata, success ? 6 : 0); } diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 50f3214919..a65ffdd81c 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -1985,9 +1985,10 @@ struct int new_smb_error; int old_smb_error; int protocol_level; + char *valid_remote_arch; } old_client_errmap[] = { - {ERRbaddirectory, ERRbadpath, (int)PROTOCOL_NT1}, + {ERRbaddirectory, ERRbadpath, (int)PROTOCOL_NT1, "WinNT"}, {0,0,0} }; @@ -1996,6 +1997,7 @@ struct ****************************************************************************/ int unix_error_packet(char *inbuf,char *outbuf,int def_class,uint32 def_code,int line) { + extern fstring remote_arch; int eclass=def_class; int ecode=def_code; int i=0; @@ -2024,9 +2026,19 @@ int unix_error_packet(char *inbuf,char *outbuf,int def_class,uint32 def_code,int /* Make sure we don't return error codes that old clients don't understand. */ + /* JRA - unfortunately, WinNT needs some error codes + for apps to work correctly, Win95 will break if + these error codes are returned. But they both + negotiate the *same* protocol. So we need to use + the revolting 'remote_arch' string to tie break. + + There must be a better way of doing this... + */ + for(i = 0; old_client_errmap[i].new_smb_error != 0; i++) { - if((Protocol < old_client_errmap[i].protocol_level) && + if(((Protocol < old_client_errmap[i].protocol_level) || + !strcsequal( old_client_errmap[i].valid_remote_arch, remote_arch)) && (old_client_errmap[i].new_smb_error == ecode)) { ecode = old_client_errmap[i].old_smb_error; -- cgit