charcnv.c: Fixed silly bugs detected on IRIX.
authorSamba Release Account <samba-bugs@samba.org>
Fri, 30 May 1997 20:40:48 +0000 (20:40 +0000)
committerSamba Release Account <samba-bugs@samba.org>
Fri, 30 May 1997 20:40:48 +0000 (20:40 +0000)
client.c: Fixed silly bugs detected on IRIX.
namedbname.c: Stopped 1d names from being registered in WINS db.
namedbsubnet.c: Only register 1e names on broadcast subnet.
nameelect.c: Changed add_my_name entries. Forced host announces if we
                have less than 10 servers listed. Fixed registering 1b
                domain name issues.
namepacket.c: Added error message when dgram discarded.
nameserv.c: Added notion of 'direct' names that are not registered on
                the network. Needed to get around bugs in earlier nmbd
                handling of DOMAIN(1b) names.
nameservreply.c:Tidied up debug message.
nameservresp.c: Added response_name_query_domain() code. Deals with
                re-registering DOMAIN(1b) name.
nmbd.c: Fixed silly bugs detected on IRIX.
nmblib.c: Added paranoia debugs.
proto.h: Updated remove_name_entry(), add_my_name_entry().
server.c: Fixed silly bugs detected on IRIX.
trans2.c: Fixed silly bugs detected on IRIX.
uid.c: Fixed silly bugs detected on IRIX.
version.h: Updated to alpha3.
Jeremy (jallison@whistle.com).
(This used to be commit f08222bd8b86a061c52d22015f946a4737eb47fd)

16 files changed:
source3/client/client.c
source3/include/proto.h
source3/include/version.h
source3/lib/charcnv.c
source3/libsmb/nmblib.c
source3/namedbname.c
source3/namedbsubnet.c
source3/nameelect.c
source3/namepacket.c
source3/nameserv.c
source3/nameservreply.c
source3/nameservresp.c
source3/nmbd/nmbd.c
source3/smbd/server.c
source3/smbd/trans2.c
source3/smbd/uid.c

index e023530cb5ae813bb4412e8ea25a03a317b25700..32bbbae8cd2d64bbf01e8f05d7688ff7a2893174 100644 (file)
@@ -843,7 +843,7 @@ else
   {
   unsigned int offset = datap - converter;
 
-  if( offset < 0 || offset >= rdrcnt )
+  if( offset >= rdrcnt )
     {
       DEBUG(1,("bad char ptr: datap=%u, converter=%u, rdata=%u, rdrcnt=%d>", datap, converter, (unsigned)rdata, rdrcnt));
     return "<ERROR>";
index 04202dd88c6f224833269a44c7ec69c85271d67a..e6d39c3a3faf66c30d1b2a583f76b4e817396fe7 100644 (file)
@@ -481,8 +481,8 @@ struct response_record *queue_netbios_packet(struct subnet_record *d,
 
 /*The following definitions come from  nameserv.c  */
 
-void remove_name_entry(struct subnet_record *d, char *name,int type);
-void add_my_name_entry(struct subnet_record *d,char *name,int type,int nb_flags);
+void remove_name_entry(struct subnet_record *d, char *name,int type, BOOL direct);
+void add_my_name_entry(struct subnet_record *d,char *name,int type,int nb_flags, BOOL direct);
 void add_domain_names(time_t t);
 void add_my_names(void);
 void remove_my_names();
index 2f7596f41d4876f699310339fc336a614e283d81..37e26dd65eeb2a56e18665a58717f4d1a4251330 100644 (file)
@@ -1 +1 @@
-#define VERSION "1.9.17alpha2"
+#define VERSION "1.9.17alpha3"
index b6debbec4ad8b937b073f4fa0106c3282d455c20..6be455c47b27c0ce545f268937ab79aebf7f12d4 100644 (file)
@@ -25,7 +25,7 @@ extern int DEBUGLEVEL;
 
 static char cvtbuf[1024];
 
-static mapsinited = 0;
+static BOOL mapsinited = 0;
 
 static char unix2dos[256];
 static char dos2unix[256];
@@ -36,7 +36,7 @@ static void initmaps() {
     for (k = 0; k < 256; k++) unix2dos[k] = k;
     for (k = 0; k < 256; k++) dos2unix[k] = k;
 
-    mapsinited = 1;
+    mapsinited = True;
 }
 
 static void update_map(char * str) {
index 89a5cf9534bbd2f80c34b7144ef221d9d216cfb1..bc967bdacb48937c3da56fc067e2b734228374fc 100644 (file)
@@ -418,6 +418,9 @@ static BOOL parse_nmb(char *inbuf,int length,struct nmb_packet *nmb)
 
   /* parse the header */
   nmb->header.name_trn_id = RSVAL(inbuf,0);
+
+  DEBUG(10,("parse_nmb: packet id = %d\n", nmb->header.name_trn_id));
+
   nmb->header.opcode = (CVAL(inbuf,2) >> 3) & 0xF;
   nmb->header.response = ((CVAL(inbuf,2)>>7)&1)?True:False;
   nm_flags = ((CVAL(inbuf,2) & 0x7) << 4) + (CVAL(inbuf,3)>>4);
@@ -521,6 +524,8 @@ struct packet_struct *read_packet(int fd,enum packet_type packet_type)
       break;
     }
   if (!ok) {
+    DEBUG(10,("parse_nmb: discarding packet id = %d\n", 
+                 packet->packet.nmb.header.name_trn_id));
     free(packet);
     return(NULL);
   }
index aa41726450f4b190cc985fac0dedef21dc73d4f4..5eb03bc6370f56cbebb6ea3d666221092ef9b74e 100644 (file)
@@ -419,7 +419,7 @@ struct name_record *add_netbios_entry(struct subnet_record *d,
   struct name_record *n2=NULL;
   struct subnet_record *found_subnet = 0;
   int search = 0;
-  BOOL self = source == SELF;
+  BOOL self = (source == SELF);
 
   /* add the name to the WINS list if the name comes from a directed query */
   search |= wins ? FIND_WINS : FIND_LOCAL;
@@ -434,12 +434,19 @@ struct name_record *add_netbios_entry(struct subnet_record *d,
 
   if (!self)
   {
-    if (!wins && type != 0x1b)
+    if (!wins && (type != 0x1b))
     {
        /* the only broadcast (non-WINS) names we are adding are ours
           (SELF) and Domain Master type names */
        return NULL;
     }
+    if(wins && (type == 0x1d))
+    {
+      /* Do not allow any 0x1d names to be registered in a WINS,
+         database although we return success for them.
+       */
+      return NULL;
+    }
   }
 
   n = (struct name_record *)malloc(sizeof(*n));
index 393db363d8689a2cf082fe2e468faf71b0dccd38..ab1f133dd4b92b50d4c7fcef1bf8eac3b7e56072 100644 (file)
@@ -209,13 +209,16 @@ void add_workgroup_to_subnet( struct subnet_record *d, char *group)
     return;
   }
 
-  /* add WORKGROUP(1e) and WORKGROUP(00) entries into name database
-     or register with WINS server, if it's our workgroup 
+  /* add WORKGROUP(00) entries into name database
+     or register with WINS server, if it's our workgroup.
+     Don't register WORKGROUP(0x1e) on the WINS subnet - this is a broadcast
+     only name.
    */
   if (strequal(myworkgroup, group))
   {
-    add_my_name_entry(d,group,0x1e,nb_type|NB_ACTIVE|NB_GROUP);
-    add_my_name_entry(d,group,0x0 ,nb_type|NB_ACTIVE|NB_GROUP);
+    add_my_name_entry(d,group,0x0 ,nb_type|NB_ACTIVE|NB_GROUP,False);
+    if((d != wins_subnet))
+      add_my_name_entry(d,group,0x1e,nb_type|NB_ACTIVE|NB_GROUP,False);
     /* add samba server name to workgroup list. */
     add_server_entry(d,w,myname,w->ServerType,0,lp_serverstring(),True);
     DEBUG(3,("add_workgroup_to_subnet: Added server name entry %s to subnet %s\n",
index b3251d8da63a7e79e54559aeec8c0e43d47279fe..752e27fb070ac10cee4d05a57819ec5e0705ef39 100644 (file)
@@ -325,6 +325,12 @@ void become_local_master(struct subnet_record *d, struct work_record *work)
   if (!work || !d) 
     return;
   
+  if (!lp_local_master())
+  { 
+    DEBUG(0,("Samba not configured as a local master browser.\n"));
+    return;
+  }
+
   DEBUG(2,("Becoming master for %s %s (currently at stage %d)\n",
            work->work_group,inet_ntoa(d->bcast_ip),work->mst_state));
   
@@ -342,7 +348,7 @@ void become_local_master(struct subnet_record *d, struct work_record *work)
       add_server_entry(d,work,myname,work->ServerType,0,lp_serverstring(),True);
 
       /* add special browser name */
-      add_my_name_entry(d,MSBROWSE,0x01,nb_type|NB_ACTIVE|NB_GROUP);
+      add_my_name_entry(d,MSBROWSE,0x01,nb_type|NB_ACTIVE|NB_GROUP,False);
 
       /* DON'T do anything else after calling add_my_name_entry() */
       break;
@@ -357,7 +363,7 @@ void become_local_master(struct subnet_record *d, struct work_record *work)
       add_server_entry(d,work,work->work_group,domain_type,0,myname,True);
 
       /* add master name */
-      add_my_name_entry(d,work->work_group,0x1d,nb_type|NB_ACTIVE);
+      add_my_name_entry(d,work->work_group,0x1d,nb_type|NB_ACTIVE,False);
   
       /* DON'T do anything else after calling add_my_name_entry() */
       break;
@@ -365,7 +371,11 @@ void become_local_master(struct subnet_record *d, struct work_record *work)
 
     case MST_MSB: /* while we were still only registered MSBROWSE state... */
     {
-      DEBUG(3,("2nd stage complete: registered as master browser\n"));
+      int i = 0;
+      struct server_record *sl;
+
+      DEBUG(3,("2nd stage complete: registered as master browser for workgroup %s \
+on subnet %s\n", work->work_group, inet_ntoa(d->bcast_ip)));
       work->mst_state = MST_BROWSER; /* registering WORKGROUP(1d) succeeded */
 
       /* update our server status */
@@ -376,10 +386,16 @@ void become_local_master(struct subnet_record *d, struct work_record *work)
 
       add_server_entry(d,work,myname,work->ServerType,0,lp_serverstring(),True);
 
-      if (work->serverlist == NULL) /* no servers! */
+      /* Count the number of servers we have on our list. If it's
+         less than 10 (just a heuristic) request the servers
+         to announce themselves.
+       */
+      for( sl = work->serverlist; sl != NULL; sl = sl->next)
+        i++;
+
+      if (i < 10)
       {
         /* ask all servers on our local net to announce to us */
-        /* XXXX OOPS! add_server_entry always adds one entry - ours. */
         announce_request(work, d->bcast_ip);
       }
 
@@ -428,56 +444,59 @@ void become_domain_master(struct subnet_record *d, struct work_record *work)
    */
 
   if (!work || !d) return;
-  
+  if (!lp_domain_master())
+  { 
+    DEBUG(0,("Samba not configured as a domain master browser.\n"));
+    return;
+  }
+
   DEBUG(2,("Becoming domain master for %s %s (currently at stage %d)\n",
-                                       work->work_group,inet_ntoa(d->bcast_ip),work->dom_state));
+       work->work_group,inet_ntoa(d->bcast_ip),work->dom_state));
   
   switch (work->dom_state)
   {
     case DOMAIN_NONE: /* while we were nothing but a server... */
     {
-      if (lp_domain_master())
-      {
-                 DEBUG(3,("go to first stage: register <1b> name\n"));
-                 work->dom_state = DOMAIN_WAIT;
-
-                 /* XXXX the 0x1b is domain master browser name */
-                 add_my_name_entry(d, work->work_group,0x1b,nb_type|NB_ACTIVE|NB_GROUP);
-
-                 /* DON'T do anything else after calling add_my_name_entry() */
-                 break;
-      }
+      DEBUG(3,("become_domain_master: go to first stage: register <1b> name\n"));
+      work->dom_state = DOMAIN_WAIT;
+
+      /* Registering the DOMAIN<1b> name is very tricky. We need to
+         do this on all our subnets, but don't want to bradcast it
+         on locally connected subnets (WinNT doesn't do this). Also,
+         previous versions of Samba screw up royally when we do this.
+         We need to register it immediatly on our local subnet, but
+         also actually check with the WINS server if it exists. If the name
+         has already been claimed by someone else in the WINS server
+         then we need to back out all our local registrations and
+         fail. Thus we only directly enter the name on local subnets,
+         on the WINS subnet we actually check...
+      */
+      /* XXXX the 0x1b is domain master browser name */
+      if(d == wins_subnet)
+        add_my_name_entry(d, work->work_group,0x1b,nb_type|NB_ACTIVE,False);
       else
-      {
-        DEBUG(4,("samba not configured as a domain master.\n"));
-      }
-  
+        add_my_name_entry(d, work->work_group,0x1b,nb_type|NB_ACTIVE,True);
+
+      /* DON'T do anything else after calling add_my_name_entry() */
       break;
     }
 
-   case DOMAIN_WAIT:
-   {
-      if (lp_domain_master())
-      {
-        work->dom_state = DOMAIN_MST; /* ... become domain master */
-        DEBUG(3,("domain first stage: register as domain member\n"));
+    case DOMAIN_WAIT:
+    {
+      work->dom_state = DOMAIN_MST; /* ... become domain master */
+      DEBUG(3,("become_domain_master: first stage - register as domain member\n"));
  
-        /* update our server status */
-        work->ServerType |= SV_TYPE_NT|SV_TYPE_DOMAIN_MASTER;
-        add_server_entry(d,work,myname,work->ServerType,0,
-                         lp_serverstring(),True);
+      /* update our server status */
+      work->ServerType |= SV_TYPE_NT|SV_TYPE_DOMAIN_MASTER;
+      add_server_entry(d,work,myname,work->ServerType,0,
+                        lp_serverstring(),True);
 
-        DEBUG(4,("samba is now a domain master\n"));
+      DEBUG(4,("Samba is now a domain master browser for workgroup %s on subnet %s\n", 
+                work->work_group, inet_ntoa(d->bcast_ip)));
 
-        break;
-      }
-      else
-      {
-        DEBUG(4,("samba not configured as a domain master.\n"));
-      }
-  
       break;
-   }
+    }
 
     case DOMAIN_MST:
     {
@@ -496,60 +515,48 @@ void become_logon_server(struct subnet_record *d, struct work_record *work)
 {
   if (!work || !d) return;
   
+  if (lp_domain_logons())
+  {
+    DEBUG(0,("samba not configured as a logon master.\n"));
+    return;
+  }
+
   DEBUG(2,("Becoming logon server for %s %s (currently at stage %d)\n",
-                                       work->work_group,inet_ntoa(d->bcast_ip),work->log_state));
+       work->work_group,inet_ntoa(d->bcast_ip),work->log_state));
   
   switch (work->log_state)
   {
     case LOGON_NONE: /* while we were nothing but a server... */
     {
-      if (lp_domain_logons())
-      {
-                 DEBUG(3,("go to first stage: register <1c> name\n"));
-                 work->log_state = LOGON_WAIT;
+      DEBUG(3,("go to first stage: register <1c> name\n"));
+            work->log_state = LOGON_WAIT;
 
-          /* XXXX the 0x1c is apparently something to do with domain logons */
-          add_my_name_entry(d, myworkgroup,0x1c,nb_type|NB_ACTIVE|NB_GROUP);
+     /* XXXX the 0x1c is apparently something to do with domain logons */
+     add_my_name_entry(d, myworkgroup,0x1c,nb_type|NB_ACTIVE|NB_GROUP,False);
 
-                 /* DON'T do anything else after calling add_my_name_entry() */
-                 break;
-      }
-      {
-        DEBUG(4,("samba not configured as a logon master.\n"));
-      }
-  
+      /* DON'T do anything else after calling add_my_name_entry() */
       break;
     }
 
-   case LOGON_WAIT:
-   {
-      if (lp_domain_logons())
-      {
-        work->log_state = LOGON_SRV; /* ... become logon server */
-        DEBUG(3,("logon second stage: register \n"));
+    case LOGON_WAIT:
+    {
+      work->log_state = LOGON_SRV; /* ... become logon server */
+      DEBUG(3,("logon second stage: register \n"));
  
-        /* update our server status */
-        work->ServerType |= SV_TYPE_NT|SV_TYPE_DOMAIN_MEMBER;
-        add_server_entry(d,work,myname,work->ServerType,0,
-                         lp_serverstring(),True);
+      /* update our server status */
+      work->ServerType |= SV_TYPE_NT|SV_TYPE_DOMAIN_MEMBER;
+      add_server_entry(d,work,myname,work->ServerType,0,
+                      lp_serverstring(),True);
 
-        /* DON'T do anything else after calling add_my_name_entry() */
-        break;
-      }
-      else
-      {
-        DEBUG(4,("samba not configured as a logon server.\n"));
-      }
-  
+      /* DON'T do anything else after calling add_my_name_entry() */
       break;
-   }
+    }
 
-   case LOGON_SRV:
-   {
+    case LOGON_SRV:
+    {
       DEBUG(3,("logon third stage: there isn't one!\n"));
       break;
-   }
-
+    }
   }
 }
 
@@ -584,8 +591,8 @@ void unbecome_local_master(struct subnet_record *d, struct work_record *work,
 
        /* announce ourselves as no longer active as a master browser. */
     announce_server(d, work, work->work_group, myname, 0, 0);
-    remove_name_entry(d,MSBROWSE        ,0x01);
-    remove_name_entry(d,work->work_group,0x1d);
+    remove_name_entry(d,MSBROWSE        ,0x01,False);
+    remove_name_entry(d,work->work_group,0x1d,False);
   }
 }
 
@@ -612,9 +619,17 @@ void unbecome_domain_master(struct subnet_record *d, struct work_record *work,
 
     work->dom_state = DOMAIN_NONE;
 
-       /* announce ourselves as no longer active as a master browser. */
-    announce_server(d, work, work->work_group, myname, 0, 0);
-    remove_name_entry(d,work->work_group,0x1b);    
+    /* announce ourselves as no longer active as a master browser on
+       all our local subnets. */
+    for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_EXCLUDING_WINS(d))
+    {
+      work = find_workgroupstruct(d, myworkgroup, False);
+
+      announce_server(d, work, work->work_group, myname, 0, 0);
+      /* Remove the name entry without any NetBIOS traffic as that's
+         how it was registered. */
+      remove_name_entry(d,work->work_group,0x1b,True);    
+    }
   }
 }
 
@@ -643,7 +658,7 @@ void unbecome_logon_server(struct subnet_record *d, struct work_record *work,
 
        /* announce ourselves as no longer active as a master browser. */
     announce_server(d, work, work->work_group, myname, 0, 0);
-    remove_name_entry(d,work->work_group,0x1c);    
+    remove_name_entry(d,work->work_group,0x1c,False);    
   }
 }
 
index c9db43dcc5fbd601ca2ae698775b9ab6f2688c4c..31cad927911f3e90e1c4cff28ce5115ed8a9be62 100644 (file)
@@ -324,7 +324,7 @@ static BOOL listening(struct packet_struct *p,struct nmb_name *n)
   struct name_record *n1;
 
   /* We explicitly don't search WINS here - this will be done
-     in find_name_search is it was a packet from a non-local subnet. */
+     in find_name_search if it was a packet from a non-local subnet. */
   d = find_subnet(p->ip);
 
   n1 = find_name_search(&d,n,FIND_LOCAL|FIND_WINS|FIND_SELF,p->ip);
@@ -345,13 +345,21 @@ static void process_dgram(struct packet_struct *p)
 
   /* if we aren't listening to the destination name then ignore the packet */
   if (!listening(p,&dgram->dest_name))
+  {
+    DEBUG(5,("process_dgram: ignoring dgram packet sent to name %s(%x) from %s\n",
+           dgram->dest_name.name, dgram->dest_name.name_type, inet_ntoa(p->ip)));
     return;
-
+  }
 
   if (dgram->header.msg_type != 0x10 &&
       dgram->header.msg_type != 0x11 &&
-      dgram->header.msg_type != 0x12) {
+      dgram->header.msg_type != 0x12) 
+  {
     /* don't process error packets etc yet */
+    DEBUG(5,("process_dgram: ignoring dgram packet sent to name %s(%d) from %s as it is \
+           an error packet of type %x\n",
+           dgram->dest_name.name, dgram->dest_name.name_type, 
+           inet_ntoa(p->ip), dgram->header.msg_type));
     return;
   }
 
@@ -364,7 +372,7 @@ static void process_dgram(struct packet_struct *p)
   len = SVAL(buf,smb_vwv11);
   buf2 = smb_base(buf) + SVAL(buf,smb_vwv12);
 
-  DEBUG(4,("datagram from %s to %s for %s of type %d len=%d\n",
+  DEBUG(4,("process_dgram: datagram from %s to %s for %s of type %d len=%d\n",
           namestr(&dgram->source_name),namestr(&dgram->dest_name),
           smb_buf(buf),CVAL(buf2,0),len));
 
index 91636428961327b884d0afafa74e62f5a5bce1fc..93111eb2689fa23aad303138d0d36a06ea1441db 100644 (file)
@@ -51,8 +51,12 @@ extern uint16 nb_type; /* samba's NetBIOS type */
   note: the name will _always_ be removed
   XXXX at present, the name is removed _even_ if a WINS server says keep it.
 
+  If direct is True then the name being removed must have been a direct name
+  add. This is done for special names such as DOMAIN<1b>. Just delete it
+  without any network release traffic.
+
   ****************************************************************************/
-void remove_name_entry(struct subnet_record *d, char *name,int type)
+void remove_name_entry(struct subnet_record *d, char *name,int type, BOOL direct)
 {
   /* XXXX BUG: if samba is offering WINS support, it should still broadcast
       a de-registration packet to the local subnet before removing the
@@ -83,7 +87,7 @@ void remove_name_entry(struct subnet_record *d, char *name,int type)
 
   if (ip_equal(d->bcast_ip, wins_ip))
   {
-    if (!lp_wins_support())
+    if (!lp_wins_support() && !direct)
     {
       /* not a WINS server: we have to release them on the network */
       queue_netbios_pkt_wins(ClientNMB,NMB_REL,NAME_RELEASE,
@@ -93,8 +97,9 @@ void remove_name_entry(struct subnet_record *d, char *name,int type)
   }
   else
   {
-    /* local interface: release them on the network */
-    queue_netbios_packet(d,ClientNMB,NMB_REL,NAME_RELEASE,
+    if(!direct)
+      /* local interface: release them on the network */
+      queue_netbios_packet(d,ClientNMB,NMB_REL,NAME_RELEASE,
                         name, type, 0, 0,0,NULL,NULL,
                         True, True, d->bcast_ip, d->bcast_ip);
   }
@@ -103,12 +108,16 @@ void remove_name_entry(struct subnet_record *d, char *name,int type)
 
 /****************************************************************************
   add an entry to the name list
-  
+  If the direct BOOL is set then no network traffic is done for the add - it
+  is just blasted into the subnet entry with a zero TTL - it will not
+  expire and has not been legitimately claimed. This is *only* done if
+  we are a WINS server or for a special name such as DOMAIN<1b>.
   big note: our name will _always_ be added (if there are no objections).
   it's just a matter of when this will be done (e.g after a time-out).
 
   ****************************************************************************/
-void add_my_name_entry(struct subnet_record *d,char *name,int type,int nb_flags)
+void add_my_name_entry(struct subnet_record *d,char *name,int type,int nb_flags, BOOL direct)
 {
   BOOL re_reg = False;
   struct nmb_name n;
@@ -128,15 +137,14 @@ void add_my_name_entry(struct subnet_record *d,char *name,int type,int nb_flags)
 
   if (ip_equal(d->bcast_ip, wins_ip))
   {
-    if (lp_wins_support())
+    if (lp_wins_support() || direct)
     {
       /* we are a WINS server. */
-      /* XXXX assume that if we are a WINS server that we are therefore
-         not pointing to another WINS server as well. this may later NOT
-         actually be true
-       */
-
-      DEBUG(4,("samba as WINS server adding: "));
+      if(lp_wins_support())
+        DEBUG(4,("add_my_name_entry: samba as WINS server adding: "));
+      else
+        DEBUG(4,("add_my_name_entry: direct name entry : adding: "));
+        
       /* this will call add_netbios_entry() */
       name_register_work(d, name, type, nb_flags,0, ipzero, False);
     }
@@ -154,11 +162,23 @@ void add_my_name_entry(struct subnet_record *d,char *name,int type,int nb_flags)
   }
   else
   {
-    /* broadcast the packet, but it comes from ipzero */
-       queue_netbios_packet(d,ClientNMB,
-                                re_reg ? NMB_REG_REFRESH : NMB_REG, NAME_REGISTER,
-                            name, type, nb_flags, GET_TTL(0),0,NULL,NULL,
-                            True, True, d->bcast_ip, ipzero);
+    if(direct)
+    {
+      /* Just enter the name to be the ip address of the subnet
+         via name_register_work to ensure all side effects are done.
+       */
+      DEBUG(4,("add_my_name_entry: direct name entry : adding: "));
+      /* this will call add_netbios_entry() */
+      name_register_work(d, name, type, nb_flags,0, d->myip, False);
+    }
+    else
+    {
+      /* broadcast the packet, but it comes from ipzero */
+      queue_netbios_packet(d,ClientNMB,
+        re_reg ? NMB_REG_REFRESH : NMB_REG, NAME_REGISTER,
+         name, type, nb_flags, GET_TTL(0),0,NULL,NULL,
+        True, True, d->bcast_ip, ipzero);
+    }
   }
 }
 
@@ -210,34 +230,47 @@ void add_domain_names(time_t t)
 browser on workgroup %s %s\n",
                   timestring(), myworkgroup, inet_ntoa(d->bcast_ip)));
 
-        if (lp_wins_support())
+        if(d == wins_subnet)
         {
-          /* use the wins server's capabilities (indirectly).  if
-             someone has already registered the domain<1b> name with 
-             the WINS server, then the WINS server's job is to _check_
-             that the owner still wants it, before giving it away.
-           */
+          if (lp_wins_support())
+          {
+            /* use the wins server's capabilities (indirectly).  if
+               someone has already registered the domain<1b> name with 
+               the WINS server, then the WINS server's job is to _check_
+               that the owner still wants it, before giving it away.
+             */
                
-          DEBUG(1,("%s initiating becoming domain master for %s\n",
+            DEBUG(1,("%s initiating becoming domain master for %s\n",
                        timestring(), myworkgroup));
-          become_domain_master(d, work);
-        }
-        else
-        {
-          /* send out a query to establish whether there's a 
-             domain controller on the WINS subnet.  if not,
-             we can become a domain controller.
-             it's only polite that we check, before claiming the
-             NetBIOS name 0x1b.
-           */
-
-          DEBUG(0,("add_domain_names:querying WINS for domain master \
+            become_domain_master(d, work);
+          }
+          else
+          {
+            /* send out a query to establish whether there's a 
+               domain controller on the WINS subnet.  if not,
+               we can become a domain controller.
+               it's only polite that we check, before claiming the
+               NetBIOS name 0x1b.
+             */
+
+            DEBUG(0,("add_domain_names:querying WINS for domain master \
 on workgroup %s\n", myworkgroup));
 
-          queue_netbios_pkt_wins(ClientNMB,NMB_QUERY,NAME_QUERY_DOMAIN,
-                               myworkgroup, 0x1b,
+            queue_netbios_pkt_wins(ClientNMB,NMB_QUERY,NAME_QUERY_DOMAIN,
+                               myworkgroup, 0x1b,
                                0, 0,0,NULL,NULL,
                                False, False, ipzero, ipzero);
+          }
+        }
+        else
+        {
+          DEBUG(0,("add_domain_names:querying subnet %s for domain master \
+on workgroup %s\n", inet_ntoa(d->bcast_ip), myworkgroup));
+          queue_netbios_packet(d,ClientNMB,NMB_QUERY,NAME_QUERY_DOMAIN,
+                              myworkgroup, 0x1b,
+                              0, 0,0,NULL,NULL,
+                              True, False,
+                              d->bcast_ip, d->bcast_ip);
         }
       }
     }
@@ -261,10 +294,9 @@ void add_my_names(void)
   {
     BOOL wins = (lp_wins_support() && (d == wins_subnet));
 
-    add_my_name_entry(d, myname,0x20,nb_type|NB_ACTIVE);
-    add_my_name_entry(d, myname,0x03,nb_type|NB_ACTIVE);
-    add_my_name_entry(d, myname,0x00,nb_type|NB_ACTIVE);
-    add_my_name_entry(d, myname,0x1f,nb_type|NB_ACTIVE);
+    add_my_name_entry(d, myname,0x20,nb_type|NB_ACTIVE,False);
+    add_my_name_entry(d, myname,0x03,nb_type|NB_ACTIVE,False);
+    add_my_name_entry(d, myname,0x00,nb_type|NB_ACTIVE,False);
     
     /* these names are added permanently (ttl of zero) and will NOT be
        refreshed with the WINS server  */
@@ -295,7 +327,7 @@ void remove_my_names()
                                /* get all SELF names removed from the WINS server's database */
                                /* XXXX note: problem occurs if this removes the wrong one! */
 
-                               remove_name_entry(d,n->name.name, n->name.name_type);
+                               remove_name_entry(d,n->name.name, n->name.name_type,False);
                        }
                }
        }
@@ -313,14 +345,14 @@ void refresh_my_names(time_t t)
   {
     struct name_record *n;
          
-       for (n = d->namelist; n; n = n->next)
+    for (n = d->namelist; n; n = n->next)
     {
       /* each SELF name has an individual time to be refreshed */
       if (n->source == SELF && n->refresh_time < t && 
           n->death_time != 0)
       {
         add_my_name_entry(d,n->name.name,n->name.name_type,
-                          n->ip_flgs[0].nb_flags);
+                          n->ip_flgs[0].nb_flags,False);
        /* they get a new lease on life :-) */
        n->death_time += GET_TTL(0);
        n->refresh_time += GET_TTL(0);
index 00e940df671e9ca3502c3cfbe70937b7c8b08cff..a4888b04d4d5d2dfd2d49ff1cf44374ca8847265 100644 (file)
@@ -195,7 +195,7 @@ void reply_name_reg(struct packet_struct *p)
   
   if (!(d = find_req_subnet(p->ip, bcast)))
   {
-    DEBUG(3,("response packet: bcast %s not known\n",
+    DEBUG(3,("reply_name_reg: subnet %s not known\n",
                                inet_ntoa(p->ip)));
     return;
   }
index 27356d95e602f1186ce8766fbe8024839246da08..226a997c5f3673066f7d8d5a82f84700df169318 100644 (file)
@@ -37,7 +37,11 @@ extern int ClientNMB;
 extern int DEBUGLEVEL;
 
 extern pstring scope;
+extern fstring myworkgroup;
 extern struct in_addr ipzero;
+extern struct in_addr wins_ip;
+extern struct in_addr ipzero;
+
 
 #define GET_TTL(ttl) ((ttl)?MIN(ttl,lp_max_ttl()):lp_max_ttl())
 
@@ -99,7 +103,20 @@ static void response_name_reg(struct nmb_name *ans_name,
   
   DEBUG(4,("response name registration received!\n"));
   
+#if 1
+  /* This code is neccesitated due to bugs in earlier versions of
+     Samba (up to 1.9.16p11). They respond to a broadcast
+     name registration of WORKGROUP<1b> when they should
+     not. Hence, until these versions are gone, we should
+     treat such errors as success for this particular
+     case only. jallison@whistle.com.
+   */
+  if ( ((d != wins_subnet) && (nmb->header.rcode == 6) && strequal(myworkgroup, name) &&
+         (type == 0x1b)) ||
+       (nmb->header.rcode == 0 && nmb->answers->rdata))
+#else
   if (nmb->header.rcode == 0 && nmb->answers->rdata)
+#endif
   {
     /* IMPORTANT: see expire_netbios_response_entries() */
 
@@ -489,6 +506,55 @@ static void response_name_query_sync(struct nmb_packet *nmb,
     }
 }
 
+/****************************************************************************
+  response from a name query for DOMAIN<1b>
+  NAME_QUERY_DOMAIN is dealt with here - we are trying to become a domain
+  master browser and WINS replied - check it's our address.
+  ****************************************************************************/
+static void response_name_query_domain(struct nmb_name *ans_name,
+                struct nmb_packet *nmb,
+                struct response_record *n, struct subnet_record *d)
+{
+  DEBUG(4, ("response_name_query_domain: Got %s response from %s for query \
+for %s\n", nmb->header.rcode == 0 ? "success" : "failure",
+           inet_ntoa(n->send_ip), namestr(ans_name)));
+
+  /* Check the name is correct and ip address returned is our own. If it is then we
+     just remove the response record.
+   */
+  if (name_equal(&n->name, ans_name) && (nmb->header.rcode == 0) && (nmb->answers->rdata))
+  {
+    struct in_addr found_ip;
+
+    putip((char*)&found_ip,&nmb->answers->rdata[2]);
+    /* Samba 1.9.16p11 servers seem to return the broadcast address for this
+       query. */
+    if (ismyip(found_ip) || ip_equal(wins_ip, found_ip) || ip_equal(ipzero, found_ip))
+    {
+      DEBUG(4, ("response_name_query_domain: WINS server returned our ip \
+address. Pretending we never received response.\n"));
+      n->num_msgs = 0;
+      n->repeat_count = 0;
+      n->repeat_time = 0;
+    }
+    else
+    {
+      DEBUG(0,("response_name_query_domain: WINS server already has a \
+domain master browser registered %s at address %s\n", 
+           namestr(ans_name), inet_ntoa(found_ip)));
+    }
+  }
+  else
+  {
+    /* Negative/incorrect response. No domain master
+       browser was registered - pretend we didn't get this response.
+     */
+    n->num_msgs = 0;
+    n->repeat_count = 0;
+    n->repeat_time = 0;
+  }
+
+}
 
 /****************************************************************************
   report the response record type
@@ -521,6 +587,7 @@ void debug_state_type(int state)
     case NAME_QUERY_SYNC_LOCAL   : DEBUG(4,("NAME_QUERY_SYNC_LOCAL\n")); break;
     case NAME_QUERY_SYNC_REMOTE  : DEBUG(4,("NAME_QUERY_SYNC_REMOTE\n")); break;
     case NAME_QUERY_ANNOUNCE_HOST: DEBUG(4,("NAME_QUERY_ANNCE_HOST\n"));break;
+    case NAME_QUERY_DOMAIN       : DEBUG(4,("NAME_QUERY_DOMAIN\n")); break;
       
     case NAME_REGISTER           : DEBUG(4,("NAME_REGISTER\n")); break;
     case NAME_REGISTER_CHALLENGE : DEBUG(4,("NAME_REGISTER_CHALLENGE\n"));break;
@@ -593,7 +660,7 @@ static BOOL response_problem_check(struct response_record *n,
                      {
                      case NAME_QUERY_FIND_MST:
                        {
-                         /* query for ^1^2__MSBROWSE__^2^1 expect 
+                         /* query for ^1^2__MSBROWSE__^2^1 expect
                             lots of responses */
                          return False;
                        }
@@ -768,7 +835,22 @@ static void response_process(struct subnet_record *d, struct packet_struct *p,
                  namestr(&n->name), inet_ntoa(n->send_ip)));
        break;
       }
-    
+   
+    case NAME_QUERY_DOMAIN:
+      {
+        /* We were asking to be a domain master browser, and someone
+           replied. If it was the WINS server and the IP it is
+           returning is our own - then remove the record and pretend
+           we didn't get a response. Else we do nothing and let 
+           dead_netbios_entry deal with it. 
+           We can only become domain master browser
+           when no broadcast responses are received and WINS
+           either contains no entry for the DOMAIN<1b> name or
+           contains our IP address.
+         */
+        response_name_query_domain(ans_name, nmb, n, d);
+        break;
+      }
     default:
       {
        DEBUG(1,("unknown state type received in response_netbios_packet\n"));
index 11f005b78521fcbc88bfc3e0d09e9ff3d5cbf68f..99d65d551aa3f90c3bcf8da7129f8397a96f09fd 100644 (file)
@@ -73,6 +73,8 @@ static int sig_term()
   /* XXXX other things: if we are a master browser, force an election? */
   
   exit(0);
+  /* Keep compiler happy.. */
+  return 0;
 }
 
 
index 4ae139fc58eeb6ed14b9d76e013cb949385b1cee..51710b7b77959517bff320749b797f5ae2ba305c 100644 (file)
@@ -1358,7 +1358,7 @@ BOOL check_file_sharing(int cnum,char *fname)
     if (old_shares[i].share_mode != DENY_DOS)
       goto free_and_exit;
 
-    if(old_shares[i].pid != pid);
+    if(old_shares[i].pid != pid)
       goto free_and_exit;
   }
 
index 1d9977c66e0e557e7eda56de217f4e1c5b2a4bca..1f727c4ecdf7907c0ba7c8baeb10322ccc4aa29d 100644 (file)
@@ -941,7 +941,6 @@ static int call_trans2qfsinfo(char *inbuf, char *outbuf, int length, int bufsize
       DEBUG(5,("call_trans2qfsinfo : SMB_QUERY_FS_VOLUME_INFO namelen = %d, vol = %s\n", strlen(vname),
               vname));
       break;
-      break;
     case SMB_QUERY_FS_SIZE_INFO:
       {
        int dfree,dsize,bsize;
index e2c5f590b7aaf5906a002d333f7bd981a47f9c83..7a903e05511336d72eaf18dd7af424538f295893 100644 (file)
@@ -466,6 +466,5 @@ int smbrun(char *cmd,char *outfile,BOOL shared)
   /* not reached */
   exit(82);
 #endif
+  return 1;
 }
-
-