summaryrefslogtreecommitdiff
path: root/source4/smb_server/blob.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2008-02-14 14:54:21 +1100
committerAndrew Tridgell <tridge@samba.org>2008-02-14 14:54:21 +1100
commit4a04a5e620a4666fc123d04cb96ef391de72c469 (patch)
tree81801b0f146d77f546f03382d644ca47d334bfe2 /source4/smb_server/blob.c
parent501e8fbc3dd49e4e1b9ccc08f830af4f8c1a1095 (diff)
downloadsamba-4a04a5e620a4666fc123d04cb96ef391de72c469.tar.gz
samba-4a04a5e620a4666fc123d04cb96ef391de72c469.tar.bz2
samba-4a04a5e620a4666fc123d04cb96ef391de72c469.zip
A better way to handle the different format of RenameInformation in SMB2
We now define a separate info level RAW_SFILEINFO_RENAME_INFORMATION_SMB2 and set that level when handling SMB2 packets. This makes the parsers clearer. (This used to be commit f6cdf3f1177f63d80be757f007eb15380839b4f5)
Diffstat (limited to 'source4/smb_server/blob.c')
-rw-r--r--source4/smb_server/blob.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/source4/smb_server/blob.c b/source4/smb_server/blob.c
index 795e7ce585..8c813204f3 100644
--- a/source4/smb_server/blob.c
+++ b/source4/smb_server/blob.c
@@ -563,20 +563,32 @@ NTSTATUS smbsrv_pull_passthru_sfileinfo(TALLOC_CTX *mem_ctx,
if (!bufinfo) {
return NT_STATUS_INTERNAL_ERROR;
}
- 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;
+ 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) {
+ return NT_STATUS_FOOBAR;
+ }
+
+ return NT_STATUS_OK;
+
+ case RAW_SFILEINFO_RENAME_INFORMATION_SMB2:
+ /* SMB2 uses a different format for rename information */
+ if (!bufinfo) {
+ return NT_STATUS_INTERNAL_ERROR;
}
+ BLOB_CHECK_MIN_SIZE(blob, 20);
+ st->rename_information.in.overwrite = CVAL(blob->data, 0);
+ st->rename_information.in.root_fid = BVAL(blob->data, 8);
+ len = IVAL(blob->data,16);
+ ofs = 20;
str_blob = *blob;
str_blob.length = MIN(str_blob.length, ofs+len);
smbsrv_blob_pull_string(bufinfo, &str_blob, ofs,