From 237127fbe4071abea20f3e5005f5a1e549f12788 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 22 Apr 2013 18:05:40 +0200 Subject: [PATCH] Fix _user_entry_ref_to_path() in chroot * Add "bool kernel" parameter to vfs_entry_ref_to_path(), so it can be specified for which I/O context the entry ref shall be translated. * _user_entry_ref_to_path(): Use the calling team's I/O context instead of the kernel's. Fixes the bug that in a chroot the syscall would return a path for outside the chroot. --- headers/private/kernel/vfs.h | 2 +- src/add-ons/kernel/file_systems/packagefs/Volume.cpp | 2 +- src/system/kernel/device_manager/legacy_drivers.cpp | 2 +- .../kernel/disk_device_manager/KDiskDeviceManager.cpp | 4 ++-- src/system/kernel/fs/vfs.cpp | 8 ++++---- src/system/kernel/module.cpp | 4 ++-- src/tools/fs_shell/vfs.cpp | 4 ++-- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/headers/private/kernel/vfs.h b/headers/private/kernel/vfs.h index cdde48d47c..ed9bb66d51 100644 --- a/headers/private/kernel/vfs.h +++ b/headers/private/kernel/vfs.h @@ -119,7 +119,7 @@ status_t vfs_stat_node_ref(dev_t device, ino_t inode, struct stat *stat); status_t vfs_get_vnode_name(struct vnode *vnode, char *name, size_t nameSize); status_t vfs_entry_ref_to_path(dev_t device, ino_t inode, const char *leaf, - char *path, size_t pathLength); + bool kernel, char *path, size_t pathLength); status_t vfs_get_cwd(dev_t *_mountID, ino_t *_vnodeID); void vfs_unlock_vnode_if_locked(struct file_descriptor *descriptor); status_t vfs_unmount(dev_t mountID, uint32 flags); diff --git a/src/add-ons/kernel/file_systems/packagefs/Volume.cpp b/src/add-ons/kernel/file_systems/packagefs/Volume.cpp index 426d851f3d..8fdc491b01 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Volume.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/Volume.cpp @@ -162,7 +162,7 @@ struct Volume::PackagesDirectory { RETURN_ERROR(normalizedPath.InitCheck()); char* normalizedPathBuffer = normalizedPath.LockBuffer(); - error = vfs_entry_ref_to_path(fDeviceID, fNodeID, NULL, + error = vfs_entry_ref_to_path(fDeviceID, fNodeID, NULL, true, normalizedPathBuffer, normalizedPath.BufferSize()); if (error != B_OK) RETURN_ERROR(error); diff --git a/src/system/kernel/device_manager/legacy_drivers.cpp b/src/system/kernel/device_manager/legacy_drivers.cpp index 0738a21555..dc7362f3cc 100644 --- a/src/system/kernel/device_manager/legacy_drivers.cpp +++ b/src/system/kernel/device_manager/legacy_drivers.cpp @@ -1086,7 +1086,7 @@ DirectoryWatcher::EventOccurred(NotificationService& service, KPath path(B_PATH_NAME_LENGTH + 1); if (path.InitCheck() != B_OK || vfs_entry_ref_to_path(device, directory, - name, path.LockBuffer(), path.BufferSize()) != B_OK) + name, true, path.LockBuffer(), path.BufferSize()) != B_OK) return; path.UnlockBuffer(); diff --git a/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp b/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp index 3916f1ae24..b77aaa061f 100644 --- a/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp +++ b/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp @@ -201,8 +201,8 @@ public: KPath path(B_PATH_NAME_LENGTH + 1); if (path.InitCheck() != B_OK || vfs_entry_ref_to_path(event->device, event->directory, - event->name, path.LockBuffer(), - path.BufferSize()) != B_OK) { + event->name, true, path.LockBuffer(), + path.BufferSize()) != B_OK) { delete event; return B_ERROR; } diff --git a/src/system/kernel/fs/vfs.cpp b/src/system/kernel/fs/vfs.cpp index cf2eb6dc96..0106ff708e 100644 --- a/src/system/kernel/fs/vfs.cpp +++ b/src/system/kernel/fs/vfs.cpp @@ -4664,7 +4664,7 @@ vfs_get_vnode_name(struct vnode* vnode, char* name, size_t nameSize) status_t vfs_entry_ref_to_path(dev_t device, ino_t inode, const char* leaf, - char* path, size_t pathLength) + bool kernel, char* path, size_t pathLength) { struct vnode* vnode; status_t status; @@ -4677,7 +4677,7 @@ vfs_entry_ref_to_path(dev_t device, ino_t inode, const char* leaf, if (leaf && (strcmp(leaf, ".") == 0 || strcmp(leaf, "..") == 0)) { // special cases "." and "..": we can directly get the vnode of the // referenced directory - status = entry_ref_to_vnode(device, inode, leaf, false, true, &vnode); + status = entry_ref_to_vnode(device, inode, leaf, false, kernel, &vnode); leaf = NULL; } else status = get_vnode(device, inode, &vnode, true, false); @@ -4685,7 +4685,7 @@ vfs_entry_ref_to_path(dev_t device, ino_t inode, const char* leaf, return status; // get the directory path - status = dir_vnode_to_path(vnode, path, pathLength, true); + status = dir_vnode_to_path(vnode, path, pathLength, kernel); put_vnode(vnode); // we don't need the vnode anymore if (status != B_OK) @@ -8708,7 +8708,7 @@ _user_entry_ref_to_path(dev_t device, ino_t inode, const char* leaf, } status_t status = vfs_entry_ref_to_path(device, inode, leaf, - path.LockBuffer(), path.BufferSize()); + false, path.LockBuffer(), path.BufferSize()); if (status != B_OK) return status; diff --git a/src/system/kernel/module.cpp b/src/system/kernel/module.cpp index 7a02d10af2..a0ed7fd90c 100644 --- a/src/system/kernel/module.cpp +++ b/src/system/kernel/module.cpp @@ -1412,7 +1412,7 @@ ModuleNotificationService::_AddModuleNode(dev_t device, ino_t node, int fd, KPath path; status = path.InitCheck(); if (status == B_OK) { - status = vfs_entry_ref_to_path(device, directory, name, + status = vfs_entry_ref_to_path(device, directory, name, true, path.LockBuffer(), path.BufferSize()); } if (status != B_OK) @@ -1583,7 +1583,7 @@ ModuleNotificationService::_Notify(int32 opcode, dev_t device, ino_t directory, if (name != NULL) { // we have an entry ref if (pathBuffer.InitCheck() != B_OK - || vfs_entry_ref_to_path(device, directory, name, + || vfs_entry_ref_to_path(device, directory, name, true, pathBuffer.LockBuffer(), pathBuffer.BufferSize()) != B_OK) return; diff --git a/src/tools/fs_shell/vfs.cpp b/src/tools/fs_shell/vfs.cpp index 8bc875ec52..b179269d1b 100644 --- a/src/tools/fs_shell/vfs.cpp +++ b/src/tools/fs_shell/vfs.cpp @@ -2690,7 +2690,7 @@ vfs_get_vnode_name(void *_vnode, char *name, fssh_size_t nameSize) fssh_status_t vfs_entry_ref_to_path(fssh_dev_t device, fssh_ino_t inode, const char *leaf, - char *path, fssh_size_t pathLength) + bool kernel, char *path, fssh_size_t pathLength) { struct vnode *vnode; fssh_status_t status; @@ -5691,7 +5691,7 @@ fssh_status_t _kern_entry_ref_to_path(fssh_dev_t device, fssh_ino_t inode, const char *leaf, char* path, fssh_size_t pathLength) { - return vfs_entry_ref_to_path(device, inode, leaf, path, pathLength); + return vfs_entry_ref_to_path(device, inode, leaf, true, path, pathLength); }