r3234: in SMBreadx, if the client asks for exactly 65535 bytes then don't try
authorAndrew Tridgell <tridge@samba.org>
Tue, 26 Oct 2004 05:32:11 +0000 (05:32 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:04:43 +0000 (13:04 -0500)
to align the buffer, as that would make the read reply not fit
(This used to be commit 70be45de05993d386ceaf54325d1c3023008eaed)

source4/smb_server/reply.c

index 05919921ca7246c20b544bb040a7dfcad4f45edb..99291d013454244185dd52102d1157d7b4cfb9e0 100644 (file)
@@ -850,7 +850,13 @@ static void reply_read_and_X_send(struct smbsrv_request *req)
 
        /* readx reply packets can be over-sized */
        req->control_flags |= REQ_CONTROL_LARGE;
-       req_grow_data(req, 1 + io->readx.out.nread);
+       if (io->readx.in.maxcnt != 0xFFFF &&
+           io->readx.in.mincnt != 0xFFFF) {
+               req_grow_data(req, 1 + io->readx.out.nread);
+               SCVAL(req->out.data, 0, 0); /* padding */
+       } else {
+               req_grow_data(req, io->readx.out.nread);
+       }
 
        /* construct reply */
        SSVAL(req->out.vwv, VWV(0), SMB_CHAIN_NONE);
@@ -860,7 +866,6 @@ static void reply_read_and_X_send(struct smbsrv_request *req)
        REQ_VWV_RESERVED(4, 1);
        SSVAL(req->out.vwv, VWV(5), io->readx.out.nread);
        SSVAL(req->out.vwv, VWV(6), PTR_DIFF(io->readx.out.data, req->out.hdr));
-       SCVAL(req->out.data, 0, 0); /* padding */
        REQ_VWV_RESERVED(7, 5);
 
        chain_reply(req);
@@ -897,7 +902,12 @@ void reply_read_and_X(struct smbsrv_request *req)
        req_setup_reply(req, 12, 1 + io->readx.in.maxcnt);
 
        /* tell the backend where to put the data. Notice the pad byte. */
-       io->readx.out.data = req->out.data + 1;
+       if (io->readx.in.maxcnt != 0xFFFF &&
+           io->readx.in.mincnt != 0xFFFF) {
+               io->readx.out.data = req->out.data + 1;
+       } else {
+               io->readx.out.data = req->out.data;
+       }
 
        req->control_flags |= REQ_CONTROL_MAY_ASYNC;
        req->async.send_fn = reply_read_and_X_send;