diff mbox series

[meta-oe,20/26] bmap-writer: cast BLKGETSIZE64 ioctl request to int for musl

Message ID 20260929225723.1046705-20-khem.raj@oss.qualcomm.com
State New
Headers show
Series [meta-oe,01/26] canvenient: include <sys/time.h> for struct timeval on musl | expand

Commit Message

Khem Raj Sept. 29, 2026, 10:57 p.m. UTC
musl's ioctl() takes 'int request' where glibc's takes 'unsigned
long', so passing BLKGETSIZE64 directly trips -Wsign-conversion under
-Werror. Cast it explicitly.

AI-Generated: Uses Claude Code
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
---
 .../bmap-writer/bmap-writer_1.0.5.bb          |  4 +-
 ...-library-s-ioctl-request-type-for-BL.patch | 50 +++++++++++++++++++
 2 files changed, 53 insertions(+), 1 deletion(-)
 create mode 100644 meta-oe/recipes-support/bmap-writer/files/0001-device-Use-the-C-library-s-ioctl-request-type-for-BL.patch
diff mbox series

Patch

diff --git a/meta-oe/recipes-support/bmap-writer/bmap-writer_1.0.5.bb b/meta-oe/recipes-support/bmap-writer/bmap-writer_1.0.5.bb
index 160d1b7112..71ea721eed 100644
--- a/meta-oe/recipes-support/bmap-writer/bmap-writer_1.0.5.bb
+++ b/meta-oe/recipes-support/bmap-writer/bmap-writer_1.0.5.bb
@@ -8,7 +8,9 @@  SECTION = "console/utils"
 LICENSE = "GPL-3.0-only"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=e49f4652534af377a713df3d9dec60cb"
 
-SRC_URI = "git://github.com/embetrix/${BPN};branch=master;protocol=https;tag=${PV}"
+SRC_URI = "git://github.com/embetrix/${BPN};branch=master;protocol=https;tag=${PV} \
+           file://0001-device-Use-the-C-library-s-ioctl-request-type-for-BL.patch \
+           "
 SRCREV = "c7b1bec0f40217d17e315226552e461a4a816abc"
 
 DEPENDS = "libtinyxml2 libarchive"
diff --git a/meta-oe/recipes-support/bmap-writer/files/0001-device-Use-the-C-library-s-ioctl-request-type-for-BL.patch b/meta-oe/recipes-support/bmap-writer/files/0001-device-Use-the-C-library-s-ioctl-request-type-for-BL.patch
new file mode 100644
index 0000000000..236ff7d1ef
--- /dev/null
+++ b/meta-oe/recipes-support/bmap-writer/files/0001-device-Use-the-C-library-s-ioctl-request-type-for-BL.patch
@@ -0,0 +1,50 @@ 
+From 7b96cb4998714bbb338adecafad8614484feb8cd Mon Sep 17 00:00:00 2001
+From: Khem Raj <khem.raj@oss.qualcomm.com>
+Date: Tue, 29 Sep 2026 12:56:53 -0700
+Subject: [PATCH] device: Use the C library's ioctl request type for
+ BLKGETSIZE64
+
+The type of ioctl()'s request argument differs between C libraries:
+glibc declares it as unsigned long, musl and bionic as int. BLKGETSIZE64
+is an unsigned long constant, so with -Wconversion -Wsign-conversion
+-Werror passing it directly fails on musl, while casting it to int fails
+on glibc:
+
+  device.cpp:163:50: error: unsigned conversion from 'int' to 'long unsigned int' changes value from '-2146954638' to '18446744071562596978' [-Werror=sign-conversion]
+
+Deduce the request type from the ioctl() declaration and convert the
+request code to it explicitly, which builds on both.
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
+---
+ src/device.cpp | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/src/device.cpp b/src/device.cpp
+index 2c06c84..d1fa995 100644
+--- a/src/device.cpp
++++ b/src/device.cpp
+@@ -151,6 +151,13 @@ int openTargetDevice(const std::string& device) {
+     return fd;
+ }
+ 
++// The type of ioctl()'s request argument depends on the C library: glibc
++// uses unsigned long, musl and bionic use int. Deduce it from the
++// declaration so request codes can be converted explicitly on all of them.
++template <typename Request>
++static Request ioctlRequestType(int (*)(int, Request, ...));
++using ioctl_request_t = decltype(ioctlRequestType(&::ioctl));
++
+ // Capacity of the target in bytes, or 0 when it cannot be determined (a
+ // regular file which simply grows as needed).
+ uint64_t getDeviceSize(int fd) {
+@@ -160,7 +167,7 @@ uint64_t getDeviceSize(int fd) {
+     if (::fstat(fd, &statbuf) != 0) {
+         return 0;
+     }
+-    if (S_ISBLK(statbuf.st_mode) && (::ioctl(fd, BLKGETSIZE64, &size) != 0)) {
++    if (S_ISBLK(statbuf.st_mode) && (::ioctl(fd, static_cast<ioctl_request_t>(BLKGETSIZE64), &size) != 0)) {
+         return 0;
+     }
+