s3-nmbd: use autogenerated marshalling for LOGON_REQUEST.
authorGünther Deschner <gd@samba.org>
Thu, 9 Sep 2010 20:39:05 +0000 (22:39 +0200)
committerGünther Deschner <gd@samba.org>
Thu, 9 Sep 2010 21:07:11 +0000 (23:07 +0200)
Guenther

source3/nmbd/nmbd_processlogon.c

index ff05e9c9ca4b846556281f3cfa3bb455c292f8bd..0fff424b3fdc55489be49e45d95f42d733d7f819 100644 (file)
@@ -312,7 +312,6 @@ void process_logon_packet(struct packet_struct *p, char *buf,int len,
        fstring my_name;
        fstring reply_name;
        char outbuf[1024];
-       uint16 token = 0;
        uint32 ntversion = 0;
        uint16 lmnttoken = 0;
        uint16 lm20token = 0;
@@ -327,9 +326,12 @@ void process_logon_packet(struct packet_struct *p, char *buf,int len,
        const struct sockaddr_storage *pss;
        struct in_addr ip;
 
-       DATA_BLOB blob_in;
+       DATA_BLOB blob_in, blob_out;
        enum ndr_err_code ndr_err;
        struct nbt_netlogon_packet request;
+       struct nbt_netlogon_response response;
+       NTSTATUS status;
+       const char *pdc_name;
 
        in_addr_to_sockaddr_storage(&ss, p->ip);
        pss = iface_ip((struct sockaddr *)&ss);
@@ -353,6 +355,11 @@ logons are not enabled.\n", inet_ntoa(p->ip) ));
 
        pull_ascii_nstring(source_name, sizeof(source_name), dgram->source_name.name);
 
+       pdc_name = talloc_asprintf(talloc_tos(), "\\\\%s", global_myname());
+       if (!pdc_name) {
+               return;
+       }
+
        ZERO_STRUCT(request);
 
        blob_in = data_blob_const(buf, len);
@@ -372,60 +379,35 @@ logons are not enabled.\n", inet_ntoa(p->ip) ));
                inet_ntoa(p->ip), request.command));
 
        switch (request.command) {
-       case 0: {
-               fstring mach_str, user_str, getdc_str;
-               char *q = buf + 2;
-               char *machine = q;
-               char *user = skip_string(buf,len,machine);
-
-               if (!user || PTR_DIFF(user, buf) >= len) {
-                       DEBUG(0,("process_logon_packet: bad packet\n"));
-                       return;
-               }
-               getdc = skip_string(buf,len,user);
-
-               if (!getdc || PTR_DIFF(getdc, buf) >= len) {
-                       DEBUG(0,("process_logon_packet: bad packet\n"));
-                       return;
-               }
-               q = skip_string(buf,len,getdc);
-
-               if (!q || PTR_DIFF(q + 5, buf) > len) {
-                       DEBUG(0,("process_logon_packet: bad packet\n"));
-                       return;
-               }
-               token = SVAL(q,3);
-
-               fstrcpy(reply_name,my_name);
+       case LOGON_REQUEST: {
 
-               pull_ascii_fstring(mach_str, machine);
-               pull_ascii_fstring(user_str, user);
-               pull_ascii_fstring(getdc_str, getdc);
+               struct nbt_netlogon_response2 response2;
 
                DEBUG(5,("process_logon_packet: Domain login request from %s at IP %s user=%s token=%x\n",
-                       mach_str,inet_ntoa(p->ip),user_str,token));
+                       request.req.logon0.computer_name, inet_ntoa(p->ip),
+                       request.req.logon0.user_name,
+                       request.req.logon0.lm20_token));
 
-               q = outbuf;
-               SSVAL(q, 0, 6);
-               q += 2;
+               response2.command       = LOGON_RESPONSE2;
+               response2.pdc_name      = pdc_name;
+               response2.lm20_token    = 0xffff;
 
-               fstrcpy(reply_name, "\\\\");
-               fstrcat(reply_name, my_name);
-               size = push_ascii(q,reply_name,
-                               sizeof(outbuf)-PTR_DIFF(q, outbuf),
-                               STR_TERMINATE);
-               if (size == (size_t)-1) {
+               response.response_type = NETLOGON_RESPONSE2;
+               response.data.response2 = response2;
+
+               status = push_nbt_netlogon_response(&blob_out, talloc_tos(), &response);
+               if (!NT_STATUS_IS_OK(status)) {
+                       DEBUG(0,("process_logon_packet: failed to push packet\n"));
                        return;
                }
-               q = skip_string(outbuf,sizeof(outbuf),q); /* PDC name */
-
-               SSVAL(q, 0, token);
-               q += 2;
 
-               dump_data(4, (uint8 *)outbuf, PTR_DIFF(q, outbuf));
+               if (DEBUGLEVEL >= 10) {
+                       NDR_PRINT_DEBUG(nbt_netlogon_response2, &response.data.response2);
+               }
 
-               send_mailslot(True, getdc_str,
-                               outbuf,PTR_DIFF(q,outbuf),
+               send_mailslot(True, request.req.logon0.mailslot_name,
+                               (char *)blob_out.data,
+                               blob_out.length,
                                global_myname(), 0x0,
                                source_name,
                                dgram->source_name.name_type,