From 3839690ba35eb80fe577935163cf5460148db24c Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Wed, 17 Apr 2024 23:07:41 -0400 Subject: [PATCH] lib: fix btrfs_data_container pointer casts for 32-bit userspace on 64-bit kernels Apparently reinterpret_cast sign-extends 32-bit pointers. This is OK when running on a 32-bit kernel that will truncate the pointer to 32 bits, but when running on a 64-bit kernel, the extra bits are interpreted as part of the (now very invalid) address. Use instead, which is unsigned, integer, and the same word size as the arch's pointer type. Ordinary numeric conversion can take it from there, filling the rest of the word with zeros. Signed-off-by: Zygo Blaxell --- lib/fs.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/fs.cc b/lib/fs.cc index 4327c28..86bfba5 100644 --- a/lib/fs.cc +++ b/lib/fs.cc @@ -333,7 +333,7 @@ namespace crucible { btrfs_ioctl_logical_ino_args args = (btrfs_ioctl_logical_ino_args) { .logical = m_logical, .size = m_container_size, - .inodes = reinterpret_cast(m_container.prepare(m_container_size)), + .inodes = reinterpret_cast(m_container.prepare(m_container_size)), }; // We are still supporting building with old headers that don't have .flags yet *(&args.reserved[0] + 3) = m_flags; @@ -416,7 +416,7 @@ namespace crucible { { btrfs_ioctl_ino_path_args *p = static_cast(this); BtrfsDataContainer container(m_container_size); - fspath = reinterpret_cast(container.prepare(m_container_size)); + fspath = reinterpret_cast(container.prepare(m_container_size)); size = container.get_size(); m_paths.clear();