diff options
-rw-r--r-- | source3/smbd/aio.c | 25 | ||||
-rw-r--r-- | source3/smbd/reply.c | 15 |
2 files changed, 19 insertions, 21 deletions
diff --git a/source3/smbd/aio.c b/source3/smbd/aio.c index 0ba857e2e5..49855796b7 100644 --- a/source3/smbd/aio.c +++ b/source3/smbd/aio.c @@ -51,7 +51,7 @@ static struct aio_extra *aio_list_head; static struct aio_extra *create_aio_ex_read(files_struct *fsp, size_t buflen, uint16 mid, - const char *inbuf) + const uint8 *inbuf) { struct aio_extra *aio_ex = SMB_MALLOC_P(struct aio_extra); @@ -203,8 +203,7 @@ void initialize_async_io_handler(void) *****************************************************************************/ BOOL schedule_aio_read_and_X(connection_struct *conn, - char *inbuf, char *outbuf, - int length, int len_outbuf, + struct smb_request *req, files_struct *fsp, SMB_OFF_T startpos, size_t smb_maxcnt) { @@ -224,7 +223,7 @@ BOOL schedule_aio_read_and_X(connection_struct *conn, /* Only do this on non-chained and non-chaining reads not using the * write cache. */ - if (chain_size !=0 || (CVAL(inbuf,smb_vwv0) != 0xFF) + if (chain_size !=0 || (CVAL(req->inbuf,smb_vwv0) != 0xFF) || (lp_write_cache_size(SNUM(conn)) != 0) ) { return False; } @@ -236,18 +235,19 @@ BOOL schedule_aio_read_and_X(connection_struct *conn, return False; } - /* The following is safe from integer wrap as we've already - checked smb_maxcnt is 128k or less. */ - bufsize = PTR_DIFF(smb_buf(outbuf),outbuf) + smb_maxcnt; + /* The following is safe from integer wrap as we've already checked + smb_maxcnt is 128k or less. Wct is 12 for read replies */ + + bufsize = smb_size + 12 * 2 + smb_maxcnt; - if ((aio_ex = create_aio_ex_read(fsp, bufsize, - SVAL(inbuf,smb_mid), inbuf)) == NULL) { + if (!(aio_ex = create_aio_ex_read(fsp, bufsize, req->mid, + req->inbuf))) { DEBUG(10,("schedule_aio_read_and_X: malloc fail.\n")); return False; } - /* Copy the SMB header already setup in outbuf. */ - memcpy(aio_ex->outbuf, outbuf, smb_buf(outbuf) - outbuf); + construct_reply_common((char *)req->inbuf, aio_ex->outbuf); + set_message((char *)req->inbuf, aio_ex->outbuf, 12, 0, True); SCVAL(aio_ex->outbuf,smb_vwv0,0xFF); /* Never a chained reply. */ a = &aio_ex->acb; @@ -625,8 +625,7 @@ int process_aio_queue(void) } BOOL schedule_aio_read_and_X(connection_struct *conn, - char *inbuf, char *outbuf, - int length, int len_outbuf, + struct smb_request *req, files_struct *fsp, SMB_OFF_T startpos, size_t smb_maxcnt) { diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 7b981e1c8a..a62b54550e 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -2960,22 +2960,21 @@ void reply_read_and_X(connection_struct *conn, struct smb_request *req) return; } - if (!reply_prep_legacy(req, &inbuf, &outbuf, &length, &bufsize)) { - reply_nterror(req, NT_STATUS_NO_MEMORY); + if (!big_readX + && schedule_aio_read_and_X(conn, req, fsp, startpos, smb_maxcnt)) { END_PROFILE(SMBreadX); + reply_post_legacy(req, -1); return; } - set_message(inbuf,outbuf,12,0,True); - - if (!big_readX - && schedule_aio_read_and_X(conn, inbuf, outbuf, length, bufsize, - fsp, startpos, smb_maxcnt)) { + if (!reply_prep_legacy(req, &inbuf, &outbuf, &length, &bufsize)) { + reply_nterror(req, NT_STATUS_NO_MEMORY); END_PROFILE(SMBreadX); - reply_post_legacy(req, -1); return; } + set_message(inbuf,outbuf,12,0,True); + nread = send_file_readX(conn, inbuf, outbuf, length, bufsize, fsp, startpos, smb_maxcnt); /* Only call chain_reply if not an error. */ |