diff options
-rw-r--r-- | source4/ntvfs/common/opendb.c | 20 | ||||
-rw-r--r-- | source4/ntvfs/posix/pvfs_open.c | 17 | ||||
-rw-r--r-- | source4/ntvfs/posix/pvfs_unlink.c | 4 |
3 files changed, 41 insertions, 0 deletions
diff --git a/source4/ntvfs/common/opendb.c b/source4/ntvfs/common/opendb.c index 3def23f190..5c962fbad0 100644 --- a/source4/ntvfs/common/opendb.c +++ b/source4/ntvfs/common/opendb.c @@ -335,3 +335,23 @@ NTSTATUS odb_set_create_options(struct odb_lock *lck, return status; } + + +/* + determine if a file is open +*/ +BOOL odb_is_open(struct odb_context *odb, DATA_BLOB *key) +{ + TDB_DATA dbuf; + TDB_DATA kbuf; + + kbuf.dptr = key->data; + kbuf.dsize = key->length; + + dbuf = tdb_fetch(odb->w->tdb, kbuf); + if (dbuf.dptr == NULL) { + return False; + } + free(dbuf.dptr); + return True; +} diff --git a/source4/ntvfs/posix/pvfs_open.c b/source4/ntvfs/posix/pvfs_open.c index e587ebbf95..7f06626706 100644 --- a/source4/ntvfs/posix/pvfs_open.c +++ b/source4/ntvfs/posix/pvfs_open.c @@ -703,3 +703,20 @@ NTSTATUS pvfs_change_create_options(struct pvfs_state *pvfs, return status; } + + +/* + determine if a file is open - used to prevent some operations on open files +*/ +BOOL pvfs_is_open(struct pvfs_state *pvfs, struct pvfs_filename *name) +{ + NTSTATUS status; + DATA_BLOB key; + + status = pvfs_locking_key(name, name, &key); + if (!NT_STATUS_IS_OK(status)) { + return False; + } + + return odb_is_open(pvfs->odb_context, &key); +} diff --git a/source4/ntvfs/posix/pvfs_unlink.c b/source4/ntvfs/posix/pvfs_unlink.c index 0f4ff8b148..d5e25b5622 100644 --- a/source4/ntvfs/posix/pvfs_unlink.c +++ b/source4/ntvfs/posix/pvfs_unlink.c @@ -80,6 +80,10 @@ NTSTATUS pvfs_unlink(struct ntvfs_module_context *ntvfs, return NT_STATUS_OBJECT_NAME_NOT_FOUND; } + if (pvfs_is_open(pvfs, name)) { + return NT_STATUS_SHARING_VIOLATION; + } + dir = talloc_p(req, struct pvfs_dir); if (dir == NULL) { return NT_STATUS_NO_MEMORY; |