summaryrefslogtreecommitdiff
path: root/source4/ntvfs/posix/pvfs_resolve.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2004-10-22 06:55:18 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:02:25 -0500
commitf71e7ae1e34510081c393f5ae73a279e8c4d0641 (patch)
tree47de7aec83d0ff0649758cacc046f2aeb2133c0c /source4/ntvfs/posix/pvfs_resolve.c
parent6e8867bff5ac95a7f509e3fdc60183cc64d921eb (diff)
downloadsamba-f71e7ae1e34510081c393f5ae73a279e8c4d0641.tar.gz
samba-f71e7ae1e34510081c393f5ae73a279e8c4d0641.tar.bz2
samba-f71e7ae1e34510081c393f5ae73a279e8c4d0641.zip
r3133: - more consistent error checking in rename and setfileinfo
- add paranoid checking of device/inode change during open to detect race conditions (This used to be commit 043361fed487ed494fa497ffde1007b3f3bc0c29)
Diffstat (limited to 'source4/ntvfs/posix/pvfs_resolve.c')
-rw-r--r--source4/ntvfs/posix/pvfs_resolve.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/source4/ntvfs/posix/pvfs_resolve.c b/source4/ntvfs/posix/pvfs_resolve.c
index 97068c3d03..5b86cd3a73 100644
--- a/source4/ntvfs/posix/pvfs_resolve.c
+++ b/source4/ntvfs/posix/pvfs_resolve.c
@@ -364,10 +364,29 @@ NTSTATUS pvfs_resolve_partial(struct pvfs_state *pvfs, TALLOC_CTX *mem_ctx,
NTSTATUS pvfs_resolve_name_fd(struct pvfs_state *pvfs, int fd,
struct pvfs_filename *name)
{
+ dev_t device;
+ ino_t inode;
+
+ if (name->exists) {
+ device = name->st.st_dev;
+ inode = name->st.st_ino;
+ }
+
if (fstat(fd, &name->st) == -1) {
return NT_STATUS_INVALID_HANDLE;
}
+ if (name->exists &&
+ (device != name->st.st_dev || inode != name->st.st_ino)) {
+ /* the file we are looking at has changed! this could
+ be someone trying to exploit a race
+ condition. Certainly we don't want to continue
+ operating on this file */
+ DEBUG(0,("pvfs: WARNING: file '%s' changed during resole - failing\n",
+ name->full_name));
+ return NT_STATUS_UNEXPECTED_IO_ERROR;
+ }
+
name->exists = True;
return pvfs_fill_dos_info(pvfs, name);