From: H.J. Lu Date: Sun, 15 Jun 2025 03:01:30 +0000 (+0800) Subject: Always check lockf64 return value X-Git-Tag: glibc-2.42~140 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5b7c8d1cd44048d6fbf10ad80e0d94dd90848a0d;p=thirdparty%2Fglibc.git Always check lockf64 return value On x86-64, when GCC 14.2.1 is used to build: commit f3c82fc1b41261f582f5f9fa12f74af9bcbc88f9 Author: Radko Krkos Date: Sat Jun 14 11:07:40 2025 +0200 io: Mark lockf() __wur [BZ #32800] In commit 0476597b28 flock() was marked __wur in posix/unistd.h, but not in io/fcntl.h, the declarations must match. Reviewed-by: Florian Weimer I got programs/locarchive.c: In function ‘open_archive’: programs/locarchive.c:641:18: error: ignoring return value of ‘lockf64’ declared with attribute ‘warn_unused_result’ [-Werror=unused-result] 641 | (void) lockf64 (fd, F_ULOCK, sizeof (struct locarhead)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ programs/locarchive.c:653:14: error: ignoring return value of ‘lockf64’ declared with attribute ‘warn_unused_result’ [-Werror=unused-result] 653 | (void) lockf64 (fd, F_ULOCK, sizeof (struct locarhead)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ programs/locarchive.c:660:14: error: ignoring return value of ‘lockf64’ declared with attribute ‘warn_unused_result’ [-Werror=unused-result] 660 | (void) lockf64 (fd, F_ULOCK, sizeof (struct locarhead)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ programs/locarchive.c:679:14: error: ignoring return value of ‘lockf64’ declared with attribute ‘warn_unused_result’ [-Werror=unused-result] 679 | (void) lockf64 (fd, F_ULOCK, sizeof (struct locarhead)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Update locarchive.c to always check lockf64 return value. This fixes BZ #33089. Signed-off-by: H.J. Lu Reviewed-by: Florian Weimer --- diff --git a/locale/programs/locarchive.c b/locale/programs/locarchive.c index 2c19f4fd29..ad025a819b 100644 --- a/locale/programs/locarchive.c +++ b/locale/programs/locarchive.c @@ -638,7 +638,8 @@ open_archive (struct locarhandle *ah, bool readonly) || st.st_dev != st2.st_dev || st.st_ino != st2.st_ino) { - (void) lockf64 (fd, F_ULOCK, sizeof (struct locarhead)); + if (lockf64 (fd, F_ULOCK, sizeof (struct locarhead)) != 0) + error (EXIT_FAILURE, errno, _("cannot unlock archive header")); close (fd); continue; } @@ -650,14 +651,17 @@ open_archive (struct locarhandle *ah, bool readonly) /* Read the header. */ if (TEMP_FAILURE_RETRY (read (fd, &head, sizeof (head))) != sizeof (head)) { - (void) lockf64 (fd, F_ULOCK, sizeof (struct locarhead)); - error (EXIT_FAILURE, errno, _("cannot read archive header")); + int errval = errno; + if (lockf64 (fd, F_ULOCK, sizeof (struct locarhead)) != 0) + error (EXIT_FAILURE, errno, _("cannot unlock archive header")); + error (EXIT_FAILURE, errval, _("cannot read archive header")); } /* Check the magic value */ if (GET (head.magic) != AR_MAGIC) { - (void) lockf64 (fd, F_ULOCK, sizeof (struct locarhead)); + if (lockf64 (fd, F_ULOCK, sizeof (struct locarhead)) != 0) + error (EXIT_FAILURE, errno, _("cannot unlock archive header")); error (EXIT_FAILURE, 0, _("bad magic value in archive header")); } @@ -676,8 +680,10 @@ open_archive (struct locarhandle *ah, bool readonly) MAP_SHARED | xflags, fd, 0); if (ah->addr == MAP_FAILED) { - (void) lockf64 (fd, F_ULOCK, sizeof (struct locarhead)); - error (EXIT_FAILURE, errno, _("cannot map archive header")); + int errval = errno; + if (lockf64 (fd, F_ULOCK, sizeof (struct locarhead)) != 0) + error (EXIT_FAILURE, errno, _("cannot unlock archive header")); + error (EXIT_FAILURE, errval, _("cannot map archive header")); } ah->reserved = reserved; ah->mmap_base = mmap_base;