source: freewrt/package/samba/patches/250-writex.patch@ d419478

freewrt_1_0 freewrt_2_0
Last change on this file since d419478 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: 5.2 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  
    2424#ifndef _SMB_H
    2525#define _SMB_H
    2626
     27#if defined(LARGE_SMB_OFF_T)
     28#define BUFFER_SIZE (128*1024)
     29#else /* no large readwrite possible */
    2730#define BUFFER_SIZE (0xFFFF)
     31#endif
     32
    2833#define SAFETY_MARGIN 1024
     34#define LARGE_WRITEX_HDR_SIZE 65
    2935
    3036#define NMB_PORT 137
    3137#define DGRAM_PORT 138
  • source/lib/util_sock.c

    diff -ruN samba-2.0.10.orig/source/lib/util_sock.c samba-2.0.10/source/lib/util_sock.c
    old new  
    649649  memset(buffer,'\0',smb_size + 100);
    650650
    651651  len = read_smb_length_return_keepalive(fd,buffer,timeout);
    652   if (len < 0)
    653   {
     652        if (len < 0) {
    654653    DEBUG(10,("receive_smb: length < 0!\n"));
    655654    return(False);
    656655  }
    657656
    658   if (len > BUFFER_SIZE) {
     657        /*
     658         * A WRITEX with CAP_LARGE_WRITEX can be 64k worth of data plus 65 bytes
     659     * of header. Don't print the error if this fits.... JRA.
     660         */
     661
     662        if (len > (BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE)) {
    659663    DEBUG(0,("Invalid packet length! (%d bytes).\n",len));
    660664    if (len > BUFFER_SIZE + (SAFETY_MARGIN/2))
    661     {
    662665        exit(1);
    663666    }
    664   }
    665667
    666668  if(len > 0) {
    667669    ret = read_socket_data(fd,buffer+4,len);
  • source/smbd/oplock.c

    diff -ruN samba-2.0.10.orig/source/smbd/oplock.c samba-2.0.10/source/smbd/oplock.c
    old new  
    887887     messages crossing on the wire.
    888888   */
    889889
    890   if((inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN))==NULL)
     890  if((inbuf = (char *)malloc(BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE + SAFETY_MARGIN))==NULL)
    891891  {
    892892    DEBUG(0,("oplock_break: malloc fail for input buffer.\n"));
    893893    return False;
    894894  }
    895895
    896   if((outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN))==NULL)
     896  if((outbuf = (char *)malloc(BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE + SAFETY_MARGIN))==NULL)
    897897  {
    898898    DEBUG(0,("oplock_break: malloc fail for output buffer.\n"));
    899899    free(inbuf);
  • source/smbd/process.c

    diff -ruN samba-2.0.10.orig/source/smbd/process.c samba-2.0.10/source/smbd/process.c
    old new  
    995995  time_t last_timeout_processing_time = time(NULL);
    996996  unsigned int num_smbs = 0;
    997997
    998   InBuffer = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
    999   OutBuffer = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
     998  InBuffer = (char *)malloc(BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE + SAFETY_MARGIN);
     999  OutBuffer = (char *)malloc(BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE + SAFETY_MARGIN);
    10001000  if ((InBuffer == NULL) || (OutBuffer == NULL))
    10011001    return;
    10021002
     
    10271027    /* free up temporary memory */
    10281028    lp_talloc_free();
    10291029
    1030     while(!receive_message_or_smb(InBuffer,BUFFER_SIZE,select_timeout,&got_smb))
     1030    while(!receive_message_or_smb(InBuffer,BUFFER_SIZE+LARGE_WRITEX_HDR_SIZE,select_timeout,&got_smb))
    10311031    {
    10321032      if(!timeout_processing( deadtime, &select_timeout, &last_timeout_processing_time))
    10331033        return;
  • 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  
    25512551  size_t numtowrite = SVAL(inbuf,smb_vwv10);
    25522552  BOOL write_through = BITSETW(inbuf+smb_vwv7,0);
    25532553  ssize_t nwritten = -1;
    2554   int smb_doff = SVAL(inbuf,smb_vwv11);
     2554  unsigned int smb_doff = SVAL(inbuf,smb_vwv11);
     2555  unsigned int smblen = smb_len(inbuf);
    25552556  char *data;
     2557  BOOL large_writeX = ((CVAL(inbuf,smb_wct) == 14) && (smblen > 0xFFFF));
    25562558
    25572559  /* If it's an IPC, pass off the pipe handler. */
    2558   if (IS_IPC(conn))
     2560  if (IS_IPC(conn)) {
    25592561    return reply_pipe_write_and_X(inbuf,outbuf,length,bufsize);
     2562  }
    25602563
    25612564  CHECK_FSP(fsp,conn);
    25622565  CHECK_WRITE(fsp);
    25632566  CHECK_ERROR(fsp);
    25642567
     2568  /* Deal with possible LARGE_WRITEX */
     2569  if (large_writeX)
     2570    numtowrite |= ((((size_t)SVAL(inbuf,smb_vwv9)) & 1 )<<16);
     2571
     2572  if(smb_doff > smblen || (smb_doff + numtowrite > smblen)) {
     2573    return(ERROR(ERRDOS,ERRbadmem));
     2574  }
     2575
    25652576  data = smb_base(inbuf) + smb_doff;
    25662577
    25672578  if(CVAL(inbuf,smb_wct) == 14) {
     
    25862597#endif /* LARGE_SMB_OFF_T */
    25872598  }
    25882599
    2589   if (is_locked(fsp,conn,numtowrite,startpos, F_WRLCK))
     2600  if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK)) {
    25902601    return(ERROR(ERRDOS,ERRlock));
     2602  }
    25912603
    25922604  /* X/Open SMB protocol says that, unlike SMBwrite
    25932605     if the length is zero then NO truncation is
     
    25982610  else
    25992611    nwritten = write_file(fsp,data,startpos,numtowrite);
    26002612 
    2601   if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0))
     2613  if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0)) {
    26022614    return(UNIXERROR(ERRDOS,ERRnoaccess));
     2615  }
    26032616
    26042617  set_message(outbuf,6,0,True);
    26052618 
    26062619  SSVAL(outbuf,smb_vwv2,nwritten);
     2620  if (large_writeX)
     2621    SSVAL(outbuf,smb_vwv4,(nwritten>>16)&1);
    26072622 
    26082623  if (nwritten < (ssize_t)numtowrite) {
    26092624    CVAL(outbuf,smb_rcls) = ERRHRD;
Note: See TracBrowser for help on using the repository browser.