diff --git a/source/smbd/reply.c b/source/smbd/reply.c index 46653cd..5cd8633 100644 --- a/source/smbd/reply.c +++ b/source/smbd/reply.c @@ -3210,14 +3210,20 @@ 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 (S_ISREG(sbuf.st_mode)) { + /* Only change the client values for a normal file. */ + 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 (smb_maxcnt == 0) { + goto normal_read; + } + } else { + /* Pipe or device read. */ + goto normal_nosendfile_read; } #if defined(WITH_SENDFILE) @@ -3311,25 +3317,27 @@ normal_read: } TALLOC_FREE(req->outbuf); return; - } else { - reply_outbuf(req, 12, smb_maxcnt); - - nread = read_file(fsp, smb_buf(req->outbuf), startpos, - smb_maxcnt); - if (nread < 0) { - reply_unixerror(req, ERRDOS, ERRnoaccess); - return; - } - - setup_readX_header((char *)req->outbuf, nread); + } - DEBUG( 3, ( "send_file_readX fnum=%d max=%d nread=%d\n", - fsp->fnum, (int)smb_maxcnt, (int)nread ) ); +normal_nosendfile_read: - chain_reply(req); + reply_outbuf(req, 12, smb_maxcnt); + nread = read_file(fsp, smb_buf(req->outbuf), startpos, + smb_maxcnt); + if (nread < 0) { + reply_unixerror(req, ERRDOS, ERRnoaccess); return; } + + setup_readX_header((char *)req->outbuf, nread); + + DEBUG( 3, ( "send_file_readX fnum=%d max=%d nread=%d\n", + fsp->fnum, (int)smb_maxcnt, (int)nread ) ); + + chain_reply(req); + + return; } /****************************************************************************