source: freewrt/package/samba/patches/200-security.patch@ 9df7618

freewrt_1_0 freewrt_2_0
Last change on this file since 9df7618 was 475ad56, checked in by Waldemar Brodkorb <wbx@…>, 20 years ago

add OpenWrt trunk revision 3830.

git-svn-id: svn://www.freewrt.org/trunk/freewrt@1 afb5a338-a214-0410-bd46-81f09a774fd1

  • Property mode set to 100644
File size: 21.1 KB
  • source/include/smb.h

    diff -ruN samba-2.0.10.orig/source/include/smb.h samba-2.0.10/source/include/smb.h
    old new  
    272272#define ERRlock 33 /* Lock request conflicts with existing lock */
    273273#define ERRunsup 50 /* Request unsupported, returned by Win 95, RJS 20Jun98 */
    274274#define ERRfilexists 80 /* File in operation already exists */
     275#define ERRinvalidparam 87
    275276#define ERRcannotopen 110 /* Cannot open the file specified */
    276277#define ERRunknownlevel 124
    277278#define ERRrename 183
     
    19111912
    19121913#define SAFE_NETBIOS_CHARS ". -_"
    19131914
     1915#ifndef SAFE_FREE
     1916#define SAFE_FREE(x) do { if ((x) != NULL) {free((x)); (x)=NULL;} } while(0)
     1917#endif
    19141918#endif /* _SMB_H */
  • source/include/version.h

    diff -ruN samba-2.0.10.orig/source/include/version.h samba-2.0.10/source/include/version.h
    old new  
    1 #define VERSION "2.0.10"
     1#define VERSION "2.0.10-security-rollup"
  • source/smbd/filename.c

    diff -ruN samba-2.0.10.orig/source/smbd/filename.c samba-2.0.10/source/smbd/filename.c
    old new  
    172172   * StrnCpy always null terminates.
    173173   */
    174174
    175   StrnCpy(orig_name, full_orig_name, namelen);
     175  StrnCpy(orig_name, full_orig_name, MIN(namelen, sizeof(orig_name)-1));
    176176  if(!case_sensitive)
    177177    strupper( orig_name );
    178178
  • source/smbd/ipc.c

    diff -ruN samba-2.0.10.orig/source/smbd/ipc.c samba-2.0.10/source/smbd/ipc.c
    old new  
    35563556        uint16 *setup=NULL;
    35573557        int outsize = 0;
    35583558        uint16 vuid = SVAL(inbuf,smb_uid);
    3559         int tpscnt = SVAL(inbuf,smb_vwv0);
    3560         int tdscnt = SVAL(inbuf,smb_vwv1);
    3561         int mprcnt = SVAL(inbuf,smb_vwv2);
    3562         int mdrcnt = SVAL(inbuf,smb_vwv3);
    3563         int msrcnt = CVAL(inbuf,smb_vwv4);
     3559        unsigned int tpscnt = SVAL(inbuf,smb_vwv0);
     3560        unsigned int tdscnt = SVAL(inbuf,smb_vwv1);
     3561        unsigned int mprcnt = SVAL(inbuf,smb_vwv2);
     3562        unsigned int mdrcnt = SVAL(inbuf,smb_vwv3);
     3563        unsigned int msrcnt = CVAL(inbuf,smb_vwv4);
    35643564        BOOL close_on_completion = BITSETW(inbuf+smb_vwv5,0);
    35653565        BOOL one_way = BITSETW(inbuf+smb_vwv5,1);
    3566         int pscnt = SVAL(inbuf,smb_vwv9);
    3567         int psoff = SVAL(inbuf,smb_vwv10);
    3568         int dscnt = SVAL(inbuf,smb_vwv11);
    3569         int dsoff = SVAL(inbuf,smb_vwv12);
    3570         int suwcnt = CVAL(inbuf,smb_vwv13);
     3566        unsigned int pscnt = SVAL(inbuf,smb_vwv9);
     3567        unsigned int psoff = SVAL(inbuf,smb_vwv10);
     3568        unsigned int dscnt = SVAL(inbuf,smb_vwv11);
     3569        unsigned int dsoff = SVAL(inbuf,smb_vwv12);
     3570        unsigned int suwcnt = CVAL(inbuf,smb_vwv13);
    35713571
    35723572        memset(name, '\0',sizeof(name));
    35733573        fstrcpy(name,smb_buf(inbuf));
     
    35783578 
    35793579        if (tdscnt)  {
    35803580                if((data = (char *)malloc(tdscnt)) == NULL) {
    3581                         DEBUG(0,("reply_trans: data malloc fail for %d bytes !\n", tdscnt));
     3581                        DEBUG(0,("reply_trans: data malloc fail for %u bytes !\n", tdscnt));
    35823582                        return(ERROR(ERRDOS,ERRnomem));
    35833583                }
     3584                if ((dsoff+dscnt < dsoff) || (dsoff+dscnt < dscnt))
     3585                        goto bad_param;
     3586                if (smb_base(inbuf)+dsoff+dscnt > inbuf + size)
     3587                        goto bad_param;
     3588
    35843589                memcpy(data,smb_base(inbuf)+dsoff,dscnt);
    35853590        }
    35863591
    35873592        if (tpscnt) {
    35883593                if((params = (char *)malloc(tpscnt)) == NULL) {
    3589                         DEBUG(0,("reply_trans: param malloc fail for %d bytes !\n", tpscnt));
     3594                        DEBUG(0,("reply_trans: param malloc fail for %u bytes !\n", tpscnt));
     3595                        SAFE_FREE(data);
    35903596                        return(ERROR(ERRDOS,ERRnomem));
    35913597                }
     3598                if ((psoff+pscnt < psoff) || (psoff+pscnt < pscnt))
     3599                        goto bad_param;
     3600                if (smb_base(inbuf)+psoff+pscnt > inbuf + size)
     3601                        goto bad_param;
     3602
    35923603                memcpy(params,smb_base(inbuf)+psoff,pscnt);
    35933604        }
    35943605
    35953606        if (suwcnt) {
    35963607                int i;
    35973608                if((setup = (uint16 *)malloc(suwcnt*sizeof(uint16))) == NULL) {
    3598           DEBUG(0,("reply_trans: setup malloc fail for %d bytes !\n", (int)(suwcnt * sizeof(uint16))));
    3599                   return(ERROR(ERRDOS,ERRnomem));
    3600         }
     3609                        DEBUG(0,("reply_trans: setup malloc fail for %u bytes !\n", (unsigned int)(suwcnt * sizeof(uint16))));
     3610                        SAFE_FREE(data);
     3611                        SAFE_FREE(params);
     3612                        return(ERROR(ERRDOS,ERRnomem));
     3613                }
     3614                if (inbuf+smb_vwv14+(suwcnt*SIZEOFWORD) > inbuf + size)
     3615                        goto bad_param;
     3616                if ((smb_vwv14+(suwcnt*SIZEOFWORD) < smb_vwv14) || (smb_vwv14+(suwcnt*SIZEOFWORD) < (suwcnt*SIZEOFWORD)))
     3617                        goto bad_param;
     3618
    36013619                for (i=0;i<suwcnt;i++)
    36023620                        setup[i] = SVAL(inbuf,smb_vwv14+i*SIZEOFWORD);
    36033621        }
     
    36143632        /* receive the rest of the trans packet */
    36153633        while (pscnt < tpscnt || dscnt < tdscnt) {
    36163634                BOOL ret;
    3617                 int pcnt,poff,dcnt,doff,pdisp,ddisp;
     3635                unsigned int pcnt,poff,dcnt,doff,pdisp,ddisp;
    36183636     
    36193637                ret = receive_next_smb(inbuf,bufsize,SMB_SECONDARY_WAIT);
    36203638
     
    36253643                                DEBUG(0,("reply_trans: %s in getting secondary trans response.\n",
    36263644                                         (smb_read_error == READ_ERROR) ? "error" : "timeout" ));
    36273645                        }
    3628                         if (params)
    3629                                 free(params);
    3630                         if (data)
    3631                                 free(data);
    3632                         if (setup)
    3633                                 free(setup);
     3646                        SAFE_FREE(params);
     3647                        SAFE_FREE(data);
     3648                        SAFE_FREE(setup);
    36343649                        return(ERROR(ERRSRV,ERRerror));
    36353650                }
    36363651
    36373652                show_msg(inbuf);
    36383653     
    3639                 tpscnt = SVAL(inbuf,smb_vwv0);
    3640                 tdscnt = SVAL(inbuf,smb_vwv1);
     3654                /* Revise total_params and total_data in case they have changed downwards */
     3655                if (SVAL(inbuf,smb_vwv0) < tpscnt)
     3656                        tpscnt = SVAL(inbuf,smb_vwv0);
     3657                if (SVAL(inbuf,smb_vwv1) < tdscnt)
     3658                        tdscnt = SVAL(inbuf,smb_vwv1);
    36413659
    36423660                pcnt = SVAL(inbuf,smb_vwv2);
    36433661                poff = SVAL(inbuf,smb_vwv3);
     
    36503668                pscnt += pcnt;
    36513669                dscnt += dcnt;
    36523670               
    3653                 if (dscnt > tdscnt || pscnt > tpscnt) {
    3654                         exit_server("invalid trans parameters\n");
    3655                 }
     3671                if (dscnt > tdscnt || pscnt > tpscnt)
     3672                        goto bad_param;
    36563673               
    3657                 if (pcnt)
     3674                if (pcnt) {
     3675                        if (pdisp+pcnt >= tpscnt)
     3676                                goto bad_param;
     3677                        if ((pdisp+pcnt < pdisp) || (pdisp+pcnt < pcnt))
     3678                                goto bad_param;
     3679                        if (smb_base(inbuf) + poff + pcnt >= inbuf + bufsize)
     3680                                goto bad_param;
     3681                        if (params + pdisp < params)
     3682                                goto bad_param;
     3683
    36583684                        memcpy(params+pdisp,smb_base(inbuf)+poff,pcnt);
    3659                 if (dcnt)
     3685                }
     3686
     3687                if (dcnt) {
     3688                        if (ddisp+dcnt >= tdscnt)
     3689                                goto bad_param;
     3690                        if ((ddisp+dcnt < ddisp) || (ddisp+dcnt < dcnt))
     3691                                goto bad_param;
     3692                        if (smb_base(inbuf) + doff + dcnt >= inbuf + bufsize)
     3693                                goto bad_param;
     3694                        if (data + ddisp < data)
     3695                                goto bad_param;
     3696
    36603697                        memcpy(data+ddisp,smb_base(inbuf)+doff,dcnt);     
     3698                }
    36613699        }
    3662        
    3663        
     3700
    36643701        DEBUG(3,("trans <%s> data=%d params=%d setup=%d\n",
    36653702                 name,tdscnt,tpscnt,suwcnt));
    36663703       
     
    37003737                return(ERROR(ERRSRV,ERRnosupport));
    37013738       
    37023739        return(outsize);
     3740
     3741  bad_param:
     3742
     3743        DEBUG(0,("reply_trans: invalid trans parameters\n"));
     3744        SAFE_FREE(data);
     3745        SAFE_FREE(params);
     3746        SAFE_FREE(setup);
     3747        return(ERROR(ERRSRV,ERRerror));
    37033748}
  • source/smbd/nttrans.c

    diff -ruN samba-2.0.10.orig/source/smbd/nttrans.c samba-2.0.10/source/smbd/nttrans.c
    old new  
    25752575    params = (char *)malloc(total_parameter_count);
    25762576  if (total_data_count > 0)
    25772577    data = (char *)malloc(total_data_count);
    2578  
     2578
    25792579  if ((total_parameter_count && !params)  || (total_data_count && !data) ||
    25802580      (setup_count && !setup)) {
     2581    SAFE_FREE(setup);
     2582    SAFE_FREE(params);
     2583    SAFE_FREE(data);
    25812584    DEBUG(0,("reply_nttrans : Out of memory\n"));
    2582     return(ERROR(ERRDOS,ERRnomem));
     2585    return ERROR(ERRDOS,ERRnomem);
    25832586  }
    25842587
    25852588  /* Copy the param and data bytes sent with this request into
     
    25882591  num_data_sofar = data_count;
    25892592
    25902593  if (parameter_count > total_parameter_count || data_count > total_data_count)
    2591     exit_server("reply_nttrans: invalid sizes in packet.\n");
     2594    goto bad_param;
    25922595
    25932596  if(setup) {
    2594     memcpy( setup, &inbuf[smb_nt_SetupStart], setup_count);
    25952597    DEBUG(10,("reply_nttrans: setup_count = %d\n", setup_count));
    2596     dump_data(10, setup, setup_count);
     2598    if ((smb_nt_SetupStart + setup_count < smb_nt_SetupStart) ||
     2599        (smb_nt_SetupStart + setup_count < setup_count))
     2600      goto bad_param;
     2601    if (smb_nt_SetupStart + setup_count > length)
     2602      goto bad_param;
     2603   
     2604    memcpy( setup, &inbuf[smb_nt_SetupStart], setup_count);
    25972605  }
    25982606  if(params) {
    2599     memcpy( params, smb_base(inbuf) + parameter_offset, parameter_count);
    26002607    DEBUG(10,("reply_nttrans: parameter_count = %d\n", parameter_count));
    2601     dump_data(10, params, parameter_count);
     2608    if ((parameter_offset + parameter_count < parameter_offset) ||
     2609        (parameter_offset + parameter_count < parameter_count))
     2610      goto bad_param;
     2611    if (smb_base(inbuf) + parameter_offset + parameter_count > inbuf + length)
     2612      goto bad_param;
     2613   
     2614    memcpy( params, smb_base(inbuf) + parameter_offset, parameter_count);
    26022615  }
    26032616  if(data) {
    2604     memcpy( data, smb_base(inbuf) + data_offset, data_count);
    26052617    DEBUG(10,("reply_nttrans: data_count = %d\n",data_count));
    2606     dump_data(10, data, data_count);
     2618    if ((data_offset + data_count < data_offset) || (data_offset + data_count < data_count))
     2619      goto bad_param;
     2620    if (smb_base(inbuf) + data_offset + data_count > inbuf + length)
     2621      goto bad_param;
     2622   
     2623    memcpy( data, smb_base(inbuf) + data_offset, data_count);
     2624
    26072625  }
    26082626
    26092627  if(num_data_sofar < total_data_count || num_params_sofar < total_parameter_count) {
    26102628    /* We need to send an interim response then receive the rest
    26112629       of the parameter/data bytes */
    26122630    outsize = set_message(outbuf,0,0,True);
    2613     send_smb(Client,outbuf);
     2631    if (!send_smb(Client,outbuf))
     2632      exit_server("reply_nttrans: send_smb failed.");
    26142633
    26152634    while( num_data_sofar < total_data_count || num_params_sofar < total_parameter_count) {
    26162635      BOOL ret;
    2617 
     2636      uint32 parameter_displacement;
     2637      uint32 data_displacement;
     2638     
    26182639      ret = receive_next_smb(inbuf,bufsize,SMB_SECONDARY_WAIT);
    2619 
     2640     
    26202641      if((ret && (CVAL(inbuf, smb_com) != SMBnttranss)) || !ret) {
    2621         outsize = set_message(outbuf,0,0,True);
    2622         if(ret) {
    2623                 DEBUG(0,("reply_nttrans: Invalid secondary nttrans packet\n"));
    2624         } else {
    2625                 DEBUG(0,("reply_nttrans: %s in getting secondary nttrans response.\n",
    2626                         (smb_read_error == READ_ERROR) ? "error" : "timeout" ));
     2642        outsize = set_message(outbuf,0,0,True);
     2643        if(ret) {
     2644          DEBUG(0,("reply_nttrans: Invalid secondary nttrans packet\n"));
     2645        } else {
     2646          DEBUG(0,("reply_nttrans: %s in getting secondary nttrans response.\n",
     2647                  (smb_read_error == READ_ERROR) ? "error" : "timeout" ));
    26272648        }
    2628         if(params)
    2629           free(params);
    2630         if(data)
    2631           free(data);
    2632         if(setup)
    2633           free(setup);
    2634         return(ERROR(ERRSRV,ERRerror));
     2649        goto bad_param;
    26352650      }
    26362651     
    26372652      /* Revise total_params and total_data in case they have changed downwards */
    2638       total_parameter_count = IVAL(inbuf, smb_nts_TotalParameterCount);
    2639       total_data_count = IVAL(inbuf, smb_nts_TotalDataCount);
    2640       num_params_sofar += (parameter_count = IVAL(inbuf,smb_nts_ParameterCount));
    2641       num_data_sofar += ( data_count = IVAL(inbuf, smb_nts_DataCount));
    2642       if (num_params_sofar > total_parameter_count || num_data_sofar > total_data_count)
    2643         exit_server("reply_nttrans2: data overflow in secondary nttrans packet\n");
    2644 
    2645       memcpy( &params[ IVAL(inbuf, smb_nts_ParameterDisplacement)],
    2646               smb_base(inbuf) + IVAL(inbuf, smb_nts_ParameterOffset), parameter_count);
    2647       memcpy( &data[IVAL(inbuf, smb_nts_DataDisplacement)],
    2648               smb_base(inbuf)+ IVAL(inbuf, smb_nts_DataOffset), data_count);
     2653      if (IVAL(inbuf, smb_nts_TotalParameterCount) < total_parameter_count)
     2654        total_parameter_count = IVAL(inbuf, smb_nts_TotalParameterCount);
     2655      if (IVAL(inbuf, smb_nts_TotalDataCount) < total_data_count)
     2656        total_data_count = IVAL(inbuf, smb_nts_TotalDataCount);
     2657     
     2658      parameter_count = IVAL(inbuf,smb_nts_ParameterCount);
     2659      parameter_offset = IVAL(inbuf, smb_nts_ParameterOffset);
     2660      parameter_displacement = IVAL(inbuf, smb_nts_ParameterDisplacement);
     2661      num_params_sofar += parameter_count;
     2662     
     2663      data_count = IVAL(inbuf, smb_nts_DataCount);
     2664      data_displacement = IVAL(inbuf, smb_nts_DataDisplacement);
     2665      data_offset = IVAL(inbuf, smb_nts_DataOffset);
     2666      num_data_sofar += data_count;
     2667
     2668      if (num_params_sofar > total_parameter_count || num_data_sofar > total_data_count) {
     2669        DEBUG(0,("reply_nttrans2: data overflow in secondary nttrans packet"));
     2670        goto bad_param;
     2671      }
     2672
     2673      if (parameter_count) {
     2674        if (parameter_displacement + parameter_count >= total_parameter_count)
     2675          goto bad_param;
     2676        if ((parameter_displacement + parameter_count < parameter_displacement) ||
     2677            (parameter_displacement + parameter_count < parameter_count))
     2678          goto bad_param;
     2679        if (smb_base(inbuf) + parameter_offset + parameter_count >= inbuf + bufsize)
     2680          goto bad_param;
     2681        if (params + parameter_displacement < params)
     2682          goto bad_param;
     2683       
     2684        memcpy( &params[parameter_displacement], smb_base(inbuf) + parameter_offset, parameter_count);
     2685      }
     2686     
     2687      if (data_count) {
     2688        if (data_displacement + data_count >= total_data_count)
     2689          goto bad_param;
     2690        if ((data_displacement + data_count < data_displacement) ||
     2691            (data_displacement + data_count < data_count))
     2692          goto bad_param;
     2693        if (smb_base(inbuf) + data_offset + data_count >= inbuf + bufsize)
     2694          goto bad_param;
     2695        if (data + data_displacement < data)
     2696          goto bad_param;
     2697       
     2698        memcpy( &data[data_displacement], smb_base(inbuf)+ data_offset, data_count);
     2699      }
    26492700    }
    26502701  }
    26512702
     
    27142765  return outsize; /* If a correct response was needed the call_nt_transact_xxxx
    27152766                     calls have already sent it. If outsize != -1 then it is
    27162767                     returning an error packet. */
     2768 bad_param:
     2769
     2770  SAFE_FREE(params);
     2771  SAFE_FREE(data);
     2772  SAFE_FREE(setup);
     2773  return ERROR(ERRDOS,ERRinvalidparam);
    27172774}
  • source/smbd/password.c

    diff -ruN samba-2.0.10.orig/source/smbd/password.c samba-2.0.10/source/smbd/password.c
    old new  
    770770      if (!ok && lp_username(snum)) {
    771771        char *auser;
    772772        pstring user_list;
    773         StrnCpy(user_list,lp_username(snum),sizeof(pstring));
     773        StrnCpy(user_list,lp_username(snum),sizeof(pstring)-1);
    774774
    775775        pstring_sub(user_list,"%S",lp_servicename(snum));
    776776         
  • source/smbd/reply.c

    diff -ruN samba-2.0.10.orig/source/smbd/reply.c samba-2.0.10/source/smbd/reply.c
    old new  
    14131413
    14141414        for (i=numentries;(i<maxentries) && !finished;i++)
    14151415        {
     1416          /* check to make sure we have room in the buffer */
     1417          if ( ((PTR_DIFF(p, outbuf))+DIR_STRUCT_SIZE) > BUFFER_SIZE )
     1418                break;
    14161419          finished =
    14171420            !get_dir_entry(conn,mask,dirtype,fname,&size,&mode,&date,check_descend);
    14181421          if (!finished)
     
    31223125   
    31233126
    31243127                for (i=first;i<first+num_to_get;i++) {
     3128                        /* check to make sure we have room in the buffer */
     3129                        if ( (PTR_DIFF(p, outbuf)+28) > BUFFER_SIZE )
     3130                                break;
    31253131                        put_dos_date2(p,0,queue[i].time);
    31263132                        CVAL(p,4) = (queue[i].status==LPQ_PRINTING?2:3);
    31273133                        SSVAL(p,5,printjob_encode(SNUM(conn),
  • source/smbd/trans2.c

    diff -ruN samba-2.0.10.orig/source/smbd/trans2.c samba-2.0.10/source/smbd/trans2.c
    old new  
    201201  int16 open_ofun = SVAL(params,12);
    202202  int32 open_size = IVAL(params,14);
    203203  char *pname = &params[28];
    204   int16 namelen = strlen(pname)+1;
    205204
    206205  pstring fname;
    207206  mode_t unixmode;
     
    213212  BOOL bad_path = False;
    214213  files_struct *fsp;
    215214
    216   StrnCpy(fname,pname,namelen);
     215  pstrcpy(fname,pname);
    217216
    218217  DEBUG(3,("trans2open %s mode=%d attr=%d ofun=%d size=%d\n",
    219218           fname,open_mode, open_attr, open_ofun, open_size));
     
    21852184        unsigned int suwcnt = SVAL(inbuf, smb_suwcnt);
    21862185        unsigned int tran_call = SVAL(inbuf, smb_setup0);
    21872186        char *params = NULL, *data = NULL;
    2188         int num_params, num_params_sofar, num_data, num_data_sofar;
     2187        unsigned int num_params, num_params_sofar, num_data, num_data_sofar;
    21892188
    21902189        if(global_oplock_break && (tran_call == TRANSACT2_OPEN)) {
    21912190                /* Queue this open message as we are the process of an
     
    22032202        /* All trans2 messages we handle have smb_sucnt == 1 - ensure this
    22042203           is so as a sanity check */
    22052204        if (suwcnt != 1) {
    2206                 DEBUG(2,("Invalid smb_sucnt in trans2 call\n"));
    2207                 return(ERROR(ERRSRV,ERRerror));
     2205                DEBUG(2,("Invalid smb_sucnt in trans2 call(%u)\n",suwcnt));
     2206                DEBUG(2,("Transaction is %d\n",tran_call));
     2207                ERROR(ERRDOS,ERRinvalidparam);
    22082208        }
    22092209   
    22102210        /* Allocate the space for the maximum needed parameters and data */
     
    22152215 
    22162216        if ((total_params && !params)  || (total_data && !data)) {
    22172217                DEBUG(2,("Out of memory in reply_trans2\n"));
    2218         if(params)
    2219           free(params);
    2220         if(data)
    2221           free(data);
    2222                 return(ERROR(ERRDOS,ERRnomem));
     2218                SAFE_FREE(params);
     2219                SAFE_FREE(data);
     2220                return ERROR(ERRDOS,ERRnomem);
    22232221        }
    22242222
    22252223        /* Copy the param and data bytes sent with this request into
     
    22302228        if (num_params > total_params || num_data > total_data)
    22312229                exit_server("invalid params in reply_trans2");
    22322230
    2233         if(params)
    2234                 memcpy( params, smb_base(inbuf) + SVAL(inbuf, smb_psoff), num_params);
    2235         if(data)
    2236                 memcpy( data, smb_base(inbuf) + SVAL(inbuf, smb_dsoff), num_data);
     2231        if(params) {
     2232                unsigned int psoff = SVAL(inbuf, smb_psoff);
     2233                if ((psoff + num_params < psoff) || (psoff + num_params < num_params))
     2234                        goto bad_param;
     2235                if (smb_base(inbuf) + psoff + num_params > inbuf + length)
     2236                        goto bad_param;
     2237                memcpy( params, smb_base(inbuf) + psoff, num_params);
     2238        }
     2239        if(data) {
     2240                unsigned int dsoff = SVAL(inbuf, smb_dsoff);
     2241                if ((dsoff + num_data < dsoff) || (dsoff + num_data < num_data))
     2242                        goto bad_param;
     2243                if (smb_base(inbuf) + dsoff + num_data > inbuf + length)
     2244                        goto bad_param;
     2245                memcpy( data, smb_base(inbuf) + dsoff, num_data);
     2246        }
    22372247
    22382248        if(num_data_sofar < total_data || num_params_sofar < total_params)  {
    22392249                /* We need to send an interim response then receive the rest
    22402250                   of the parameter/data bytes */
    22412251                outsize = set_message(outbuf,0,0,True);
    2242                 send_smb(Client,outbuf);
     2252                if (!send_smb(Client,outbuf))
     2253                        exit_server("reply_trans2: send_smb failed.");
    22432254
    22442255                while (num_data_sofar < total_data ||
    22452256                       num_params_sofar < total_params) {
    22462257                        BOOL ret;
     2258                        unsigned int param_disp;
     2259                        unsigned int param_off;
     2260                        unsigned int data_disp;
     2261                        unsigned int data_off;
    22472262
    22482263                        ret = receive_next_smb(inbuf,bufsize,SMB_SECONDARY_WAIT);
    22492264                       
     
    22552270                                else
    22562271                                        DEBUG(0,("reply_trans2: %s in getting secondary trans2 response.\n",
    22572272                                                 (smb_read_error == READ_ERROR) ? "error" : "timeout" ));
    2258                                 if(params)
    2259                                         free(params);
    2260                                 if(data)
    2261                                         free(data);
    2262                                 return(ERROR(ERRSRV,ERRerror));
     2273                                goto bad_param;
    22632274                        }
    22642275     
    22652276                        /* Revise total_params and total_data in case
    22662277                           they have changed downwards */
    2267                         total_params = SVAL(inbuf, smb_tpscnt);
    2268                         total_data = SVAL(inbuf, smb_tdscnt);
    2269                         num_params_sofar += (num_params = SVAL(inbuf,smb_spscnt));
    2270                         num_data_sofar += ( num_data = SVAL(inbuf, smb_sdscnt));
     2278                        if (SVAL(inbuf, smb_tpscnt) < total_params)
     2279                                total_params = SVAL(inbuf, smb_tpscnt);
     2280                        if (SVAL(inbuf, smb_tdscnt) < total_data)
     2281                                total_data = SVAL(inbuf, smb_tdscnt);
     2282
     2283                        num_params = SVAL(inbuf,smb_spscnt);
     2284                        param_off = SVAL(inbuf, smb_spsoff);
     2285                        param_disp = SVAL(inbuf, smb_spsdisp);
     2286                        num_params_sofar += num_params;
     2287
     2288                        num_data = SVAL(inbuf, smb_sdscnt);
     2289                        data_off = SVAL(inbuf, smb_sdsoff);
     2290                        data_disp = SVAL(inbuf, smb_sdsdisp);
     2291                        num_data_sofar += num_data;
     2292
    22712293                        if (num_params_sofar > total_params || num_data_sofar > total_data)
    2272                                 exit_server("data overflow in trans2");
     2294                                goto bad_param;
    22732295                       
    2274                         memcpy( &params[ SVAL(inbuf, smb_spsdisp)],
    2275                                 smb_base(inbuf) + SVAL(inbuf, smb_spsoff), num_params);
    2276                         memcpy( &data[SVAL(inbuf, smb_sdsdisp)],
    2277                                 smb_base(inbuf)+ SVAL(inbuf, smb_sdsoff), num_data);
     2296                        if (num_params) {
     2297                                if (param_disp + num_params >= total_params)
     2298                                        goto bad_param;
     2299                                if ((param_disp + num_params < param_disp) ||
     2300                                                (param_disp + num_params < num_params))
     2301                                        goto bad_param;
     2302                                if (smb_base(inbuf) + param_off + num_params >= inbuf + bufsize)
     2303                                        goto bad_param;
     2304                                if (params + param_disp < params)
     2305                                        goto bad_param;
     2306
     2307                                memcpy( &params[param_disp], smb_base(inbuf) + param_off, num_params);
     2308                        }
     2309                        if (num_data) {
     2310                                if (data_disp + num_data >= total_data)
     2311                                        goto bad_param;
     2312                                if ((data_disp + num_data < data_disp) ||
     2313                                                (data_disp + num_data < num_data))
     2314                                        goto bad_param;
     2315                                if (smb_base(inbuf) + data_off + num_data >= inbuf + bufsize)
     2316                                        goto bad_param;
     2317                                if (data + data_disp < data)
     2318                                        goto bad_param;
     2319
     2320                                memcpy( &data[data_disp], smb_base(inbuf) + data_off, num_data);
     2321                        }
    22782322                }
    22792323        }
    22802324       
     
    23672411        return outsize; /* If a correct response was needed the
    23682412                           call_trans2xxx calls have already sent
    23692413                           it. If outsize != -1 then it is returning */
     2414
     2415  bad_param:
     2416
     2417        SAFE_FREE(params);
     2418        SAFE_FREE(data);
     2419        return (ERROR(ERRDOS,ERRinvalidparam));
    23702420}
Note: See TracBrowser for help on using the repository browser.