summaryrefslogtreecommitdiff
path: root/source4/smb_server/blob.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2008-02-14 12:30:31 +1100
committerAndrew Tridgell <tridge@samba.org>2008-02-14 12:30:31 +1100
commit839ab724dc2d204bfbb0693aeed64f6f83a4266b (patch)
treeec1db35884c7601a58a7cbeaddb94c75fd6668ec /source4/smb_server/blob.c
parente870cfec9f3512b0f1bd3110d7b975652525e28a (diff)
downloadsamba-839ab724dc2d204bfbb0693aeed64f6f83a4266b.tar.gz
samba-839ab724dc2d204bfbb0693aeed64f6f83a4266b.tar.bz2
samba-839ab724dc2d204bfbb0693aeed64f6f83a4266b.zip
Fixed SMB2 rename operations from Vista clients
We needed a flag in bufinfo to mark packets as SMB2, as it seems that SMB2 uses a different format for the RenameInformation buffer than SMB does Also handle the fact that SMB2 clients give the full path to the target file in the rename, not a relative path (This used to be commit 52d7972d95ddc19d22a4187b4d4428a6c3ed32d5)
Diffstat (limited to 'source4/smb_server/blob.c')
-rw-r--r--source4/smb_server/blob.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/source4/smb_server/blob.c b/source4/smb_server/blob.c
index caf6fb447d..795e7ce585 100644
--- a/source4/smb_server/blob.c
+++ b/source4/smb_server/blob.c
@@ -523,7 +523,7 @@ NTSTATUS smbsrv_pull_passthru_sfileinfo(TALLOC_CTX *mem_ctx,
int default_str_flags,
struct request_bufinfo *bufinfo)
{
- uint32_t len;
+ uint32_t len, ofs;
DATA_BLOB str_blob;
switch (level) {
@@ -563,14 +563,23 @@ NTSTATUS smbsrv_pull_passthru_sfileinfo(TALLOC_CTX *mem_ctx,
if (!bufinfo) {
return NT_STATUS_INTERNAL_ERROR;
}
- BLOB_CHECK_MIN_SIZE(blob, 12);
-
- st->rename_information.in.overwrite = CVAL(blob->data, 0);
- st->rename_information.in.root_fid = IVAL(blob->data, 4);
- len = IVAL(blob->data, 8);
- str_blob.data = blob->data+12;
- str_blob.length = MIN(blob->length, len);
- smbsrv_blob_pull_string(bufinfo, &str_blob, 0,
+ if (bufinfo->flags & BUFINFO_FLAG_SMB2) {
+ /* SMB2 uses a different format for rename information */
+ BLOB_CHECK_MIN_SIZE(blob, 20);
+ st->rename_information.in.overwrite = CVAL(blob->data, 0);
+ st->rename_information.in.root_fid = BVAL(blob->data, 4);
+ len = IVAL(blob->data,16);
+ ofs = 20;
+ } else {
+ BLOB_CHECK_MIN_SIZE(blob, 12);
+ st->rename_information.in.overwrite = CVAL(blob->data, 0);
+ st->rename_information.in.root_fid = IVAL(blob->data, 4);
+ len = IVAL(blob->data, 8);
+ ofs = 12;
+ }
+ str_blob = *blob;
+ str_blob.length = MIN(str_blob.length, ofs+len);
+ smbsrv_blob_pull_string(bufinfo, &str_blob, ofs,
&st->rename_information.in.new_name,
STR_UNICODE);
if (st->rename_information.in.new_name == NULL) {