diff options
author | Jeremy Allison <jra@samba.org> | 2004-12-14 00:25:11 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 10:53:36 -0500 |
commit | 5b713a206bf9c05faad750512886f4bbeebb21f8 (patch) | |
tree | b40f70499c5557dc9d0b45e4db4660073a56f7a7 /source3/libsmb | |
parent | 00eede9a6b7e258faa6abe4de0d39a16bbcebd14 (diff) | |
download | samba-5b713a206bf9c05faad750512886f4bbeebb21f8.tar.gz samba-5b713a206bf9c05faad750512886f4bbeebb21f8.tar.bz2 samba-5b713a206bf9c05faad750512886f4bbeebb21f8.zip |
r4186: Fix client & server to allow 127k READX calls.
Jeremy.
(This used to be commit 831cb21a874601e4536c2cf76c5351e1d0defcb5)
Diffstat (limited to 'source3/libsmb')
-rw-r--r-- | source3/libsmb/cliconnect.c | 15 | ||||
-rw-r--r-- | source3/libsmb/clireadwrite.c | 8 |
2 files changed, 16 insertions, 7 deletions
diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c index 60691287e6..29a9533bd2 100644 --- a/source3/libsmb/cliconnect.c +++ b/source3/libsmb/cliconnect.c @@ -151,12 +151,7 @@ static uint32 cli_session_setup_capabilities(struct cli_state *cli) if (cli->use_level_II_oplocks) capabilities |= CAP_LEVEL_II_OPLOCKS; - if (cli->capabilities & CAP_UNICODE) - capabilities |= CAP_UNICODE; - - if (cli->capabilities & CAP_LARGE_FILES) - capabilities |= CAP_LARGE_FILES; - + capabilities |= (cli->capabilities & (CAP_UNICODE|CAP_LARGE_FILES|CAP_LARGE_READX|CAP_LARGE_WRITEX)); return capabilities; } @@ -1134,6 +1129,14 @@ BOOL cli_negprot(struct cli_state *cli) cli->sign_info.negotiated_smb_signing = True; } + if (cli->capabilities & (CAP_LARGE_READX|CAP_LARGE_WRITEX)) { + SAFE_FREE(cli->outbuf); + SAFE_FREE(cli->inbuf); + cli->outbuf = (char *)SMB_MALLOC(CLI_MAX_LARGE_READX_SIZE+SAFETY_MARGIN); + cli->inbuf = (char *)SMB_MALLOC(CLI_MAX_LARGE_READX_SIZE+SAFETY_MARGIN); + cli->bufsize = CLI_MAX_LARGE_READX_SIZE; + } + } else if (cli->protocol >= PROTOCOL_LANMAN1) { cli->use_spnego = False; cli->sec_mode = SVAL(cli->inbuf,smb_vwv1); diff --git a/source3/libsmb/clireadwrite.c b/source3/libsmb/clireadwrite.c index 3223098820..64f16e94ca 100644 --- a/source3/libsmb/clireadwrite.c +++ b/source3/libsmb/clireadwrite.c @@ -48,6 +48,7 @@ static BOOL cli_issue_read(struct cli_state *cli, int fnum, off_t offset, SIVAL(cli->outbuf,smb_vwv3,offset); SSVAL(cli->outbuf,smb_vwv5,size); SSVAL(cli->outbuf,smb_vwv6,size); + SSVAL(cli->outbuf,smb_vwv7,((size >> 16) & 1)); SSVAL(cli->outbuf,smb_mid,cli->mid + i); if (bigoffset) @@ -75,7 +76,11 @@ ssize_t cli_read(struct cli_state *cli, int fnum, char *buf, off_t offset, size_ * rounded down to a multiple of 1024. */ - readsize = (cli->max_xmit - (smb_size+32)) & ~1023; + if (cli->capabilities & CAP_LARGE_READX) { + readsize = CLI_MAX_LARGE_READX_SIZE; + } else { + readsize = (cli->max_xmit - (smb_size+32)) & ~1023; + } while (total < size) { readsize = MIN(readsize, size-total); @@ -117,6 +122,7 @@ ssize_t cli_read(struct cli_state *cli, int fnum, char *buf, off_t offset, size_ } size2 = SVAL(cli->inbuf, smb_vwv5); + size2 |= (SVAL(cli->inbuf, smb_vwv7) & 1); if (size2 > readsize) { DEBUG(5,("server returned more than we wanted!\n")); |