Skip to content

Commit

Permalink
libselinux: avoid dynamic allocation in openattr()
Browse files Browse the repository at this point in the history
openattr() supplies the simplementation for the getcon(3) interface
family.  Use a short local buffer instead of descend into memory
allocation.

Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
Acked-by: James Carter <jwcart2@gmail.com>
  • Loading branch information
cgzones authored and jwcart2 committed Dec 4, 2024
1 parent 39174cf commit 8efed46
Showing 1 changed file with 16 additions and 12 deletions.
28 changes: 16 additions & 12 deletions libselinux/src/procattr.c
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
#include <assert.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <errno.h>
#include "selinux_internal.h"
Expand Down Expand Up @@ -86,32 +88,34 @@ static void init_procattr(void)
static int openattr(pid_t pid, const char *attr, int flags)
{
int fd, rc;
char *path;
char path[44]; /* must hold "/proc/self/task/%d/attr/sockcreate" */
pid_t tid;

static_assert(sizeof(pid_t) <= sizeof(uint32_t), "content written to path might get truncated");

if (pid > 0) {
rc = asprintf(&path, "/proc/%d/attr/%s", pid, attr);
rc = snprintf(path, sizeof(path), "/proc/%d/attr/%s", pid, attr);
} else if (pid == 0) {
rc = asprintf(&path, "/proc/thread-self/attr/%s", attr);
if (rc < 0)
rc = snprintf(path, sizeof(path), "/proc/thread-self/attr/%s", attr);
if (rc < 0 || (size_t)rc >= sizeof(path)) {
errno = EOVERFLOW;
return -1;
}
fd = open(path, flags | O_CLOEXEC);
if (fd >= 0 || errno != ENOENT)
goto out;
free(path);
return fd;
tid = selinux_gettid();
rc = asprintf(&path, "/proc/self/task/%d/attr/%s", tid, attr);
rc = snprintf(path, sizeof(path), "/proc/self/task/%d/attr/%s", tid, attr);
} else {
errno = EINVAL;
return -1;
}
if (rc < 0)
if (rc < 0 || (size_t)rc >= sizeof(path)) {
errno = EOVERFLOW;
return -1;
}

fd = open(path, flags | O_CLOEXEC);
out:
free(path);
return fd;
return open(path, flags | O_CLOEXEC);
}

static int getprocattrcon_raw(char **context, pid_t pid, const char *attr,
Expand Down

0 comments on commit 8efed46

Please sign in to comment.