Ignore:
Timestamp:
Apr 10, 2007, 5:27:38 AM (14 years ago)
Author:
Paul Smedley
Message:

Updated source to 3.0.25rc1

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/samba/source/nmbd/nmbd_processlogon.c

    r1 r26  
    9292        pstrcpy(my_name, global_myname());
    9393
    94         code = SVAL(buf,0);
     94        code = get_safe_SVAL(buf,len,buf,0,-1);
    9595        DEBUG(4,("process_logon_packet: Logon from %s: code = 0x%x\n", inet_ntoa(p->ip), code));
    9696
     
    101101                                char *q = buf + 2;
    102102                                char *machine = q;
    103                                 char *user = skip_string(machine,1);
    104 
    105                                 if (PTR_DIFF(user, buf) >= len) {
    106                                         DEBUG(0,("process_logon_packet: bad packet\n"));
    107                                         return;
    108                                 }
    109                                 getdc = skip_string(user,1);
    110 
    111                                 if (PTR_DIFF(getdc, buf) >= len) {
    112                                         DEBUG(0,("process_logon_packet: bad packet\n"));
    113                                         return;
    114                                 }
    115                                 q = skip_string(getdc,1);
    116 
    117                                 if (PTR_DIFF(q + 5, buf) > len) {
     103                                char *user = skip_string(buf,len,machine);
     104
     105                                if (!user || PTR_DIFF(user, buf) >= len) {
     106                                        DEBUG(0,("process_logon_packet: bad packet\n"));
     107                                        return;
     108                                }
     109                                getdc = skip_string(buf,len,user);
     110
     111                                if (!getdc || PTR_DIFF(getdc, buf) >= len) {
     112                                        DEBUG(0,("process_logon_packet: bad packet\n"));
     113                                        return;
     114                                }
     115                                q = skip_string(buf,len,getdc);
     116
     117                                if (!q || PTR_DIFF(q + 5, buf) > len) {
    118118                                        DEBUG(0,("process_logon_packet: bad packet\n"));
    119119                                        return;
     
    137137                                fstrcat(reply_name, my_name);
    138138                                push_ascii_fstring(q, reply_name);
    139                                 q = skip_string(q, 1); /* PDC name */
     139                                q = skip_string(outbuf,sizeof(outbuf),q); /* PDC name */
    140140
    141141                                SSVAL(q, 0, token);
     
    165165                                }
    166166
    167                                 getdc = skip_string(machine,1);
    168 
    169                                 if (PTR_DIFF(getdc, buf) >= len) {
    170                                         DEBUG(0,("process_logon_packet: bad packet\n"));
    171                                         return;
    172                                 }
    173                                 q = skip_string(getdc,1);
    174 
    175                                 if (PTR_DIFF(q, buf) >= len) {
     167                                getdc = skip_string(buf,len,machine);
     168
     169                                if (!getdc || PTR_DIFF(getdc, buf) >= len) {
     170                                        DEBUG(0,("process_logon_packet: bad packet\n"));
     171                                        return;
     172                                }
     173                                q = skip_string(buf,len,getdc);
     174
     175                                if (!q || PTR_DIFF(q, buf) >= len) {
    176176                                        DEBUG(0,("process_logon_packet: bad packet\n"));
    177177                                        return;
     
    233233                                fstrcpy(reply_name,my_name);
    234234                                push_ascii_fstring(q, reply_name);
    235                                 q = skip_string(q, 1); /* PDC name */
     235                                q = skip_string(outbuf,sizeof(outbuf),q); /* PDC name */
    236236
    237237                                /* PDC and domain name */
     
    302302                                }
    303303
    304                                 q = skip_string(getdc,1);
    305 
    306                                 if (PTR_DIFF(q + 8, buf) >= len) {
     304                                q = skip_string(buf,len,getdc);
     305
     306                                if (!q || PTR_DIFF(q + 8, buf) >= len) {
    307307                                        DEBUG(0,("process_logon_packet: bad packet\n"));
    308308                                        return;
     
    541541                                /* Domain info */
    542542         
    543                                 q = skip_string(q, 1);    /* PDC name */
    544 
    545                                 if (PTR_DIFF(q, buf) >= len) {
    546                                         DEBUG(0,("process_logon_packet: bad packet\n"));
    547                                         return;
    548                                 }
    549 
    550                                 q = skip_string(q, 1);    /* Domain name */
    551 
    552                                 if (PTR_DIFF(q, buf) >= len) {
     543                                q = skip_string(buf,len,q);    /* PDC name */
     544
     545                                if (!q || PTR_DIFF(q, buf) >= len) {
     546                                        DEBUG(0,("process_logon_packet: bad packet\n"));
     547                                        return;
     548                                }
     549
     550                                q = skip_string(buf,len,q);    /* Domain name */
     551
     552                                if (!q || PTR_DIFF(q, buf) >= len) {
    553553                                        DEBUG(0,("process_logon_packet: bad packet\n"));
    554554                                        return;
Note: See TracChangeset for help on using the changeset viewer.