130 lines
4.1 KiB
Diff
130 lines
4.1 KiB
Diff
From cb8289c2b237e5f66e4a7608ecc6c68abeaeaf55 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
|
Date: Wed, 1 Nov 2023 17:56:36 +0100
|
|
Subject: [PATCH] libselinux: introduce reallocarray(3)
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Introduce reallocarray(3), a realloc(3) wrapper incorporating a
|
|
multiplication overflow check.
|
|
|
|
Add private implementation in case the function is not provided by the
|
|
standard C library.
|
|
|
|
Use in appropriate locations.
|
|
|
|
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
|
Acked-by: James Carter <jwcart2@gmail.com>
|
|
---
|
|
libselinux/src/Makefile | 6 ++++++
|
|
libselinux/src/get_context_list.c | 2 +-
|
|
libselinux/src/matchpathcon.c | 4 ++--
|
|
libselinux/src/selinux_internal.c | 14 ++++++++++++++
|
|
libselinux/src/selinux_internal.h | 4 ++++
|
|
libselinux/src/selinux_restorecon.c | 3 +--
|
|
6 files changed, 28 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/src/Makefile b/src/Makefile
|
|
index cf830046..7aadb822 100644
|
|
--- a/src/Makefile
|
|
+++ b/src/Makefile
|
|
@@ -108,6 +108,12 @@ ifeq (yes,$(shell printf '${H}include <string.h>\nint main(void){char*d,*s;strlc
|
|
override CFLAGS += -DHAVE_STRLCPY
|
|
endif
|
|
|
|
+# check for reallocarray(3) availability
|
|
+H := \#
|
|
+ifeq (yes,$(shell printf '${H}include <stdlib.h>\nint main(void){reallocarray(NULL, 0, 0);return 0;}' | $(CC) -x c -o /dev/null - >/dev/null 2>&1 && echo yes))
|
|
+override CFLAGS += -DHAVE_REALLOCARRAY
|
|
+endif
|
|
+
|
|
SWIG_CFLAGS += -Wno-error -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-parameter \
|
|
-Wno-shadow -Wno-uninitialized -Wno-missing-prototypes -Wno-missing-declarations \
|
|
-Wno-deprecated-declarations
|
|
diff --git a/src/get_context_list.c b/src/get_context_list.c
|
|
index 0342823c..9dafa519 100644
|
|
--- a/src/get_context_list.c
|
|
+++ b/src/get_context_list.c
|
|
@@ -272,7 +272,7 @@ static int get_context_user(FILE * fp,
|
|
continue;
|
|
}
|
|
if (security_check_context(usercon_str) == 0) {
|
|
- new_reachable = realloc(*reachable, (*nreachable + 2) * sizeof(char *));
|
|
+ new_reachable = reallocarray(*reachable, *nreachable + 2, sizeof(char *));
|
|
if (!new_reachable) {
|
|
context_free(usercon);
|
|
rc = -1;
|
|
diff --git a/src/matchpathcon.c b/src/matchpathcon.c
|
|
index b98849d9..e44734c3 100644
|
|
--- a/src/matchpathcon.c
|
|
+++ b/src/matchpathcon.c
|
|
@@ -96,8 +96,8 @@ static int add_array_elt(char *con)
|
|
if (con_array_size) {
|
|
while (con_array_used >= con_array_size) {
|
|
con_array_size *= 2;
|
|
- tmp = (char **)realloc(con_array, sizeof(char*) *
|
|
- con_array_size);
|
|
+ tmp = (char **)reallocarray(con_array, con_array_size,
|
|
+ sizeof(char*));
|
|
if (!tmp) {
|
|
free_array_elts();
|
|
return -1;
|
|
diff --git a/src/selinux_internal.c b/src/selinux_internal.c
|
|
index c2be7c0a..06852359 100644
|
|
--- a/src/selinux_internal.c
|
|
+++ b/src/selinux_internal.c
|
|
@@ -1,5 +1,7 @@
|
|
#include "selinux_internal.h"
|
|
|
|
+#include <errno.h>
|
|
+#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
|
|
@@ -16,3 +18,15 @@ size_t strlcpy(char *dest, const char *src, size_t size)
|
|
return ret;
|
|
}
|
|
#endif /* HAVE_STRLCPY */
|
|
+
|
|
+#ifndef HAVE_REALLOCARRAY
|
|
+void *reallocarray(void *ptr, size_t nmemb, size_t size)
|
|
+{
|
|
+ if (size && nmemb > SIZE_MAX / size) {
|
|
+ errno = ENOMEM;
|
|
+ return NULL;
|
|
+ }
|
|
+
|
|
+ return realloc(ptr, nmemb * size);
|
|
+}
|
|
+#endif /* HAVE_REALLOCARRAY */
|
|
diff --git a/src/selinux_internal.h b/src/selinux_internal.h
|
|
index 06f2c038..af69ff04 100644
|
|
--- a/src/selinux_internal.h
|
|
+++ b/src/selinux_internal.h
|
|
@@ -79,3 +79,7 @@ extern int has_selinux_config ;
|
|
size_t strlcpy(char *dest, const char *src, size_t size);
|
|
#endif
|
|
|
|
+#ifndef HAVE_REALLOCARRAY
|
|
+void *reallocarray(void *ptr, size_t nmemb, size_t size);
|
|
+#endif
|
|
+
|
|
diff --git a/src/selinux_restorecon.c b/src/selinux_restorecon.c
|
|
index 7ef2d45d..38f10f1c 100644
|
|
--- a/src/selinux_restorecon.c
|
|
+++ b/src/selinux_restorecon.c
|
|
@@ -175,8 +175,7 @@ static int add_exclude(const char *directory, bool who)
|
|
return -1;
|
|
}
|
|
|
|
- tmp_list = realloc(exclude_lst,
|
|
- sizeof(struct edir) * (exclude_count + 1));
|
|
+ tmp_list = reallocarray(exclude_lst, exclude_count + 1, sizeof(struct edir));
|
|
if (!tmp_list)
|
|
goto oom;
|
|
|
|
--
|
|
2.27.0
|
|
|