Bug 2141989

Summary: glibc: Restore IPC_64 support in sysvipc *ctl functions [rhel-8.8.0]
Product: Red Hat Enterprise Linux 8 Reporter: Florian Weimer <fweimer>
Component: glibcAssignee: Florian Weimer <fweimer>
Status: CLOSED ERRATA QA Contact: Martin Coufal <mcoufal>
Severity: unspecified Docs Contact:
Priority: unspecified    
Version: 8.8CC: ashankar, bfinger, codonell, csay, dj, fweimer, mcoufal, mnewsome, mpolacek, pfrankli, qe-baseos-tools-bugs, sipoyare, skolosov
Target Milestone: rcKeywords: Bugfix, Patch, Triaged
Target Release: ---   
Hardware: ppc64le   
OS: Unspecified   
Whiteboard:
Fixed In Version: glibc-2.28-222.el8 Doc Type: No Doc Update
Doc Text:
Story Points: ---
Clone Of: 2141685 Environment:
Last Closed: 2023-05-16 09:03:05 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On: 2141685    
Bug Blocks:    

Description Florian Weimer 2022-11-11 11:01:13 UTC
+++ This bug was initially created as a clone of Bug #2141685 +++

In order to call SHM_STAT_ANY kernel operations through shmctl on older glibc, it was necessary to pass SHM_STAT_ANY | IPC_64 in the command argument, otherwise the ipc system call would be invoked without the IPC_64 flag, giving unexpected results on powerpc64le-linux-gnu at least.

Current glibc no longer supports that because it checks the command argument for validity without masking the IPC_64 bit.

The backport for bug 1912670 contains a list of accepted shmctl commands, and that does not include SHM_STAT_ANY | IPC_64 either, so the issue is present in current RHEL 8.8 glibc as well.

Comment 2 Florian Weimer 2022-11-11 17:16:45 UTC
The RHEL 8.8 backport is buggy.  The EINVAL check failure is never reported to the caller:

int
__new_shmctl (int shmid, int cmd, struct shmid_ds *buf)
{
  switch (cmd)
    {
    case IPC_RMID:
    case SHM_LOCK:
    case SHM_UNLOCK:
    case IPC_SET:
    case IPC_STAT:
    case SHM_STAT:
    case SHM_STAT_ANY:
    case IPC_INFO:
    case SHM_INFO:
      break;
    default:
      __set_errno (EINVAL);
      break;
    }
#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
  return INLINE_SYSCALL_CALL (shmctl, shmid, cmd | __IPC_64, buf);
#else
  return INLINE_SYSCALL_CALL (ipc, IPCOP_shmctl, shmid, cmd | __IPC_64, 0,
			      buf);
#endif
}

There's no “return -1;”, so the check failure is hidden from the caller. We should still clean this up and remove the switch statement (to match upstream).

Comment 10 errata-xmlrpc 2023-05-16 09:03:05 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory (glibc bug fix and enhancement update), and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://access.redhat.com/errata/RHBA-2023:2955