return status;
}
+
+
+/*
+ a simplified interface to access check, designed for calls that
+ do not take or return an access check mask
+*/
+NTSTATUS pvfs_access_check_simple(struct pvfs_state *pvfs,
+ struct smbsrv_request *req,
+ struct pvfs_filename *name,
+ uint32_t access_needed)
+{
+ return pvfs_access_check(pvfs, req, name, &access_needed);
+}
determine if a file can be deleted, or if it is prevented by an
already open file
*/
-NTSTATUS pvfs_can_delete(struct pvfs_state *pvfs, struct pvfs_filename *name)
+NTSTATUS pvfs_can_delete(struct pvfs_state *pvfs,
+ struct smbsrv_request *req,
+ struct pvfs_filename *name)
{
NTSTATUS status;
DATA_BLOB key;
NTCREATEX_OPTIONS_DELETE_ON_CLOSE,
SEC_STD_DELETE);
+ if (NT_STATUS_IS_OK(status)) {
+ status = pvfs_access_check_simple(pvfs, req, name, SEC_STD_DELETE);
+ }
+
return status;
}
status = pvfs_resolve_partial(pvfs, mem_ctx,
dir_path, fname2, &name2);
if (NT_STATUS_IS_OK(status)) {
- status = pvfs_can_delete(pvfs, name2);
+ status = pvfs_can_delete(pvfs, req, name2);
if (!NT_STATUS_IS_OK(status)) {
talloc_free(mem_ctx);
return status;
/*
unlink a stream
*/
-static NTSTATUS pvfs_unlink_stream(struct pvfs_state *pvfs, struct pvfs_filename *name,
+static NTSTATUS pvfs_unlink_stream(struct pvfs_state *pvfs,
+ struct smbsrv_request *req,
+ struct pvfs_filename *name,
uint16_t attrib)
{
NTSTATUS status;
return status;
}
- status = pvfs_can_delete(pvfs, name);
+ status = pvfs_can_delete(pvfs, req, name);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
/*
unlink one file
*/
-static NTSTATUS pvfs_unlink_one(struct pvfs_state *pvfs, TALLOC_CTX *mem_ctx,
+static NTSTATUS pvfs_unlink_one(struct pvfs_state *pvfs,
+ struct smbsrv_request *req,
const char *unix_path,
const char *fname, uint32_t attrib)
{
NTSTATUS status;
/* get a pvfs_filename object */
- status = pvfs_resolve_partial(pvfs, mem_ctx,
+ status = pvfs_resolve_partial(pvfs, req,
unix_path, fname, &name);
if (!NT_STATUS_IS_OK(status)) {
return status;
return status;
}
- status = pvfs_can_delete(pvfs, name);
+ status = pvfs_can_delete(pvfs, req, name);
if (!NT_STATUS_IS_OK(status)) {
talloc_free(name);
return status;
}
if (name->stream_name) {
- return pvfs_unlink_stream(pvfs, name, unl->in.attrib);
+ return pvfs_unlink_stream(pvfs, req, name, unl->in.attrib);
}
/* get list of matching files */