diff --git a/headers/os/drivers/fs_interface.h b/headers/os/drivers/fs_interface.h index 9f754c6fd1..2f8837a470 100644 --- a/headers/os/drivers/fs_interface.h +++ b/headers/os/drivers/fs_interface.h @@ -113,7 +113,7 @@ typedef struct file_system_module_info { uint8 event, selectsync *sync); status_t (*fsync)(fs_volume fs, fs_vnode vnode); - status_t (*read_link)(fs_volume fs, fs_vnode link, char *buffer, + status_t (*read_symlink)(fs_volume fs, fs_vnode link, char *buffer, size_t *_bufferSize); status_t (*create_symlink)(fs_volume fs, fs_vnode dir, const char *name, const char *path, int mode); diff --git a/src/system/kernel/fs/vfs.cpp b/src/system/kernel/fs/vfs.cpp index 77307072f6..994d4ddd1a 100644 --- a/src/system/kernel/fs/vfs.cpp +++ b/src/system/kernel/fs/vfs.cpp @@ -1642,8 +1642,13 @@ vnode_path_to_vnode(struct vnode *vnode, char *path, bool traverseLeafLink, goto resolve_link_error; } - status = FS_CALL(nextVnode, read_link)(nextVnode->mount->cookie, - nextVnode->private_node, buffer, &bufferSize); + if (FS_CALL(nextVnode, read_symlink) != NULL) { + status = FS_CALL(nextVnode, read_symlink)( + nextVnode->mount->cookie, nextVnode->private_node, buffer, + &bufferSize); + } else + status = B_BAD_VALUE; + if (status < B_OK) { free(buffer); @@ -4344,8 +4349,8 @@ common_read_link(int fd, char *path, char *buffer, size_t *_bufferSize, if (status < B_OK) return status; - if (FS_CALL(vnode, read_link) != NULL) { - status = FS_CALL(vnode, read_link)(vnode->mount->cookie, + if (FS_CALL(vnode, read_symlink) != NULL) { + status = FS_CALL(vnode, read_symlink)(vnode->mount->cookie, vnode->private_node, buffer, _bufferSize); } else status = B_BAD_VALUE;