diff options
-rw-r--r-- | source3/smbd/reply.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index d2e1f8be5f..418c8ba788 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -3358,14 +3358,13 @@ static void send_file_readX(connection_struct *conn, struct smb_request *req, return; } - if (startpos > sbuf.st_size) { - smb_maxcnt = 0; - } else if (smb_maxcnt > (sbuf.st_size - startpos)) { - smb_maxcnt = (sbuf.st_size - startpos); - } - - if (smb_maxcnt == 0) { - goto normal_read; + if (!S_ISREG(sbuf.st_mode) || (startpos > sbuf.st_size) + || (smb_maxcnt > (sbuf.st_size - startpos))) { + /* + * We already know that we would do a short read, so don't + * try the sendfile() path. + */ + goto nosendfile_read; } #if defined(WITH_SENDFILE) @@ -3482,6 +3481,8 @@ normal_read: return; } +nosendfile_read: + reply_outbuf(req, 12, smb_maxcnt); nread = read_file(fsp, smb_buf(req->outbuf), startpos, smb_maxcnt); |