glibc/include/shm-directory.h

43 lines
1.4 KiB
C
Raw Normal View History

/* Header for directory for shm/sem files.
Copyright (C) 2014-2025 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
Prefer https to http for gnu.org and fsf.org URLs Also, change sources.redhat.com to sourceware.org. This patch was automatically generated by running the following shell script, which uses GNU sed, and which avoids modifying files imported from upstream: sed -ri ' s,(http|ftp)(://(.*\.)?(gnu|fsf|sourceware)\.org($|[^.]|\.[^a-z])),https\2,g s,(http|ftp)(://(.*\.)?)sources\.redhat\.com($|[^.]|\.[^a-z]),https\2sourceware.org\4,g ' \ $(find $(git ls-files) -prune -type f \ ! -name '*.po' \ ! -name 'ChangeLog*' \ ! -path COPYING ! -path COPYING.LIB \ ! -path manual/fdl-1.3.texi ! -path manual/lgpl-2.1.texi \ ! -path manual/texinfo.tex ! -path scripts/config.guess \ ! -path scripts/config.sub ! -path scripts/install-sh \ ! -path scripts/mkinstalldirs ! -path scripts/move-if-change \ ! -path INSTALL ! -path locale/programs/charmap-kw.h \ ! -path po/libc.pot ! -path sysdeps/gnu/errlist.c \ ! '(' -name configure \ -execdir test -f configure.ac -o -f configure.in ';' ')' \ ! '(' -name preconfigure \ -execdir test -f preconfigure.ac ';' ')' \ -print) and then by running 'make dist-prepare' to regenerate files built from the altered files, and then executing the following to cleanup: chmod a+x sysdeps/unix/sysv/linux/riscv/configure # Omit irrelevant whitespace and comment-only changes, # perhaps from a slightly-different Autoconf version. git checkout -f \ sysdeps/csky/configure \ sysdeps/hppa/configure \ sysdeps/riscv/configure \ sysdeps/unix/sysv/linux/csky/configure # Omit changes that caused a pre-commit check to fail like this: # remote: *** error: sysdeps/powerpc/powerpc64/ppc-mcount.S: trailing lines git checkout -f \ sysdeps/powerpc/powerpc64/ppc-mcount.S \ sysdeps/unix/sysv/linux/s390/s390-64/syscall.S # Omit change that caused a pre-commit check to fail like this: # remote: *** error: sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: last line does not end in newline git checkout -f sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
2019-09-07 05:40:42 +00:00
<https://www.gnu.org/licenses/>. */
#ifndef _SHM_DIRECTORY_H
#include <limits.h>
#include <paths.h>
#include <stdbool.h>
/* The directory that contains shared POSIX objects. */
#define SHMDIR _PATH_DEV "shm/"
struct shmdir_name
{
/* The combined prefix/name. The sizeof includes the terminating
shm-directory: Truncated struct member name length The struct shmdir_name in include/shm-directory.h has name field to contains the full path of the POSIX IPC object (shm and sem). The size was previously set to sizeof (SHMDIR) + 4 + NAME_MAX, where 4 bytes were reserved for the optional "sem." prefix. This led to incorrect execution of the __shm_get_name function in posix/shm-directory.c which is used accross in shm_[open/unlink] and sem_[open/unlink] functions. For shm_[open/unlink]: This is because the name field was large enough to hold 268 characters (255 + 4 + 9) instead of the maximum allowed 263 characters (255 + 9). This caused the __shm_get_name to not throw ENAMETOOLONG error when the name length exceeded NAME_MAX (255) upto 259 characters. For sem_[open/unlink]: Similarly, the __shm_get_name incorrectly returned success for names of length 255 instead of 251 (255 - 4). This was overlooked as finally these functions throw the correct ENAMETOOLONG error; which was thrown by the openat syscall, which is called later in the shm_* and sem_* functions. This patch corrects the size of name field in struct shmdir_name to sizeof (SHMDIR) + NAME_MAX. The __shm_get_name function return ENAMETOOLONG if alloc_buffer_has_failed returns true (which only happens when copy length > alloc_buffer_size (buffer)). Relevant runtime monitoring were done in gdb to confirm the same. Signed-off-by: Prasanna Paithankar <paithankarprasanna@gmail.com> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2025-09-04 23:24:34 +00:00
NUL byte. */
char name[sizeof (SHMDIR) + NAME_MAX];
};
/* Sets RESULT->name to the constructed name and returns 0 on success,
or -1 on failure. Includes the "sem." prefix in the name if
SEM_PREFIX is true. */
int __shm_get_name (struct shmdir_name *result, const char *name,
bool sem_prefix);
libc_hidden_proto (__shm_get_name)
#endif /* shm-directory.h */