quota: fix setproject binary
authorKonstantin Demin <[email protected]>
Mon, 7 Jul 2025 08:04:07 +0000 (11:04 +0300)
committerJosef Schlehofer <[email protected]>
Tue, 8 Jul 2025 06:42:22 +0000 (08:42 +0200)
This patch fixes both a wrong openat() call and a build failure when using glibc 2.41 in OpenWrt.

Backported upstream commit d9852bd5b76ca65f283929e803b87343942ecb1f

Signed-off-by: Konstantin Demin <[email protected]>
utils/quota/Makefile
utils/quota/patches/001-setproject-fix-openat-call.patch [new file with mode: 0644]

index 04ee314ad0ddedf723438d5cf00174c389953f3d..49bea64df2c886be49485b9511e080c0c3fc5763 100644 (file)
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=quota
 PKG_VERSION:=4.10
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=@SF/linuxquota
diff --git a/utils/quota/patches/001-setproject-fix-openat-call.patch b/utils/quota/patches/001-setproject-fix-openat-call.patch
new file mode 100644 (file)
index 0000000..cbb79d5
--- /dev/null
@@ -0,0 +1,32 @@
+From d9852bd5b76ca65f283929e803b87343942ecb1f Mon Sep 17 00:00:00 2001
+From: Konstantin Demin <[email protected]>
+Date: Tue, 1 Jul 2025 14:35:36 +0200
+Subject: setproject: fix openat() call
+
+It looks like that openat() call was copy-pasted from above fstatat() call.
+However, manpage for openat() doesn't mention AT_SYMLINK_NOFOLLOW.
+Furthermore, AT_SYMLINK_NOFOLLOW constant value (0x100) sometimes (!) clashes
+with O_CREAT constant value which is defined as 0100 (0x40) OR 0x100 (yes, two
+different values for the same constant appear in headers). This produces build
+errors when fortifying defines (-D_FORTIFY_SOURCE) are in effect (e.g. with
+glibc 2.41). In order to keep correct behavior, use O_NOFOLLOW instead of
+AT_SYMLINK_NOFOLLOW.
+
+Fixes: e61d46c65899ced9599c93a6128f19d8759fcad8
+Signed-off-by: Konstantin Demin <[email protected]>
+Signed-off-by: Jan Kara <[email protected]>
+---
+ setproject.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/setproject.c
++++ b/setproject.c
+@@ -73,7 +73,7 @@ static void setproject_recurse(int dirfd
+               if (!S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode))
+                       continue;
+-              int fd = openat(dirfd, d->d_name, AT_SYMLINK_NOFOLLOW);
++              int fd = openat(dirfd, d->d_name, O_NOFOLLOW);
+               if (fd < 0) {
+                       errstr(_("error opening %s: %m"), d->d_name);
+                       errno = 0;