Ignore:
Timestamp:
Nov 29, 2012, 1:59:04 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated trunk to 3.6.9

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/server/source3/lib/recvfile.c

    r745 r751  
    3434 * as we're below the Samba vfs layer.
    3535 *
    36  * If tofd is -1 we just drain the incoming socket of count
    37  * bytes without writing to the outgoing fd.
    38  * If a write fails we do the same (to cope with disk full)
    39  * errors.
    40  *
    4136 * Returns -1 on short reads from fromfd (read error)
    4237 * and sets errno.
    4338 *
    4439 * Returns number of bytes written to 'tofd'
    45  * or thrown away if 'tofd == -1'.
    4640 * return != count then sets errno.
    4741 * Returns count if complete success.
     
    10094                num_written = 0;
    10195
    102                 while (num_written < read_ret) {
     96                /* Don't write any more after a write error. */
     97                while (tofd != -1 && (num_written < read_ret)) {
    10398                        ssize_t write_ret;
    10499
    105                         if (tofd == -1) {
    106                                 write_ret = read_ret;
    107                         } else {
    108                                 /* Write to file - ignore EINTR. */
    109                                 write_ret = sys_write(tofd,
    110                                                 buffer + num_written,
    111                                                 read_ret - num_written);
    112 
    113                                 if (write_ret <= 0) {
    114                                         /* write error - stop writing. */
    115                                         tofd = -1;
    116                                         saved_errno = errno;
    117                                         continue;
    118                                 }
     100                        /* Write to file - ignore EINTR. */
     101                        write_ret = sys_write(tofd,
     102                                        buffer + num_written,
     103                                        read_ret - num_written);
     104
     105                        if (write_ret <= 0) {
     106                                /* write error - stop writing. */
     107                                tofd = -1;
     108                                if (total_written == 0) {
     109                                        /* Ensure we return
     110                                           -1 if the first
     111                                           write failed. */
     112                                        total_written = -1;
     113                                }
     114                                saved_errno = errno;
     115                                break;
    119116                        }
    120117
     
    218215
    219216 done:
    220         if (total_written < count) {
     217        if (count) {
    221218                int saved_errno = errno;
    222                 if (drain_socket(fromfd, count-total_written) !=
    223                                 count-total_written) {
     219                if (drain_socket(fromfd, count) != count) {
    224220                        /* socket is dead. */
    225221                        return -1;
     
    247243/*****************************************************************
    248244 Throw away "count" bytes from the client socket.
     245 Returns count or -1 on error.
    249246*****************************************************************/
    250247
    251248ssize_t drain_socket(int sockfd, size_t count)
    252249{
    253         return default_sys_recvfile(sockfd, -1, (SMB_OFF_T)-1, count);
    254 }
     250        size_t total = 0;
     251        size_t bufsize = MIN(TRANSFER_BUF_SIZE,count);
     252        char *buffer = NULL;
     253
     254        if (count == 0) {
     255                return 0;
     256        }
     257
     258        buffer = SMB_MALLOC_ARRAY(char, bufsize);
     259        if (buffer == NULL) {
     260                return -1;
     261        }
     262
     263        while (total < count) {
     264                ssize_t read_ret;
     265                size_t toread = MIN(bufsize,count - total);
     266
     267                /* Read from socket - ignore EINTR. */
     268                read_ret = sys_read(sockfd, buffer, toread);
     269                if (read_ret <= 0) {
     270                        /* EOF or socket error. */
     271                        free(buffer);
     272                        return -1;
     273                }
     274                total += read_ret;
     275        }
     276
     277        free(buffer);
     278        return count;
     279}
Note: See TracChangeset for help on using the changeset viewer.