Ignore:
Timestamp:
Nov 27, 2012, 4:56:06 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated vendor to 3.6.9

File:
1 edited

Legend:

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

    r740 r746  
    3131 * as we're below the Samba vfs layer.
    3232 *
    33  * If tofd is -1 we just drain the incoming socket of count
    34  * bytes without writing to the outgoing fd.
    35  * If a write fails we do the same (to cope with disk full)
    36  * errors.
    37  *
    3833 * Returns -1 on short reads from fromfd (read error)
    3934 * and sets errno.
    4035 *
    4136 * Returns number of bytes written to 'tofd'
    42  * or thrown away if 'tofd == -1'.
    4337 * return != count then sets errno.
    4438 * Returns count if complete success.
     
    9791                num_written = 0;
    9892
    99                 while (num_written < read_ret) {
     93                /* Don't write any more after a write error. */
     94                while (tofd != -1 && (num_written < read_ret)) {
    10095                        ssize_t write_ret;
    10196
    102                         if (tofd == -1) {
    103                                 write_ret = read_ret;
    104                         } else {
    105                                 /* Write to file - ignore EINTR. */
    106                                 write_ret = sys_write(tofd,
    107                                                 buffer + num_written,
    108                                                 read_ret - num_written);
    109 
    110                                 if (write_ret <= 0) {
    111                                         /* write error - stop writing. */
    112                                         tofd = -1;
    113                                         saved_errno = errno;
    114                                         continue;
    115                                 }
     97                        /* Write to file - ignore EINTR. */
     98                        write_ret = sys_write(tofd,
     99                                        buffer + num_written,
     100                                        read_ret - num_written);
     101
     102                        if (write_ret <= 0) {
     103                                /* write error - stop writing. */
     104                                tofd = -1;
     105                                if (total_written == 0) {
     106                                        /* Ensure we return
     107                                           -1 if the first
     108                                           write failed. */
     109                                        total_written = -1;
     110                                }
     111                                saved_errno = errno;
     112                                break;
    116113                        }
    117114
     
    215212
    216213 done:
    217         if (total_written < count) {
     214        if (count) {
    218215                int saved_errno = errno;
    219                 if (drain_socket(fromfd, count-total_written) !=
    220                                 count-total_written) {
     216                if (drain_socket(fromfd, count) != count) {
    221217                        /* socket is dead. */
    222218                        return -1;
     
    244240/*****************************************************************
    245241 Throw away "count" bytes from the client socket.
     242 Returns count or -1 on error.
    246243*****************************************************************/
    247244
    248245ssize_t drain_socket(int sockfd, size_t count)
    249246{
    250         return default_sys_recvfile(sockfd, -1, (SMB_OFF_T)-1, count);
    251 }
     247        size_t total = 0;
     248        size_t bufsize = MIN(TRANSFER_BUF_SIZE,count);
     249        char *buffer = NULL;
     250
     251        if (count == 0) {
     252                return 0;
     253        }
     254
     255        buffer = SMB_MALLOC_ARRAY(char, bufsize);
     256        if (buffer == NULL) {
     257                return -1;
     258        }
     259
     260        while (total < count) {
     261                ssize_t read_ret;
     262                size_t toread = MIN(bufsize,count - total);
     263
     264                /* Read from socket - ignore EINTR. */
     265                read_ret = sys_read(sockfd, buffer, toread);
     266                if (read_ret <= 0) {
     267                        /* EOF or socket error. */
     268                        free(buffer);
     269                        return -1;
     270                }
     271                total += read_ret;
     272        }
     273
     274        free(buffer);
     275        return count;
     276}
Note: See TracChangeset for help on using the changeset viewer.