From f5dcac6e8ed17a45d82ce395b01f8d5418a11331 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 30 Oct 2007 12:54:39 -0700 Subject: Our userlevel SMBwriteX call is non-standard in that it sometimes uses a 12-word write and doesn't include a pad byte (as Windows does). Fix this so that we are identical to Windows clients. This will make recvfile processing much easier to detect (as we can just read a standard writeX header length to decide). Jeremy. (This used to be commit 3d3d1b806aef3617abaac46daf230ed32076e2ce) --- source3/libsmb/clireadwrite.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'source3') diff --git a/source3/libsmb/clireadwrite.c b/source3/libsmb/clireadwrite.c index 0d037e946e..e2d5337ee4 100644 --- a/source3/libsmb/clireadwrite.c +++ b/source3/libsmb/clireadwrite.c @@ -291,7 +291,7 @@ static bool cli_issue_write(struct cli_state *cli, int fnum, off_t offset, char *p; bool large_writex = False; - if (size > cli->bufsize) { + if (size + 1 > cli->bufsize) { cli->outbuf = (char *)SMB_REALLOC(cli->outbuf, size + 1024); if (!cli->outbuf) { return False; @@ -307,7 +307,7 @@ static bool cli_issue_write(struct cli_state *cli, int fnum, off_t offset, memset(cli->outbuf,'\0',smb_size); memset(cli->inbuf,'\0',smb_size); - if (((SMB_BIG_UINT)offset >> 32) || (size > 0xFFFF)) { + if (cli->capabilities & CAP_LARGE_FILES) { large_writex = True; } @@ -315,11 +315,11 @@ static bool cli_issue_write(struct cli_state *cli, int fnum, off_t offset, set_message(cli->outbuf,14,0,True); else set_message(cli->outbuf,12,0,True); - + SCVAL(cli->outbuf,smb_com,SMBwriteX); SSVAL(cli->outbuf,smb_tid,cli->cnum); cli_setup_packet(cli); - + SCVAL(cli->outbuf,smb_vwv0,0xFF); SSVAL(cli->outbuf,smb_vwv2,fnum); @@ -336,19 +336,21 @@ static bool cli_issue_write(struct cli_state *cli, int fnum, off_t offset, */ SSVAL(cli->outbuf,smb_vwv9,((size>>16)&1)); SSVAL(cli->outbuf,smb_vwv10,size); + /* +1 is pad byte. */ SSVAL(cli->outbuf,smb_vwv11, - smb_buf(cli->outbuf) - smb_base(cli->outbuf)); + smb_buf(cli->outbuf) - smb_base(cli->outbuf) + 1); if (large_writex) { SIVAL(cli->outbuf,smb_vwv12,(((SMB_BIG_UINT)offset)>>32) & 0xffffffff); } - - p = smb_base(cli->outbuf) + SVAL(cli->outbuf,smb_vwv11); + + p = smb_base(cli->outbuf) + SVAL(cli->outbuf,smb_vwv11) -1; + *p++ = '\0'; /* pad byte. */ memcpy(p, buf, size); cli_setup_bcc(cli, p+size); SSVAL(cli->outbuf,smb_mid,cli->mid + i); - + show_msg(cli->outbuf); return cli_send_smb(cli); } -- cgit