Allow smbd_smb2_request_error_ex() to cope with unread bytes on error.
authorJeremy Allison <jra@samba.org>
Tue, 19 Mar 2013 19:36:52 +0000 (12:36 -0700)
committerJeremy Allison <jra@samba.org>
Fri, 19 Apr 2013 21:10:55 +0000 (14:10 -0700)
Drain the socket if a RECVFILE write failed.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Stefan (metze) Metzmacher <metze@samba.org>
source3/smbd/smb2_server.c

index eb7059ed9b3908a31792392c834cb4d7ee6e8045..7eb62fcfb317eaf32089bbb790f77c33e978fd84 100644 (file)
@@ -2621,11 +2621,21 @@ NTSTATUS smbd_smb2_request_error_ex(struct smbd_smb2_request *req,
 {
        DATA_BLOB body;
        uint8_t *outhdr = SMBD_SMB2_OUT_HDR_PTR(req);
+       size_t unread_bytes = smbd_smb2_unread_bytes(req);
 
        DEBUG(10,("smbd_smb2_request_error_ex: idx[%d] status[%s] |%s| at %s\n",
                  req->current_idx, nt_errstr(status), info ? " +info" : "",
                  location));
 
+       if (unread_bytes) {
+               /* Recvfile error. Drain incoming socket. */
+               size_t ret = drain_socket(req->sconn->sock, unread_bytes);
+               if (ret != unread_bytes) {
+                       smbd_server_connection_terminate(req->sconn,
+                               "Failed to drain SMB2 socket\n");
+               }
+       }
+
        body.data = outhdr + SMB2_HDR_BODY;
        body.length = 8;
        SSVAL(body.data, 0, 9);