alignment issue for UDP SAMLOGON response.
[samba.git] / source3 / nmbd / nmbd_processlogon.c
index ae917564fe2ed8fe374f7cd157ea18f741b3f759..fb5dec29f9b47ee94a60ae83564a6a2205f52aac 100644 (file)
@@ -2,9 +2,9 @@
    Unix SMB/Netbios implementation.
    Version 1.9.
    NBT netbios routines and daemon - version 2
-   Copyright (C) Andrew Tridgell 1994-1997
-   Copyright (C) Luke Kenneth Casson Leighton 1994-199
-   Copyright (C) Jeremy Allison 1994-1997
+   Copyright (C) Andrew Tridgell 1994-1998
+   Copyright (C) Luke Kenneth Casson Leighton 1994-1998
+   Copyright (C) Jeremy Allison 1994-1998
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -28,8 +28,8 @@
 
 extern int DEBUGLEVEL;
 
-extern pstring myname;
-extern fstring myworkgroup;
+extern pstring global_myname;
+extern fstring global_myworkgroup;
 
 /****************************************************************************
 Process a domain logon packet
@@ -41,34 +41,27 @@ void process_logon_packet(struct packet_struct *p,char *buf,int len,
   struct dgram_packet *dgram = &p->packet.dgram;
   pstring my_name;
   fstring reply_name;
-  BOOL add_slashes = False;
   pstring outbuf;
-  int code,reply_code;
-  char   unknown_byte = 0;
-  uint16 request_count = 0;
+  int code;
   uint16 token = 0;
-
   uint32 ntversion;
   uint16 lmnttoken;
   uint16 lm20token;
-  uint32 allowableaccount; /* Control bits, i.e. 0x80 == workstation trust a/c. */
   uint32 domainsidsize;
-  uint16 requestcount;
-  char *domainsid;
   char *getdc;
   char *uniuser; /* Unicode user name. */
-  pstring ascuser;
   char *unicomp; /* Unicode computer name. */
-  struct smb_passwd *smb_pass; /* To check if machine account exists */
+
+  memset(outbuf, 0, sizeof(outbuf));
 
   if (!lp_domain_logons())
   {
-    DEBUG(3,("process_logon_packet: Logon packet received from IP %S and domain \
+    DEBUG(3,("process_logon_packet: Logon packet received from IP %s and domain \
 logons are not enabled.\n", inet_ntoa(p->ip) ));
     return;
   }
 
-  strcpy(my_name, myname);
+  pstrcpy(my_name, global_myname);
   strupper(my_name);
 
   code = SVAL(buf,0);
@@ -84,25 +77,23 @@ logons are not enabled.\n", inet_ntoa(p->ip) ));
 
       getdc = skip_string(user,1);
       q = skip_string(getdc,1);
-      unknown_byte = CVAL(q,0);
-      request_count = SVAL(q,1);
       token = SVAL(q,3);
 
-      reply_code = 0x6;
-      strcpy(reply_name,my_name); 
-      add_slashes = True;
+      fstrcpy(reply_name,my_name); 
 
       DEBUG(3,("process_logon_packet: Domain login request from %s at IP %s user=%s token=%x\n",
              machine,inet_ntoa(p->ip),user,token));
 
       q = outbuf;
-      SSVAL(q, 0, 6); q += 2;
+      SSVAL(q, 0, 6);
+      q += 2;
 
-      strcpy(reply_name, "\\\\");
-      strcat(reply_name, my_name);
-      strcpy(q, reply_name); q = skip_string(q, 1); /* PDC name */
+      fstrcpy(reply_name, "\\\\");
+      fstrcat(reply_name, my_name);
+      fstrcpy(q, reply_name); q = skip_string(q, 1); /* PDC name */
 
-      SSVAL(q, 0, token); q += 2;
+      SSVAL(q, 0, token);
+      q += 2;
 
       dump_data(4, outbuf, PTR_DIFF(q, outbuf));
 
@@ -112,7 +103,7 @@ logons are not enabled.\n", inet_ntoa(p->ip) ));
                     dgram->dest_name.name_type,
                     dgram->source_name.name,
                     dgram->source_name.name_type,
-                    p->ip, *iface_ip(p->ip));  
+                    p->ip, *iface_ip(p->ip), p->port);  
       break;
     }
 
@@ -126,32 +117,37 @@ logons are not enabled.\n", inet_ntoa(p->ip) ));
 
       q = align2(unicomp, buf);
 
-      q = skip_unicode_string(q, 1);
+      q = skip_unibuf(q, buf+len-q);
 
-      ntversion = IVAL(q, 0); q += 4;
-      lmnttoken = SVAL(q, 0); q += 2;
-      lm20token = SVAL(q, 0); q += 2;
+      ntversion = IVAL(q, 0);
+      q += 4;
+      lmnttoken = SVAL(q, 0);
+      q += 2;
+      lm20token = SVAL(q, 0);
+      q += 2;
 
       /* Construct reply. */
 
       q = outbuf;
-      SSVAL(q, 0, QUERYFORPDC_R); q += 2;
+      SSVAL(q, 0, QUERYFORPDC_R);
+      q += 2;
 
-      strcpy(reply_name,my_name);
-      strcpy(q, reply_name); q = skip_string(q, 1); /* PDC name */
+      fstrcpy(reply_name,my_name);
+      fstrcpy(q, reply_name);
+      q = skip_string(q, 1); /* PDC name */
 
-      if (strcmp(mailslot, NT_LOGON_MAILSLOT)==0) {
-        q = align2(q, buf);
+      q = align2(q, buf);
 
-        PutUniCode(q, my_name); /* PDC name */
-        q = skip_unicode_string(q, 1); 
-        PutUniCode(q, myworkgroup); /* Domain name*/
-        q = skip_unicode_string(q, 1); 
+      /* PDC and domain name */
+      q = ascii_to_unibuf(q, my_name, outbuf+sizeof(outbuf)-q-2);
+      q = ascii_to_unibuf(q, global_myworkgroup, outbuf+sizeof(outbuf)-q-2);
 
-        SIVAL(q, 0, ntversion); q += 4;
-        SSVAL(q, 0, lmnttoken); q += 2;
-        SSVAL(q, 0, lm20token); q += 2;
-      }
+      SIVAL(q, 0, ntversion);
+      q += 4;
+      SSVAL(q, 0, lmnttoken);
+      q += 2;
+      SSVAL(q, 0, lm20token);
+      q += 2;
 
       DEBUG(3,("process_logon_packet: GETDC request from %s at IP %s, \
 reporting %s domain %s 0x%x ntversion=%x lm_nt token=%x lm_20 token=%x\n",
@@ -167,7 +163,7 @@ reporting %s domain %s 0x%x ntversion=%x lm_nt token=%x lm_20 token=%x\n",
                   dgram->dest_name.name_type,
                   dgram->source_name.name,
                   dgram->source_name.name_type,
-                  p->ip, *iface_ip(p->ip));  
+                  p->ip, *iface_ip(p->ip), p->port);  
       return;
     }
 
@@ -175,59 +171,65 @@ reporting %s domain %s 0x%x ntversion=%x lm_nt token=%x lm_20 token=%x\n",
     {
       char *q = buf + 2;
 
-      requestcount = SVAL(q, 0); q += 2;
+      q += 2;
       unicomp = q;
-      uniuser = skip_unicode_string(unicomp,1);
-      getdc = skip_unicode_string(uniuser,1);
+      uniuser = skip_unibuf(unicomp, buf+len-q);
+      getdc = skip_unibuf(uniuser, buf+len-q);
       q = skip_string(getdc,1);
-      allowableaccount = IVAL(q, 0); q += 4;
-      domainsidsize = IVAL(q, 0); q += 4;
-      domainsid = q;
-      q += domainsidsize + 3;
-      ntversion = IVAL(q, 0); q += 4;
-      lmnttoken = SVAL(q, 0); q += 2;
-      lm20token = SVAL(q, 0); q += 2;
+      q += 4;
+      domainsidsize = IVAL(q, 0);
+      q += 4;
+      q += domainsidsize;
+      q = align4(q, buf);
 
-      DEBUG(3,("process_logon_packet: SAMLOGON sidsize %d ntv %d\n", domainsidsize, ntversion));
+      ntversion = IVAL(q, 0);
+      q += 4;
+      lmnttoken = SVAL(q, 0);
+      q += 2;
+      lm20token = SVAL(q, 0);
+      q += 2;
+
+      DEBUG(3,("process_logon_packet: SAMLOGON sidsize %d ntv %x\n", domainsidsize, ntversion));
 
       /*
-       * If MACHINE$ is in our password database then respond, else ignore.
+       * we respond regadless of whether the machine is in our password 
+       * database. If it isn't then we let smbd send an appropriate error.
        * Let's ignore the SID.
        */
 
-      strcpy(ascuser, unistr(uniuser));
-      DEBUG(3,("process_logon_packet: SAMLOGON user %s\n", ascuser));
+      fstrcpy(reply_name,"\\\\"); /* Here it wants \\LOGONSERVER. */
+      fstrcpy(reply_name+2,my_name); 
 
-      strcpy(reply_name,"\\\\"); /* Here it wants \\LOGONSERVER. */
-      strcpy(reply_name+2,my_name); 
+      if (DEBUGLVL(3))
+       {
+             fstring ascuser;
+             fstring asccomp;
 
-      smb_pass = get_smbpwd_entry(ascuser, 0);
+             unibuf_to_ascii(ascuser, uniuser, sizeof(ascuser)-1);
+             unibuf_to_ascii(asccomp, unicomp, sizeof(asccomp)-1);
 
-      if(!smb_pass)
-      {
-        DEBUG(3,("process_logon_packet: SAMLOGON request from %s(%s) for %s, not in password file\n",
-           unistr(unicomp),inet_ntoa(p->ip), ascuser));
-        return;
-      }
-      else
-      {
-        DEBUG(3,("process_logon_packet: SAMLOGON request from %s(%s) for %s, returning logon svr %s domain %s code %x token=%x\n",
-           unistr(unicomp),inet_ntoa(p->ip), ascuser, reply_name, myworkgroup,
-           SAMLOGON_R ,lmnttoken));
+             DEBUGADD(3,("process_logon_packet: SAMLOGON request from %s(%s) for %s, returning logon svr %s domain %s code %x token=%x\n",
+                         asccomp,inet_ntoa(p->ip), ascuser, reply_name,
+                         global_myworkgroup, SAMLOGON_R, lmnttoken));
       }
 
       /* Construct reply. */
 
       q = outbuf;
-      SSVAL(q, 0, SAMLOGON_R); q += 2;
+      SSVAL(q, 0, SAMLOGON_R);
+      q += 2;
 
-      PutUniCode(q, reply_name); q = skip_unicode_string(q, 1);
-      unistrcpy(q, uniuser); q = skip_unicode_string(q, 1); /* User name (workstation trust account) */
-      PutUniCode(q, lp_workgroup()); q = skip_unicode_string(q, 1); /* Domain name. */
+      /* Logon server, trust account, domain */
+      q = ascii_to_unibuf(q, reply_name, outbuf+sizeof(outbuf)-q-2);
+      q = uni_strncpy(q, uniuser, outbuf+sizeof(outbuf)-q-2);
+      q = ascii_to_unibuf(q, lp_workgroup(), outbuf+sizeof(outbuf)-q-2);
 
-      SIVAL(q, 0, ntversion); q += 4;
-      SSVAL(q, 0, lmnttoken); q += 2;
-      SSVAL(q, 0, lm20token); q += 2;
+      SIVAL(q, 0, ntversion);
+      q += 4;
+      SSVAL(q, 0, lmnttoken);
+      q += 2;
+      SSVAL(q, 0, lm20token);
+      q += 2;
 
       dump_data(4, outbuf, PTR_DIFF(q, outbuf));
 
@@ -237,7 +239,7 @@ reporting %s domain %s 0x%x ntversion=%x lm_nt token=%x lm_20 token=%x\n",
                    dgram->dest_name.name_type,
                    dgram->source_name.name,
                    dgram->source_name.name_type,
-                   p->ip, *iface_ip(p->ip));  
+                   p->ip, *iface_ip(p->ip), p->port);  
       break;
     }