The branch, master has been updated via cae455f s3: Fix a "Invalid (state->nread >= 0)" warning via 216769f s3: Move the drain_socket on error to reply_write_and_X via 82b948a s3: Use "goto out;" in reply_write_and_X from 07386bb s3: Remove "size" param from switch_message
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit cae455f68802be2fa31328878be4119df1c1d864 Author: Volker Lendecke <v...@samba.org> Date: Mon Mar 5 15:56:55 2012 +0100 s3: Fix a "Invalid (state->nread >= 0)" warning Both read_from_internal_pipe and tstream_readv_pdu_queue_recv return ssize_t. Autobuild-User: Volker Lendecke <v...@samba.org> Autobuild-Date: Mon Mar 5 17:38:16 CET 2012 on sn-devel-104 commit 216769f2ce7d18a7ca83bf440b6efd7ad4675675 Author: Volker Lendecke <v...@samba.org> Date: Mon Mar 5 15:40:49 2012 +0100 s3: Move the drain_socket on error to reply_write_and_X That's the only case where this can happen, so we should not clutter the main code path. commit 82b948a8160e3b5bb80238413967ed7f5798a35c Author: Volker Lendecke <v...@samba.org> Date: Mon Mar 5 15:47:52 2012 +0100 s3: Use "goto out;" in reply_write_and_X ----------------------------------------------------------------------- Summary of changes: source3/rpc_server/srv_pipe_hnd.c | 2 +- source3/smbd/process.c | 9 --------- source3/smbd/reply.c | 36 ++++++++++++++++++------------------ 3 files changed, 19 insertions(+), 28 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/rpc_server/srv_pipe_hnd.c b/source3/rpc_server/srv_pipe_hnd.c index 3616922..e4172e7 100644 --- a/source3/rpc_server/srv_pipe_hnd.c +++ b/source3/rpc_server/srv_pipe_hnd.c @@ -687,7 +687,7 @@ struct np_read_state { struct np_proxy_state *p; struct np_ipc_readv_next_vector_state next_vector; - size_t nread; + ssize_t nread; bool is_data_outstanding; }; diff --git a/source3/smbd/process.c b/source3/smbd/process.c index 15e1efe..f61ad5d 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -1521,15 +1521,6 @@ static void construct_reply(struct smbd_server_connection *sconn, conn = switch_message(req->cmd, req); - if (req->unread_bytes) { - /* writeX failed. drain socket. */ - if (drain_socket(req->sconn->sock, req->unread_bytes) != - req->unread_bytes) { - smb_panic("failed to drain pending bytes"); - } - req->unread_bytes = 0; - } - if (req->done) { TALLOC_FREE(req); return; diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 26a928f..e3a3766 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -4494,8 +4494,7 @@ void reply_write_and_X(struct smb_request *req) if ((req->wct != 12) && (req->wct != 14)) { reply_nterror(req, NT_STATUS_INVALID_PARAMETER); - END_PROFILE(SMBwriteX); - return; + goto out; } numtowrite = SVAL(req->vwv+10, 0); @@ -4512,20 +4511,17 @@ void reply_write_and_X(struct smb_request *req) /* Can't do a recvfile write on IPC$ */ if (IS_IPC(conn)) { reply_nterror(req, NT_STATUS_INVALID_PARAMETER); - END_PROFILE(SMBwriteX); - return; + goto out; } if (numtowrite != req->unread_bytes) { reply_nterror(req, NT_STATUS_INVALID_PARAMETER); - END_PROFILE(SMBwriteX); - return; + goto out; } } else { if (smb_doff > smblen || smb_doff + numtowrite < numtowrite || smb_doff + numtowrite > smblen) { reply_nterror(req, NT_STATUS_INVALID_PARAMETER); - END_PROFILE(SMBwriteX); - return; + goto out; } } @@ -4533,12 +4529,10 @@ void reply_write_and_X(struct smb_request *req) if (IS_IPC(conn)) { if (req->unread_bytes) { reply_nterror(req, NT_STATUS_INVALID_PARAMETER); - END_PROFILE(SMBwriteX); - return; + goto out; } reply_pipe_write_and_X(req); - END_PROFILE(SMBwriteX); - return; + goto out; } fsp = file_fsp(req, SVAL(req->vwv+2, 0)); @@ -4546,14 +4540,12 @@ void reply_write_and_X(struct smb_request *req) write_through = BITSETW(req->vwv+7,0); if (!check_fsp(conn, req, fsp)) { - END_PROFILE(SMBwriteX); - return; + goto out; } if (!CHECK_WRITE(fsp)) { reply_nterror(req, NT_STATUS_ACCESS_DENIED); - END_PROFILE(SMBwriteX); - return; + goto out; } data = smb_base(req->inbuf) + smb_doff; @@ -4576,8 +4568,7 @@ void reply_write_and_X(struct smb_request *req) "used and we don't support 64 bit offsets.\n", (unsigned int)IVAL(req->vwv+12, 0) )); reply_nterror(req, NT_STATUS_ACCESS_DENIED); - END_PROFILE(SMBwriteX); - return; + goto out; } #endif /* LARGE_SMB_OFF_T */ @@ -4656,6 +4647,15 @@ void reply_write_and_X(struct smb_request *req) return; out: + if (req->unread_bytes) { + /* writeX failed. drain socket. */ + if (drain_socket(req->sconn->sock, req->unread_bytes) != + req->unread_bytes) { + smb_panic("failed to drain pending bytes"); + } + req->unread_bytes = 0; + } + END_PROFILE(SMBwriteX); return; } -- Samba Shared Repository