From e079fff6827fdcf5ed4f5ad6740b43db81479b29 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Tue, 30 Jun 2026 13:38:21 -0400 Subject: [PATCH] file_systems/bindfs: Pass the correct node to the underlying FS in rename(). We were passing our own fs_vnode, not the underlying filesystem's. I guess this was just never tested, because it would've always crashed? Fixes #20156. --- .../file_systems/bindfs/kernel_interface.cpp | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/add-ons/kernel/file_systems/bindfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/bindfs/kernel_interface.cpp index d793aae639..b96d7c4d8b 100644 --- a/src/add-ons/kernel/file_systems/bindfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/bindfs/kernel_interface.cpp @@ -40,19 +40,24 @@ // #pragma mark - helper macros +#define FETCH_SOURCE_NODE(PREFIX, SOURCE_VOLUME, NODE_ID) \ + vnode* PREFIX##Vnode; \ + error = vfs_get_vnode(SOURCE_VOLUME->id, \ + NODE_ID, true, &PREFIX##Vnode); \ + if (error != B_OK) \ + RETURN_ERROR(error); \ + VnodePutter PREFIX##VnodePutterutter(PREFIX##Vnode); \ + fs_vnode* PREFIX##Node = vfs_fsnode_for_vnode(PREFIX##Vnode); \ + if (PREFIX##Node == NULL) \ + RETURN_ERROR(B_ERROR); + + #define FETCH_SOURCE_VOLUME_AND_NODE(volume, nodeID) \ fs_volume* sourceVolume = volume->SourceFSVolume(); \ if (sourceVolume == NULL) \ RETURN_ERROR(B_ERROR); \ - vnode* sourceVnode; \ - status_t error = vfs_get_vnode(volume->SourceFSVolume()->id, \ - nodeID, true, &sourceVnode); \ - if (error != B_OK) \ - RETURN_ERROR(error); \ - VnodePutter putter(sourceVnode); \ - fs_vnode* sourceNode = vfs_fsnode_for_vnode(sourceVnode); \ - if (sourceNode == NULL) \ - RETURN_ERROR(B_ERROR); + status_t error; \ + FETCH_SOURCE_NODE(source, sourceVolume, nodeID); // #pragma mark - Volume @@ -507,20 +512,22 @@ bindfs_unlink(fs_volume* fsVolume, fs_vnode* fsNode, const char* name) static status_t -bindfs_rename(fs_volume* fsVolume, fs_vnode* fsNode, const char* fromName, +bindfs_rename(fs_volume* fsVolume, fs_vnode* fromDir, const char* fromName, fs_vnode* toDir, const char* toName) { Volume* volume = (Volume*)fsVolume->private_volume; - Node* node = (Node*)fsNode->private_node; + Node* fromNode = (Node*)fromDir->private_node; + Node* toNode = (Node*)toDir->private_node; - FUNCTION("volume: %p, node: %p (%" B_PRIdINO "), " + FUNCTION("volume: %p, fromDir: %p (%" B_PRIdINO "), " "from: %s, toDir: %p, to: %s\n", - volume, node, node->ID(), fromName, toDir, toName); + volume, fromDir, fromNode->ID(), fromName, toDir, toName); - FETCH_SOURCE_VOLUME_AND_NODE(volume, node->ID()); + FETCH_SOURCE_VOLUME_AND_NODE(volume, fromNode->ID()); + FETCH_SOURCE_NODE(toSource, sourceVolume, toNode->ID()); - return sourceNode->ops->rename(sourceVolume, sourceNode, fromName, toDir, - toName); + return sourceNode->ops->rename(sourceVolume, sourceNode, fromName, + toSourceNode, toName); }