summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2019-07-16 14:52:07 +0200
committerLennart Poettering <lennart@poettering.net>2019-07-16 14:56:25 +0200
commit49aca3b1525ff2273b4d61d52a9bb1347b48bd5f (patch)
tree6a1cc7773d65b0ec1398fbf2f0a9f33232e67362
parent476da0fe00b863123461396d6acb403c92a806a5 (diff)
downloadsystemd-49aca3b1525ff2273b4d61d52a9bb1347b48bd5f.tar.gz
activate: move array allocation to heap
In theory 'n' could get quite large, and some sanitizers notice that, let's hence avoid the stack, and use the heap instead. Moreover, there's no need to include the first 3 fds in the array, close_all() excludes those anyway. See: #13064
-rw-r--r--src/activate/activate.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/activate/activate.c b/src/activate/activate.c
index 15a3150666..2fe312f5a0 100644
--- a/src/activate/activate.c
+++ b/src/activate/activate.c
@@ -49,8 +49,7 @@ static int add_epoll(int epoll_fd, int fd) {
static int open_sockets(int *epoll_fd, bool accept) {
char **address;
- int n, fd, r;
- int count = 0;
+ int n, fd, r, count = 0;
n = sd_listen_fds(true);
if (n < 0)
@@ -69,13 +68,18 @@ static int open_sockets(int *epoll_fd, bool accept) {
/* Close logging and all other descriptors */
if (arg_listen) {
- int except[3 + n];
+ _cleanup_free_ int *except = NULL;
+ int i;
- for (fd = 0; fd < SD_LISTEN_FDS_START + n; fd++)
- except[fd] = fd;
+ except = new(int, n);
+ if (!except)
+ return log_oom();
+
+ for (i = 0; i < n; i++)
+ except[i] = SD_LISTEN_FDS_START + i;
log_close();
- r = close_all_fds(except, 3 + n);
+ r = close_all_fds(except, n);
if (r < 0)
return log_error_errno(r, "Failed to close all file descriptors: %m");
}