Ignore:
Timestamp:
Nov 24, 2016, 1:14:11 PM (9 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update vendor to version 4.4.3

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source3/lib/recvfile.c

    r746 r988  
    2626#include "includes.h"
    2727#include "system/filesys.h"
     28#include "lib/util/sys_rw.h"
    2829
    2930/* Do this on our own in TRANSFER_BUF_SIZE chunks.
     
    4546static ssize_t default_sys_recvfile(int fromfd,
    4647                        int tofd,
    47                         SMB_OFF_T offset,
     48                        off_t offset,
    4849                        size_t count)
    4950{
     
    5253        size_t bufsize = MIN(TRANSFER_BUF_SIZE,count);
    5354        size_t total_written = 0;
    54         char *buffer = NULL;
     55        char buffer[bufsize];
    5556
    5657        DEBUG(10,("default_sys_recvfile: from = %d, to = %d, "
     
    6364        }
    6465
    65         if (tofd != -1 && offset != (SMB_OFF_T)-1) {
    66                 if (sys_lseek(tofd, offset, SEEK_SET) == -1) {
     66        if (tofd != -1 && offset != (off_t)-1) {
     67                if (lseek(tofd, offset, SEEK_SET) == -1) {
    6768                        if (errno != ESPIPE) {
    6869                                return -1;
    6970                        }
    7071                }
    71         }
    72 
    73         buffer = SMB_MALLOC_ARRAY(char, bufsize);
    74         if (buffer == NULL) {
    75                 return -1;
    7672        }
    7773
     
    8177                size_t toread = MIN(bufsize,count - total);
    8278
    83                 /* Read from socket - ignore EINTR. */
    84                 read_ret = sys_read(fromfd, buffer, toread);
     79                /*
     80                 * Read from socket - ignore EINTR.
     81                 * Can't use sys_read() as that also
     82                 * ignores EAGAIN and EWOULDBLOCK.
     83                 */
     84                do {
     85                        read_ret = read(fromfd, buffer, toread);
     86                } while (read_ret == -1 && errno == EINTR);
     87
     88                if (read_ret == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
     89                        /*
     90                         * fromfd socket is in non-blocking mode.
     91                         * If we already read some and wrote
     92                         * it successfully, return that.
     93                         * Only return -1 if this is the first read
     94                         * attempt. Caller will handle both cases.
     95                         */
     96                        if (total_written != 0) {
     97                                return total_written;
     98                        }
     99                        return -1;
     100                }
     101
    85102                if (read_ret <= 0) {
    86103                        /* EOF or socket error. */
    87                         free(buffer);
    88104                        return -1;
    89105                }
     
    120136        }
    121137
    122         free(buffer);
    123138        if (saved_errno) {
    124139                /* Return the correct write error. */
     
    141156ssize_t sys_recvfile(int fromfd,
    142157                        int tofd,
    143                         SMB_OFF_T offset,
     158                        off_t offset,
    144159                        size_t count)
    145160{
     
    191206                                return default_sys_recvfile(fromfd, tofd,
    192207                                                            offset, count);
     208                        }
     209                        if (errno == EAGAIN || errno == EWOULDBLOCK) {
     210                                /*
     211                                 * fromfd socket is in non-blocking mode.
     212                                 * If we already read some and wrote
     213                                 * it successfully, return that.
     214                                 * Only return -1 if this is the first read
     215                                 * attempt. Caller will handle both cases.
     216                                 */
     217                                if (total_written != 0) {
     218                                        return total_written;
     219                                }
     220                                return -1;
    193221                        }
    194222                        break;
     
    231259ssize_t sys_recvfile(int fromfd,
    232260                        int tofd,
    233                         SMB_OFF_T offset,
     261                        off_t offset,
    234262                        size_t count)
    235263{
     
    241269 Throw away "count" bytes from the client socket.
    242270 Returns count or -1 on error.
     271 Must only operate on a blocking socket.
    243272*****************************************************************/
    244273
     
    247276        size_t total = 0;
    248277        size_t bufsize = MIN(TRANSFER_BUF_SIZE,count);
    249         char *buffer = NULL;
     278        char buffer[bufsize];
     279        int old_flags = 0;
    250280
    251281        if (count == 0) {
     
    253283        }
    254284
    255         buffer = SMB_MALLOC_ARRAY(char, bufsize);
    256         if (buffer == NULL) {
     285        old_flags = fcntl(sockfd, F_GETFL, 0);
     286        if (set_blocking(sockfd, true) == -1) {
    257287                return -1;
    258288        }
     
    266296                if (read_ret <= 0) {
    267297                        /* EOF or socket error. */
    268                         free(buffer);
    269                         return -1;
     298                        count = (size_t)-1;
     299                        goto out;
    270300                }
    271301                total += read_ret;
    272302        }
    273303
    274         free(buffer);
     304  out:
     305
     306        if (fcntl(sockfd, F_SETFL, old_flags) == -1) {
     307                return -1;
     308        }
    275309        return count;
    276310}
Note: See TracChangeset for help on using the changeset viewer.