s3:smbd: fix the lockread numtoread calculation depending on the max_send.
authorStefan Metzmacher <metze@samba.org>
Tue, 4 Mar 2014 13:07:26 +0000 (14:07 +0100)
committerKarolin Seeger <kseeger@samba.org>
Tue, 1 Apr 2014 07:08:06 +0000 (09:08 +0200)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
(cherry picked from commit f69be2c28e097c66907df264794706006fe0ae7f)

source3/smbd/reply.c

index 04f1b7f812b7ca779521ba2061cd424d1aa9b089..8f6864b01ad4fdcc2bdeac034baff6c687f9197b 100644 (file)
@@ -3469,6 +3469,7 @@ void reply_lockread(struct smb_request *req)
        char *data;
        off_t startpos;
        size_t numtoread;
+       size_t maxtoread;
        NTSTATUS status;
        files_struct *fsp;
        struct byte_range_lock *br_lck = NULL;
@@ -3499,14 +3500,12 @@ void reply_lockread(struct smb_request *req)
        numtoread = SVAL(req->vwv+1, 0);
        startpos = IVAL_TO_SMB_OFF_T(req->vwv+2, 0);
 
-       numtoread = MIN(BUFFER_SIZE - (smb_size + 5*2 + 3), numtoread);
-
        /*
         * NB. Discovered by Menny Hamburger at Mainsoft. This is a core+
         * protocol request that predates the read/write lock concept. 
         * Thus instead of asking for a read lock here we need to ask
         * for a write lock. JRA.
-        * Note that the requested lock size is unaffected by max_recv.
+        * Note that the requested lock size is unaffected by max_send.
         */
 
        br_lck = do_lock(req->sconn->msg_ctx,
@@ -3529,15 +3528,16 @@ void reply_lockread(struct smb_request *req)
        }
 
        /*
-        * However the requested READ size IS affected by max_recv. Insanity.... JRA.
+        * However the requested READ size IS affected by max_send. Insanity.... JRA.
         */
+       maxtoread = sconn->smb1.sessions.max_send - (smb_size + 5*2 + 3);
 
-       if (numtoread > sconn->smb1.negprot.max_recv) {
-               DEBUG(0,("reply_lockread: requested read size (%u) is greater than maximum allowed (%u). \
+       if (numtoread > maxtoread) {
+               DEBUG(0,("reply_lockread: requested read size (%u) is greater than maximum allowed (%u/%u). \
 Returning short read of maximum allowed for compatibility with Windows 2000.\n",
-                       (unsigned int)numtoread,
-                       (unsigned int)sconn->smb1.negprot.max_recv));
-               numtoread = MIN(numtoread, sconn->smb1.negprot.max_recv);
+                       (unsigned int)numtoread, (unsigned int)maxtoread,
+                       (unsigned int)sconn->smb1.sessions.max_send));
+               numtoread = maxtoread;
        }
 
        reply_outbuf(req, 5, numtoread + 3);