diff options
-rw-r--r-- | source3/libsmb/clireadwrite.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/source3/libsmb/clireadwrite.c b/source3/libsmb/clireadwrite.c index 1ee2196b76..e8c901755d 100644 --- a/source3/libsmb/clireadwrite.c +++ b/source3/libsmb/clireadwrite.c @@ -155,10 +155,17 @@ struct tevent_req *cli_read_andx_create(TALLOC_CTX *mem_ctx, SSVAL(state->vwv + 8, 0, 0); SSVAL(state->vwv + 9, 0, 0); - if ((uint64_t)offset >> 32) { + if (cli_state_capabilities(cli) & CAP_LARGE_FILES) { SIVAL(state->vwv + 10, 0, (((uint64_t)offset)>>32) & 0xffffffff); - wct += 2; + wct = 12; + } else { + if ((((uint64_t)offset) & 0xffffffff00000000LL) != 0) { + DEBUG(10, ("cli_read_andx_send got large offset where " + "the server does not support it\n")); + tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER); + return tevent_req_post(req, ev); + } } subreq = cli_smb_req_create(state, ev, cli, SMBreadX, 0, wct, |