Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.5:Update
slurm.32296
U_05-Rework-to-avoid-problematic-chown.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File U_05-Rework-to-avoid-problematic-chown.patch of Package slurm.32296
From: Tim Wickberg <tim@schedmd.com> Date: Wed Oct 11 12:45:25 2023 -0600 Subject: [PATCH 5/19]Rework to avoid problematic chown(). Patch-mainline: Upstream Git-repo: https://github.com/SchedMD/slurm Git-commit: bd615ecc073ba8f299032cadc09834de5e2616f7 References: bsc#1216207 Signed-off-by: Egbert Eich <eich@suse.de> Co-authored-by: Alejandro Sanchez <alex@schedmd.com> --- src/plugins/mpi/pmix/pmixp_utils.c | 41 +++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/src/plugins/mpi/pmix/pmixp_utils.c b/src/plugins/mpi/pmix/pmixp_utils.c index 556633c408..882a2aadd9 100644 --- a/src/plugins/mpi/pmix/pmixp_utils.c +++ b/src/plugins/mpi/pmix/pmixp_utils.c @@ -541,6 +541,8 @@ int pmixp_rmdir_recursively(char *path) int pmixp_mkdir(char *path) { + char *base = NULL, *newdir = NULL, *slash; + int dirfd; mode_t rights = (S_IRUSR | S_IWUSR | S_IXUSR); /* NOTE: we need user who owns the job to access PMIx usock @@ -555,15 +557,48 @@ int pmixp_mkdir(char *path) * 3. Set 0700 access mode */ - if (0 != mkdir(path, rights) ) { + base = xstrdup(path); + /* split into base and new directory name */ + while ((slash = strrchr(base, '/'))) { + /* fix a path with one or more trailing slashes */ + if (slash[1] == '\0') + slash[0] = '\0'; + else + break; + } + + if (!slash) { + PMIXP_ERROR_STD("Invalid directory \"%s\"", path); + xfree(base); + return EINVAL; + } + + slash[0] = '\0'; + newdir = slash + 1; + + if ((dirfd = open(base, O_DIRECTORY | O_NOFOLLOW)) < 0) { + PMIXP_ERROR_STD("Could not open parent directory \"%s\"", base); + xfree(base); + return errno; + } + + if (mkdirat(dirfd, newdir, rights) < 0) { PMIXP_ERROR_STD("Cannot create directory \"%s\"", path); + close(dirfd); + xfree(base); return errno; } - if (chown(path, (uid_t) pmixp_info_jobuid(), (gid_t) -1) < 0) { - error("%s: chown(%s): %m", __func__, path); + if (fchownat(dirfd, newdir, (uid_t) pmixp_info_jobuid(), (gid_t) -1, + AT_SYMLINK_NOFOLLOW) < 0) { + error("%s: fchownath(%s): %m", __func__, path); + close(dirfd); + xfree(base); return errno; } + + close(dirfd); + xfree(base); return 0; }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor