Always check lockf64 return value

On x86-64, when GCC 14.2.1 is used to build:

commit f3c82fc1b4
Author: Radko Krkos <krkos@mail.muni.cz>
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 <fweimer@redhat.com>

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 <hjl.tools@gmail.com>
Reviewed-by: Florian Weimer <fweimer@redhat.com>
This commit is contained in:
H.J. Lu 2025-06-15 11:01:30 +08:00
parent 81467d4b61
commit 5b7c8d1cd4
1 changed files with 12 additions and 6 deletions

View File

@ -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;