s3 sendfile: Fix two bugs in sendfile
authorTim Prouty <tprouty@samba.org>
Tue, 19 May 2009 01:20:18 +0000 (18:20 -0700)
committerTim Prouty <tprouty@samba.org>
Tue, 19 May 2009 01:31:02 +0000 (18:31 -0700)
These were found interally via code inspection.

1) fake_sendfile was incorrectly writing zeros over real data on a
   short read.

2) sendfile_short_send was doing 4 byte writes instead of 1024 byte
   writes due to an incorrect sizeof usage.

Jermey, Vl please check

source3/smbd/reply.c

index a81c22b75050f46845e0d90b46b9163b3810fd3f..879550bb2e8a45063aa998d3e4939d3930a7f952 100644 (file)
@@ -2757,7 +2757,7 @@ static ssize_t fake_sendfile(files_struct *fsp, SMB_OFF_T startpos,
 
                /* If we had a short read, fill with zeros. */
                if (ret < cur_read) {
-                       memset(buf, '\0', cur_read - ret);
+                       memset(buf + ret, '\0', cur_read - ret);
                }
 
                if (write_data(smbd_server_fd(),buf,cur_read) != cur_read) {
@@ -2783,6 +2783,7 @@ static void sendfile_short_send(files_struct *fsp,
                                size_t headersize,
                                size_t smb_maxcnt)
 {
+#define SHORT_SEND_BUFSIZE 1024
        if (nread < headersize) {
                DEBUG(0,("sendfile_short_send: sendfile failed to send "
                        "header for file %s (%s). Terminating\n",
@@ -2793,7 +2794,7 @@ static void sendfile_short_send(files_struct *fsp,
        nread -= headersize;
 
        if (nread < smb_maxcnt) {
-               char *buf = SMB_CALLOC_ARRAY(char, 1024);
+               char *buf = SMB_CALLOC_ARRAY(char, SHORT_SEND_BUFSIZE);
                if (!buf) {
                        exit_server_cleanly("sendfile_short_send: "
                                "malloc failed");
@@ -2819,7 +2820,7 @@ static void sendfile_short_send(files_struct *fsp,
                         */
                        size_t to_write;
 
-                       to_write = MIN(sizeof(buf), smb_maxcnt - nread);
+                       to_write = MIN(SHORT_SEND_BUFSIZE, smb_maxcnt - nread);
                        if (write_data(smbd_server_fd(), buf, to_write) != to_write) {
                                exit_server_cleanly("sendfile_short_send: "
                                        "write_data failed");