summaryrefslogtreecommitdiff
path: root/source4/smb_server/blob.c
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2006-06-28 15:08:54 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:09:36 -0500
commitf8d845446114cd138b908de71c2b989a32ea1508 (patch)
treecca8f4da717b89816d1e0ef5b3c788280fd2c42d /source4/smb_server/blob.c
parent6e92c83d524cf62a1b5310f443548febab217b61 (diff)
downloadsamba-f8d845446114cd138b908de71c2b989a32ea1508.tar.gz
samba-f8d845446114cd138b908de71c2b989a32ea1508.tar.bz2
samba-f8d845446114cd138b908de71c2b989a32ea1508.zip
r16621: split out passthru levels of setfileinfo
metze (This used to be commit 6cd64cb78f23c88029b8b5ef712b3f8a26e8528f)
Diffstat (limited to 'source4/smb_server/blob.c')
-rw-r--r--source4/smb_server/blob.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/source4/smb_server/blob.c b/source4/smb_server/blob.c
index 6e798035a2..19d29edd84 100644
--- a/source4/smb_server/blob.c
+++ b/source4/smb_server/blob.c
@@ -32,6 +32,12 @@
NT_STATUS_NOT_OK_RETURN(_status); \
} while (0)
+#define BLOB_CHECK_MIN_SIZE(blob, size) do { \
+ if ((blob)->length < (size)) { \
+ return NT_STATUS_INFO_LENGTH_MISMATCH; \
+ } \
+} while (0)
+
/* grow the data size of a trans2 reply */
NTSTATUS smbsrv_blob_grow_data(TALLOC_CTX *mem_ctx,
DATA_BLOB *blob,
@@ -493,3 +499,84 @@ NTSTATUS smbsrv_push_passthru_fileinfo(TALLOC_CTX *mem_ctx,
return NT_STATUS_INVALID_LEVEL;
}
+
+NTSTATUS smbsrv_pull_passthru_sfileinfo(TALLOC_CTX *mem_ctx,
+ enum smb_setfileinfo_level level,
+ union smb_setfileinfo *st,
+ const DATA_BLOB *blob,
+ int default_str_flags,
+ struct smbsrv_request *req)
+{
+ uint32_t len;
+ DATA_BLOB str_blob;
+
+ switch (level) {
+ case SMB_SFILEINFO_BASIC_INFORMATION:
+ BLOB_CHECK_MIN_SIZE(blob, 36);
+
+ st->basic_info.in.create_time = pull_nttime(blob->data, 0);
+ st->basic_info.in.access_time = pull_nttime(blob->data, 8);
+ st->basic_info.in.write_time = pull_nttime(blob->data, 16);
+ st->basic_info.in.change_time = pull_nttime(blob->data, 24);
+ st->basic_info.in.attrib = IVAL(blob->data, 32);
+
+ return NT_STATUS_OK;
+
+ case SMB_SFILEINFO_DISPOSITION_INFORMATION:
+ BLOB_CHECK_MIN_SIZE(blob, 1);
+
+ st->disposition_info.in.delete_on_close = CVAL(blob->data, 0);
+
+ return NT_STATUS_OK;
+
+ case SMB_SFILEINFO_ALLOCATION_INFORMATION:
+ BLOB_CHECK_MIN_SIZE(blob, 8);
+
+ st->allocation_info.in.alloc_size = BVAL(blob->data, 0);
+
+ return NT_STATUS_OK;
+
+ case RAW_SFILEINFO_END_OF_FILE_INFORMATION:
+ BLOB_CHECK_MIN_SIZE(blob, 8);
+
+ st->end_of_file_info.in.size = BVAL(blob->data, 0);
+
+ return NT_STATUS_OK;
+
+ case RAW_SFILEINFO_RENAME_INFORMATION:
+ 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(req, &str_blob, 0,
+ &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_POSITION_INFORMATION:
+ BLOB_CHECK_MIN_SIZE(blob, 8);
+
+ st->position_information.in.position = BVAL(blob->data, 0);
+
+ return NT_STATUS_OK;
+
+ case RAW_SFILEINFO_MODE_INFORMATION:
+ BLOB_CHECK_MIN_SIZE(blob, 4);
+
+ st->mode_information.in.mode = IVAL(blob->data, 0);
+
+ return NT_STATUS_OK;
+
+ default:
+ return NT_STATUS_INVALID_LEVEL;
+ }
+
+ return NT_STATUS_INVALID_LEVEL;
+}