[lxc-devel] [lxc/master] tree-wide: wipe alloca() from the codebase
brauner on Github
lxc-bot at linuxcontainers.org
Tue Feb 5 06:50:21 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190204/88016afe/attachment-0001.bin>
-------------- next part --------------
From 9254aa43388062b252ebcc2f212f5936c36d3b6f Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 06:51:55 +0100
Subject: [PATCH 01/23] memory_utils: add memory_utils.h
The header defines a simple wrapper for free() that can be used with
gcc's and clang's __attribute__((__cleanup__(<cleanup-fun>))) macro.
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/Makefile.am | 2 ++
src/lxc/memory_utils.h | 31 +++++++++++++++++++++++++++++++
2 files changed, 33 insertions(+)
create mode 100644 src/lxc/memory_utils.h
diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am
index 95b0a2f72..aa6368840 100644
--- a/src/lxc/Makefile.am
+++ b/src/lxc/Makefile.am
@@ -21,6 +21,7 @@ noinst_HEADERS = api_extensions.h \
lxc.h \
lxclock.h \
macro.h \
+ memory_utils.h \
monitor.h \
namespace.h \
raw_syscalls.h \
@@ -112,6 +113,7 @@ liblxc_la_SOURCES = af_unix.c af_unix.h \
lxclock.c lxclock.h \
lxcseccomp.h \
macro.h \
+ memory_utils.h \
mainloop.c mainloop.h \
namespace.c namespace.h \
nl.c nl.h \
diff --git a/src/lxc/memory_utils.h b/src/lxc/memory_utils.h
new file mode 100644
index 000000000..8669af5bf
--- /dev/null
+++ b/src/lxc/memory_utils.h
@@ -0,0 +1,31 @@
+/* liblxcapi
+ *
+ * Copyright © 2018 Christian Brauner <christian.brauner at ubuntu.com>.
+ * Copyright © 2018 Canonical Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef __LXC_MEMORY_UTILS_H
+#define __LXC_MEMORY_UTILS_H
+
+#include <stdlib.h>
+
+static inline void __auto_free__(void *p)
+{
+ if (p)
+ free(p);
+}
+
+#endif /* __LXC_MEMORY_UTILS_H */
From 1a69ff5a956732c36eafcb75bb6fc5991b5bdb60 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:00:58 +0100
Subject: [PATCH 02/23] lxcmntent: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/include/lxcmntent.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/src/include/lxcmntent.c b/src/include/lxcmntent.c
index 10c10c549..04eda0c83 100644
--- a/src/include/lxcmntent.c
+++ b/src/include/lxcmntent.c
@@ -21,7 +21,7 @@
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
#endif
-#include <alloca.h>
+#include <errno.h>
#include <mntent.h>
#include <stdio.h>
#include <stdlib.h>
@@ -154,20 +154,24 @@ struct mntent *getmntent(FILE *stream)
/* Prepare to begin reading and/or writing mount table entries from the
* beginning of FILE. MODE is as for `fopen'.
*/
+#define __SETMNTENT_MODE_MAX 256
FILE *setmntent(const char *file, const char *mode)
{
/* Extend the mode parameter with "c" to disable cancellation in the
* I/O functions and "e" to set FD_CLOEXEC.
*/
size_t modelen = strlen(mode);
- char *newmode;
+ char newmode[__SETMNTENT_MODE_MAX];
- newmode = alloca(modelen + 3);
+ if (modelen >= (__SETMNTENT_MODE_MAX - 2)) {
+ errno = -EFBIG;
+ return NULL;
+ }
memcpy(newmode, mode, modelen);
memcpy(newmode + modelen, "ce", 3);
- return fopen (file, newmode);
+ return fopen(file, newmode);
}
/* Close a stream opened with `setmntent'. */
From b606bcdc750a8cf0d53a3a8fd3d59570feae5ed6 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:01:33 +0100
Subject: [PATCH 03/23] cgroups: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/cgroups/cgfsng.c | 38 ++++++++++++++++----------------------
1 file changed, 16 insertions(+), 22 deletions(-)
diff --git a/src/lxc/cgroups/cgfsng.c b/src/lxc/cgroups/cgfsng.c
index d359b67fc..4b5fd6892 100644
--- a/src/lxc/cgroups/cgfsng.c
+++ b/src/lxc/cgroups/cgfsng.c
@@ -58,6 +58,7 @@
#include "config.h"
#include "log.h"
#include "macro.h"
+#include "memory_utils.h"
#include "storage/storage.h"
#include "utils.h"
@@ -888,15 +889,18 @@ static bool controller_in_clist(char *cgline, char *c)
return false;
len = eol - cgline;
- tmp = alloca(len + 1);
+ tmp = must_realloc(NULL, len + 1);
memcpy(tmp, cgline, len);
tmp[len] = '\0';
lxc_iterate_parts(tok, tmp, ",") {
- if (strcmp(tok, c) == 0)
+ if (strcmp(tok, c) == 0) {
+ free(tmp);
return true;
+ }
}
+ free(tmp);
return false;
}
@@ -2209,15 +2213,12 @@ __cgfsng_ops static int cgfsng_get(struct cgroup_ops *ops, const char *filename,
char *value, size_t len, const char *name,
const char *lxcpath)
{
- int ret = -1;
- size_t controller_len;
- char *controller, *p, *path;
+ __attribute__((__cleanup__(__auto_free__))) char *controller;
+ char *p, *path;
struct hierarchy *h;
+ int ret = -1;
- controller_len = strlen(filename);
- controller = alloca(controller_len + 1);
- (void)strlcpy(controller, filename, controller_len + 1);
-
+ controller = must_copy_string(filename);
p = strchr(controller, '.');
if (p)
*p = '\0';
@@ -2248,15 +2249,12 @@ __cgfsng_ops static int cgfsng_set(struct cgroup_ops *ops,
const char *filename, const char *value,
const char *name, const char *lxcpath)
{
- int ret = -1;
- size_t controller_len;
- char *controller, *p, *path;
+ __attribute__((__cleanup__(__auto_free__))) char *controller;
+ char *p, *path;
struct hierarchy *h;
+ int ret = -1;
- controller_len = strlen(filename);
- controller = alloca(controller_len + 1);
- (void)strlcpy(controller, filename, controller_len + 1);
-
+ controller = must_copy_string(filename);
p = strchr(controller, '.');
if (p)
*p = '\0';
@@ -2363,18 +2361,14 @@ static int convert_devpath(const char *invalue, char *dest)
static int cg_legacy_set_data(struct cgroup_ops *ops, const char *filename,
const char *value)
{
- size_t len;
+ __attribute__((__cleanup__(__auto_free__))) char *controller;
char *fullpath, *p;
/* "b|c <2^64-1>:<2^64-1> r|w|m" = 47 chars max */
char converted_value[50];
struct hierarchy *h;
int ret = 0;
- char *controller = NULL;
-
- len = strlen(filename);
- controller = alloca(len + 1);
- (void)strlcpy(controller, filename, len + 1);
+ controller = must_copy_string(filename);
p = strchr(controller, '.');
if (p)
*p = '\0';
From 3246aecd95c571b41fa78462348b5cf5d818fa4f Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:01:50 +0100
Subject: [PATCH 04/23] lxc_user_nic: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/Makefile.am | 2 ++
src/lxc/cmd/lxc_user_nic.c | 9 ++++-----
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am
index aa6368840..7d1522bf2 100644
--- a/src/lxc/Makefile.am
+++ b/src/lxc/Makefile.am
@@ -368,9 +368,11 @@ lxc_monitord_SOURCES = cmd/lxc_monitord.c \
lxc_user_nic_SOURCES = cmd/lxc_user_nic.c \
../include/netns_ifaddrs.c ../include/netns_ifaddrs.h \
log.c log.h \
+ memory_utils.h \
network.c network.h \
parse.c parse.h \
raw_syscalls.c raw_syscalls.h \
+ string_utils.c string_utils.h \
syscall_wrappers.h
lxc_usernsexec_SOURCES = cmd/lxc_usernsexec.c \
conf.c conf.h \
diff --git a/src/lxc/cmd/lxc_user_nic.c b/src/lxc/cmd/lxc_user_nic.c
index 12c3d83c7..d56e33f9b 100644
--- a/src/lxc/cmd/lxc_user_nic.c
+++ b/src/lxc/cmd/lxc_user_nic.c
@@ -49,9 +49,11 @@
#include "config.h"
#include "log.h"
+#include "memory_utils.h"
#include "network.h"
#include "parse.h"
#include "raw_syscalls.h"
+#include "string_utils.h"
#include "syscall_wrappers.h"
#include "utils.h"
@@ -838,13 +840,10 @@ static char *get_nic_if_avail(int fd, struct alloted_s *names, int pid,
static bool create_db_dir(char *fnam)
{
+ __attribute__((__cleanup__(__auto_free__))) char *p;
int ret;
- char *p;
- size_t len;
- len = strlen(fnam);
- p = alloca(len + 1);
- (void)strlcpy(p, fnam, len + 1);
+ must_copy_string(fnam);
fnam = p;
p = p + 1;
From 3c838071cb9c6a775ac7926c527744b996399f6f Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:02:07 +0100
Subject: [PATCH 05/23] commands: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/commands.c | 26 +++++---------------------
1 file changed, 5 insertions(+), 21 deletions(-)
diff --git a/src/lxc/commands.c b/src/lxc/commands.c
index 5f2e25b6d..d539eabe2 100644
--- a/src/lxc/commands.c
+++ b/src/lxc/commands.c
@@ -48,6 +48,7 @@
#include "lxc.h"
#include "lxclock.h"
#include "mainloop.h"
+#include "memory_utils.h"
#include "monitor.h"
#include "start.h"
#include "terminal.h"
@@ -524,8 +525,8 @@ char *lxc_cmd_get_config_item(const char *name, const char *item,
static int lxc_cmd_get_config_item_callback(int fd, struct lxc_cmd_req *req,
struct lxc_handler *handler)
{
+ __attribute__((__cleanup__(__auto_free__))) char *cidata = NULL;
int cilen;
- char *cidata;
struct lxc_config_t *item;
struct lxc_cmd_rsp rsp;
@@ -538,7 +539,7 @@ static int lxc_cmd_get_config_item_callback(int fd, struct lxc_cmd_req *req,
if (cilen <= 0)
goto err1;
- cidata = alloca(cilen + 1);
+ cidata = must_realloc(NULL, cilen + 1);
if (item->get(req->data, cidata, cilen + 1, handler->conf, NULL) != cilen)
goto err1;
@@ -1103,9 +1104,9 @@ static void lxc_cmd_fd_cleanup(int fd, struct lxc_handler *handler,
static int lxc_cmd_handler(int fd, uint32_t events, void *data,
struct lxc_epoll_descr *descr)
{
+ __attribute__((__cleanup__(__auto_free__))) void *reqdata = NULL;
int ret;
struct lxc_cmd_req req;
- void *reqdata = NULL;
struct lxc_handler *handler = data;
ret = lxc_abstract_unix_rcv_credential(fd, &req, sizeof(req));
@@ -1143,21 +1144,7 @@ static int lxc_cmd_handler(int fd, uint32_t events, void *data,
}
if (req.datalen > 0) {
- /* LXC_CMD_CONSOLE_LOG needs to be able to allocate data
- * that exceeds LXC_CMD_DATA_MAX: use malloc() for that.
- */
- if (req.cmd == LXC_CMD_CONSOLE_LOG)
- reqdata = malloc(req.datalen);
- else
- reqdata = alloca(req.datalen);
- if (!reqdata) {
- ERROR("Failed to allocate memory for \"%s\" command",
- lxc_cmd_str(req.cmd));
- errno = ENOMEM;
- ret = -ENOMEM;
- goto out_close;
- }
-
+ reqdata = must_realloc(NULL, req.datalen);
ret = lxc_recv_nointr(fd, reqdata, req.datalen, 0);
if (ret != req.datalen) {
WARN("Failed to receive full command request. Ignoring "
@@ -1177,9 +1164,6 @@ static int lxc_cmd_handler(int fd, uint32_t events, void *data,
}
out:
- if (req.cmd == LXC_CMD_CONSOLE_LOG && reqdata)
- free(reqdata);
-
return ret;
out_close:
From 4c141eaf81164baf42043c4a38d58a23d7bca7bd Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:06:02 +0100
Subject: [PATCH 06/23] commands_utils: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/commands_utils.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/lxc/commands_utils.c b/src/lxc/commands_utils.c
index f48f1188c..61c911568 100644
--- a/src/lxc/commands_utils.c
+++ b/src/lxc/commands_utils.c
@@ -38,6 +38,7 @@
#include "initutils.h"
#include "log.h"
#include "lxclock.h"
+#include "memory_utils.h"
#include "monitor.h"
#include "state.h"
#include "utils.h"
@@ -102,9 +103,9 @@ int lxc_make_abstract_socket_name(char *path, size_t pathlen,
const char *hashed_sock_name,
const char *suffix)
{
+ __attribute__((__cleanup__(__auto_free__))) char *tmppath = NULL;
const char *name;
char *offset;
- char *tmppath;
size_t len;
size_t tmplen;
uint64_t hash;
@@ -153,7 +154,7 @@ int lxc_make_abstract_socket_name(char *path, size_t pathlen,
/* ret >= len; lxcpath or name is too long. hash both */
tmplen = strlen(name) + strlen(lxcpath) + 2;
- tmppath = alloca(tmplen);
+ tmppath = must_realloc(NULL, tmplen);
ret = snprintf(tmppath, tmplen, "%s/%s", lxcpath, name);
if (ret < 0 || (size_t)ret >= tmplen) {
ERROR("Failed to create abstract socket name");
From ccabd0a6148b0c84c21692acf531a1d5eb8921fb Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:08:44 +0100
Subject: [PATCH 07/23] conf: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/conf.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index be2852f27..b86cd6b9f 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -67,6 +67,7 @@
#include "lxclock.h"
#include "lxcseccomp.h"
#include "macro.h"
+#include "memory_utils.h"
#include "namespace.h"
#include "network.h"
#include "parse.h"
@@ -486,8 +487,9 @@ int run_script_argv(const char *name, unsigned int hook_version,
int run_script(const char *name, const char *section, const char *script, ...)
{
+ __attribute__((__cleanup__(__auto_free__))) char *buffer = NULL;
int ret;
- char *buffer, *p;
+ char *p;
va_list ap;
size_t size = 0;
@@ -508,7 +510,7 @@ int run_script(const char *name, const char *section, const char *script, ...)
if (size > INT_MAX)
return -1;
- buffer = alloca(size);
+ buffer = must_realloc(NULL, size);
ret = snprintf(buffer, size, "exec %s %s %s", script, name, section);
if (ret < 0 || ret >= size)
return -1;
@@ -1136,16 +1138,16 @@ static int lxc_create_ttys(struct lxc_handler *handler)
static int mount_autodev(const char *name, const struct lxc_rootfs *rootfs,
const char *lxcpath)
{
+ __attribute__((__cleanup__(__auto_free__))) char *path = NULL;
int ret;
size_t clen;
- char *path;
mode_t cur_mask;
INFO("Preparing \"/dev\"");
/* $(rootfs->mount) + "/dev/pts" + '\0' */
clen = (rootfs->path ? strlen(rootfs->mount) : 0) + 9;
- path = alloca(clen);
+ path = must_realloc(NULL, clen);
ret = snprintf(path, clen, "%s/dev", rootfs->path ? rootfs->mount : "");
if (ret < 0 || (size_t)ret >= clen)
@@ -2560,6 +2562,7 @@ static int setup_caps(struct lxc_list *caps)
static int dropcaps_except(struct lxc_list *caps)
{
+ __attribute__((__cleanup__(__auto_free__))) int *caplist = NULL;
int i, capid, numcaps;
char *keep_entry;
struct lxc_list *iterator;
@@ -2570,7 +2573,7 @@ static int dropcaps_except(struct lxc_list *caps)
TRACE("Found %d capabilities", numcaps);
/* caplist[i] is 1 if we keep capability i */
- int *caplist = alloca(numcaps * sizeof(int));
+ caplist = must_realloc(NULL, numcaps * sizeof(int));
memset(caplist, 0, numcaps * sizeof(int));
lxc_list_for_each (iterator, caps) {
From 45769223c43cc1a2da803b77c6e087d06ffc2764 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:12:17 +0100
Subject: [PATCH 08/23] confile: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/confile.c | 21 +++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 564cbe38a..782f2ca15 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -53,6 +53,7 @@
#include "../include/netns_ifaddrs.h"
#include "log.h"
#include "lxcseccomp.h"
+#include "memory_utils.h"
#include "network.h"
#include "parse.h"
#include "storage.h"
@@ -2710,12 +2711,12 @@ int write_config(int fd, const struct lxc_conf *conf)
bool do_append_unexp_config_line(struct lxc_conf *conf, const char *key,
const char *v)
{
+ __attribute__((__cleanup__(__auto_free__))) char *tmp;
int ret;
size_t len;
- char *tmp;
len = strlen(key) + strlen(v) + 4;
- tmp = alloca(len);
+ tmp = must_realloc(NULL, len);
if (lxc_config_value_empty(v))
ret = snprintf(tmp, len, "%s =", key);
@@ -2777,21 +2778,23 @@ bool clone_update_unexp_ovl_paths(struct lxc_conf *conf, const char *oldpath,
const char *newpath, const char *oldname,
const char *newname, const char *ovldir)
{
+ __attribute__((__cleanup__(__auto_free__))) char *newdir = NULL,
+ *olddir = NULL;
int ret;
- char *lend, *newdir, *olddir, *p, *q;
+ char *lend, *p, *q;
size_t newdirlen, olddirlen;
char *lstart = conf->unexpanded_config;
const char *key = "lxc.mount.entry";
olddirlen = strlen(ovldir) + strlen(oldpath) + strlen(oldname) + 2;
- olddir = alloca(olddirlen + 1);
+ olddir = must_realloc(NULL, olddirlen + 1);
ret = snprintf(olddir, olddirlen + 1, "%s=%s/%s", ovldir, oldpath,
oldname);
if (ret < 0 || ret >= olddirlen + 1)
return false;
newdirlen = strlen(ovldir) + strlen(newpath) + strlen(newname) + 2;
- newdir = alloca(newdirlen + 1);
+ newdir = must_realloc(NULL, newdirlen + 1);
ret = snprintf(newdir, newdirlen + 1, "%s=%s/%s", ovldir, newpath,
newname);
if (ret < 0 || ret >= newdirlen + 1)
@@ -2885,20 +2888,22 @@ bool clone_update_unexp_hooks(struct lxc_conf *conf, const char *oldpath,
const char *newpath, const char *oldname,
const char *newname)
{
+ __attribute__((__cleanup__(__auto_free__))) char *newdir = NULL,
+ *olddir = NULL;
int ret;
- char *lend, *newdir, *olddir, *p;
+ char *lend, *p;
char *lstart = conf->unexpanded_config;
size_t newdirlen, olddirlen;
const char *key = "lxc.hook";
olddirlen = strlen(oldpath) + strlen(oldname) + 1;
- olddir = alloca(olddirlen + 1);
+ olddir = must_realloc(NULL, olddirlen + 1);
ret = snprintf(olddir, olddirlen + 1, "%s/%s", oldpath, oldname);
if (ret < 0 || ret >= olddirlen + 1)
return false;
newdirlen = strlen(newpath) + strlen(newname) + 1;
- newdir = alloca(newdirlen + 1);
+ newdir = must_realloc(NULL, newdirlen + 1);
ret = snprintf(newdir, newdirlen + 1, "%s/%s", newpath, newname);
if (ret < 0 || ret >= newdirlen + 1)
return false;
From 0536b074acfad58fe7d879b6c142e7aa8b0ec20a Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:19:56 +0100
Subject: [PATCH 09/23] lxccontainer: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/lxccontainer.c | 60 ++++++++++++++++++++----------------------
1 file changed, 29 insertions(+), 31 deletions(-)
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 7c826a9fd..6d2ac7d8f 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -61,6 +61,7 @@
#include "lxc.h"
#include "lxccontainer.h"
#include "lxclock.h"
+#include "memory_utils.h"
#include "monitor.h"
#include "namespace.h"
#include "network.h"
@@ -120,13 +121,13 @@ static bool do_lxcapi_save_config(struct lxc_container *c, const char *alt_file)
static bool config_file_exists(const char *lxcpath, const char *cname)
{
+ __attribute__((__cleanup__(__auto_free__))) char *fname;
int ret;
size_t len;
- char *fname;
/* $lxcpath + '/' + $cname + '/config' + \0 */
len = strlen(lxcpath) + strlen(cname) + 9;
- fname = alloca(len);
+ fname = must_realloc(NULL, len);
ret = snprintf(fname, len, "%s/%s/config", lxcpath, cname);
if (ret < 0 || (size_t)ret >= len)
return false;
@@ -144,13 +145,13 @@ static bool config_file_exists(const char *lxcpath, const char *cname)
*/
static int ongoing_create(struct lxc_container *c)
{
+ __attribute__((__cleanup__(__auto_free__))) char *path;
int fd, ret;
size_t len;
- char *path;
struct flock lk = {0};
len = strlen(c->config_path) + strlen(c->name) + 10;
- path = alloca(len);
+ path = must_realloc(NULL, len);
ret = snprintf(path, len, "%s/%s/partial", c->config_path, c->name);
if (ret < 0 || (size_t)ret >= len)
return -1;
@@ -190,14 +191,14 @@ static int ongoing_create(struct lxc_container *c)
static int create_partial(struct lxc_container *c)
{
+ __attribute__((__cleanup__(__auto_free__))) char *path;
int fd, ret;
size_t len;
- char *path;
struct flock lk = {0};
/* $lxcpath + '/' + $name + '/partial' + \0 */
len = strlen(c->config_path) + strlen(c->name) + 10;
- path = alloca(len);
+ path = must_realloc(NULL, len);
ret = snprintf(path, len, "%s/%s/partial", c->config_path, c->name);
if (ret < 0 || (size_t)ret >= len)
return -1;
@@ -227,15 +228,15 @@ static int create_partial(struct lxc_container *c)
static void remove_partial(struct lxc_container *c, int fd)
{
+ __attribute__((__cleanup__(__auto_free__))) char *path;
int ret;
size_t len;
- char *path;
close(fd);
/* $lxcpath + '/' + $name + '/partial' + \0 */
len = strlen(c->config_path) + strlen(c->name) + 10;
- path = alloca(len);
+ path = must_realloc(NULL, len);
ret = snprintf(path, len, "%s/%s/partial", c->config_path, c->name);
if (ret < 0 || (size_t)ret >= len)
return;
@@ -768,26 +769,22 @@ static void push_arg(char ***argp, char *arg, int *nargs)
static char **split_init_cmd(const char *incmd)
{
- size_t len, retlen;
- char *copy, *p;
+ __attribute__((__cleanup__(__auto_free__))) char *copy = NULL;
+ char *p;
char **argv;
int nargs = 0;
if (!incmd)
return NULL;
- len = strlen(incmd) + 1;
- copy = alloca(len);
- retlen = strlcpy(copy, incmd, len);
- if (retlen >= len)
- return NULL;
+ copy = must_copy_string(incmd);
do {
argv = malloc(sizeof(char *));
} while (!argv);
argv[0] = NULL;
- lxc_iterate_parts(p, copy, " ")
+ lxc_iterate_parts (p, copy, " ")
push_arg(&argv, p, &nargs);
if (nargs == 0) {
@@ -1209,9 +1206,9 @@ WRAP_API(bool, lxcapi_stop)
static int do_create_container_dir(const char *path, struct lxc_conf *conf)
{
+ __attribute__((__cleanup__(__auto_free__))) char *p = NULL;
int lasterr;
size_t len;
- char *p;
int ret = -1;
mode_t mask = umask(0002);
@@ -1226,9 +1223,7 @@ static int do_create_container_dir(const char *path, struct lxc_conf *conf)
ret = 0;
}
- len = strlen(path);
- p = alloca(len + 1);
- (void)strlcpy(p, path, len + 1);
+ p = must_copy_string(path);
if (!lxc_list_empty(&conf->id_map)) {
ret = chown_mapped_root(p, conf);
@@ -1270,9 +1265,9 @@ static struct lxc_storage *do_storage_create(struct lxc_container *c,
const char *type,
struct bdev_specs *specs)
{
+ __attribute__((__cleanup__(__auto_free__))) char *dest;
int ret;
size_t len;
- char *dest;
struct lxc_storage *bdev;
/* rootfs.path or lxcpath/lxcname/rootfs */
@@ -1280,12 +1275,12 @@ static struct lxc_storage *do_storage_create(struct lxc_container *c,
(access(c->lxc_conf->rootfs.path, F_OK) == 0)) {
const char *rpath = c->lxc_conf->rootfs.path;
len = strlen(rpath) + 1;
- dest = alloca(len);
+ dest = must_realloc(NULL, len);
ret = snprintf(dest, len, "%s", rpath);
} else {
const char *lxcpath = do_lxcapi_get_config_path(c);
len = strlen(c->name) + strlen(lxcpath) + 9;
- dest = alloca(len);
+ dest = must_realloc(NULL, len);
ret = snprintf(dest, len, "%s/%s/rootfs", lxcpath, c->name);
}
if (ret < 0 || (size_t)ret >= len)
@@ -3408,12 +3403,12 @@ static int copy_file(const char *old, const char *new)
static int copyhooks(struct lxc_container *oldc, struct lxc_container *c)
{
+ __attribute__((__cleanup__(__auto_free__))) char *cpath;
int i, len, ret;
struct lxc_list *it;
- char *cpath;
len = strlen(oldc->config_path) + strlen(oldc->name) + 3;
- cpath = alloca(len);
+ cpath = must_realloc(NULL, len);
ret = snprintf(cpath, len, "%s/%s/", oldc->config_path, oldc->name);
if (ret < 0 || ret >= len)
return -1;
@@ -3571,13 +3566,14 @@ static bool add_rdepends(struct lxc_container *c, struct lxc_container *c0)
bool should_default_to_snapshot(struct lxc_container *c0,
struct lxc_container *c1)
{
+ __attribute__((__cleanup__(__auto_free__))) char *p0, *p1;
int ret;
size_t l0 = strlen(c0->config_path) + strlen(c0->name) + 2;
size_t l1 = strlen(c1->config_path) + strlen(c1->name) + 2;
- char *p0 = alloca(l0 + 1);
- char *p1 = alloca(l1 + 1);
char *rootfs = c0->lxc_conf->rootfs.path;
+ p0 = must_realloc(NULL, l0 + 1);
+ p1 = must_realloc(NULL, l1 + 1);
ret = snprintf(p0, l0, "%s/%s", c0->config_path, c0->name);
if (ret < 0 || ret >= l0)
return false;
@@ -4099,11 +4095,11 @@ static int lxcapi_attach_run_wait(struct lxc_container *c, lxc_attach_options_t
static int get_next_index(const char *lxcpath, char *cname)
{
- char *fname;
+ __attribute__((__cleanup__(__auto_free__))) char *fname;
struct stat sb;
int i = 0, ret;
- fname = alloca(strlen(lxcpath) + 20);
+ fname = must_realloc(NULL, strlen(lxcpath) + 20);
while (1) {
sprintf(fname, "%s/snap%d", lxcpath, i);
@@ -4149,6 +4145,7 @@ static bool get_snappath_dir(struct lxc_container *c, char *snappath)
static int do_lxcapi_snapshot(struct lxc_container *c, const char *commentfile)
{
+ __attribute__((__cleanup__(__auto_free__))) char *dfnam = NULL;
int i, flags, ret;
time_t timer;
struct tm tm_info;
@@ -4212,7 +4209,7 @@ static int do_lxcapi_snapshot(struct lxc_container *c, const char *commentfile)
strftime(buffer, 25, "%Y:%m:%d %H:%M:%S", &tm_info);
- char *dfnam = alloca(strlen(snappath) + strlen(newname) + 5);
+ dfnam = must_realloc(NULL, strlen(snappath) + strlen(newname) + 5);
sprintf(dfnam, "%s/%s/ts", snappath, newname);
f = fopen(dfnam, "w");
if (!f) {
@@ -4233,10 +4230,11 @@ static int do_lxcapi_snapshot(struct lxc_container *c, const char *commentfile)
}
if (commentfile) {
+ __attribute__((__cleanup__(__auto_free__))) char *path;
/* $p / $name / comment \0 */
int len = strlen(snappath) + strlen(newname) + 10;
- char *path = alloca(len);
+ path = must_realloc(NULL, len);
sprintf(path, "%s/%s/comment", snappath, newname);
return copy_file(commentfile, path) < 0 ? -1 : i;
}
From bfed36b6fce0de95f85688fba492b1a37bcefa5a Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:23:19 +0100
Subject: [PATCH 10/23] namespace: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/namespace.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/lxc/namespace.c b/src/lxc/namespace.c
index b6eab04e6..5fbf02b0c 100644
--- a/src/lxc/namespace.c
+++ b/src/lxc/namespace.c
@@ -24,7 +24,6 @@
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
#endif
-#include <alloca.h>
#include <errno.h>
#include <fcntl.h>
#include <sched.h>
@@ -37,6 +36,7 @@
#include "config.h"
#include "log.h"
+#include "memory_utils.h"
#include "namespace.h"
#include "utils.h"
@@ -55,13 +55,14 @@ static int do_clone(void *arg)
pid_t lxc_clone(int (*fn)(void *), void *arg, int flags)
{
+ __attribute__((__cleanup__(__auto_free__))) char *stack;
struct clone_arg clone_arg = {
- .fn = fn,
- .arg = arg,
+ .fn = fn,
+ .arg = arg,
};
size_t stack_size = lxc_getpagesize();
- void *stack = alloca(stack_size);
+ stack = must_realloc(NULL, stack_size);
pid_t ret;
#ifdef __ia64__
From f13caa983478c3c03541a64b50519e268802a781 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:25:12 +0100
Subject: [PATCH 11/23] start: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/start.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/src/lxc/start.c b/src/lxc/start.c
index 91f1e51b7..6f39e95c9 100644
--- a/src/lxc/start.c
+++ b/src/lxc/start.c
@@ -26,7 +26,6 @@
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
#endif
-#include <alloca.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
@@ -67,6 +66,7 @@
#include "lxcseccomp.h"
#include "macro.h"
#include "mainloop.h"
+#include "memory_utils.h"
#include "monitor.h"
#include "namespace.h"
#include "network.h"
@@ -97,14 +97,16 @@ static void lxc_destroy_container_on_signal(struct lxc_handler *handler,
static void print_top_failing_dir(const char *path)
{
+ __attribute__((__cleanup__(__auto_free__))) char *copy;
int ret;
size_t len;
- char *copy, *e, *p, saved;
+ char *e, *p, saved;
len = strlen(path);
- copy = alloca(len + 1);
+ copy = must_realloc(NULL, len + 1);
(void)strlcpy(copy, path, len + 1);
+ copy = must_copy_string(path);
p = copy;
e = copy + len;
From b57bbeff7b09ca44ffc839c0afb5e7d6a32bcace Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:26:19 +0100
Subject: [PATCH 12/23] terminal: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/terminal.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c
index de0089101..1f5eeba48 100644
--- a/src/lxc/terminal.c
+++ b/src/lxc/terminal.c
@@ -44,6 +44,7 @@
#include "log.h"
#include "lxclock.h"
#include "mainloop.h"
+#include "memory_utils.h"
#include "start.h"
#include "syscall_wrappers.h"
#include "terminal.h"
@@ -199,9 +200,9 @@ static int lxc_terminal_truncate_log_file(struct lxc_terminal *terminal)
static int lxc_terminal_rotate_log_file(struct lxc_terminal *terminal)
{
+ __attribute__((__cleanup__(__auto_free__))) char *tmp = NULL;
int ret;
size_t len;
- char *tmp;
if (!terminal->log_path || terminal->log_rotate == 0)
return -EOPNOTSUPP;
@@ -211,7 +212,7 @@ static int lxc_terminal_rotate_log_file(struct lxc_terminal *terminal)
return -EBADF;
len = strlen(terminal->log_path) + sizeof(".1");
- tmp = alloca(len);
+ tmp = must_realloc(NULL, len);
ret = snprintf(tmp, len, "%s.1", terminal->log_path);
if (ret < 0 || (size_t)ret >= len)
From 624784e41854ec109b9120623ab6ef3dc764ba54 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:27:29 +0100
Subject: [PATCH 13/23] network: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/network.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/lxc/network.c b/src/lxc/network.c
index 499ddff6e..b5bfbe004 100644
--- a/src/lxc/network.c
+++ b/src/lxc/network.c
@@ -54,6 +54,7 @@
#include "file_utils.h"
#include "log.h"
#include "macro.h"
+#include "memory_utils.h"
#include "network.h"
#include "nl.h"
#include "raw_syscalls.h"
@@ -549,15 +550,15 @@ int lxc_netdev_move_by_index(int ifindex, pid_t pid, const char *ifname)
#define PHYSNAME "/sys/class/net/%s/phy80211/name"
static char *is_wlan(const char *ifname)
{
+ __attribute__((__cleanup__(__auto_free__))) char *path;
int i, ret;
long physlen;
size_t len;
- char *path;
FILE *f;
char *physname = NULL;
len = strlen(ifname) + strlen(PHYSNAME) - 1;
- path = alloca(len + 1);
+ path = must_realloc(NULL, len + 1);
ret = snprintf(path, len, PHYSNAME, ifname);
if (ret < 0 || (size_t)ret >= len)
goto bad;
From 196ee599f4a2d50dc7be55eaf8044171bc950821 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:30:00 +0100
Subject: [PATCH 14/23] string_utils: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/string_utils.c | 28 ++++++++++------------------
1 file changed, 10 insertions(+), 18 deletions(-)
diff --git a/src/lxc/string_utils.c b/src/lxc/string_utils.c
index 0d7538c1f..9a92fd790 100644
--- a/src/lxc/string_utils.c
+++ b/src/lxc/string_utils.c
@@ -46,6 +46,7 @@
#include "config.h"
#include "lxclock.h"
#include "macro.h"
+#include "memory_utils.h"
#include "namespace.h"
#include "parse.h"
#include "string_utils.h"
@@ -318,17 +319,14 @@ char *lxc_append_paths(const char *first, const char *second)
bool lxc_string_in_list(const char *needle, const char *haystack, char _sep)
{
- char *token, *str;
+ __attribute__((__cleanup__(__auto_free__))) char *str = NULL;
+ char *token;
char sep[2] = { _sep, '\0' };
- size_t len;
if (!haystack || !needle)
return 0;
- len = strlen(haystack);
- str = alloca(len + 1);
- (void)strlcpy(str, haystack, len + 1);
-
+ str = must_copy_string(haystack);
lxc_iterate_parts(token, str, sep)
if (strcmp(needle, token) == 0)
return 1;
@@ -338,21 +336,18 @@ bool lxc_string_in_list(const char *needle, const char *haystack, char _sep)
char **lxc_string_split(const char *string, char _sep)
{
- char *token, *str;
+ __attribute__((__cleanup__(__auto_free__))) char *str = NULL;
+ char *token;
char sep[2] = {_sep, '\0'};
char **tmp = NULL, **result = NULL;
size_t result_capacity = 0;
size_t result_count = 0;
int r, saved_errno;
- size_t len;
if (!string)
return calloc(1, sizeof(char *));
- len = strlen(string);
- str = alloca(len + 1);
- (void)strlcpy(str, string, len + 1);
-
+ str = must_copy_string(string);
lxc_iterate_parts(token, str, sep) {
r = lxc_grow_array((void ***)&result, &result_capacity, result_count + 1, 16);
if (r < 0)
@@ -458,22 +453,19 @@ char **lxc_string_split_quoted(char *string)
char **lxc_string_split_and_trim(const char *string, char _sep)
{
- char *token, *str;
+ __attribute__((__cleanup__(__auto_free__))) char *str = NULL;
+ char *token;
char sep[2] = { _sep, '\0' };
char **result = NULL;
size_t result_capacity = 0;
size_t result_count = 0;
int r, saved_errno;
size_t i = 0;
- size_t len;
if (!string)
return calloc(1, sizeof(char *));
- len = strlen(string);
- str = alloca(len + 1);
- (void)strlcpy(str, string, len + 1);
-
+ str = must_copy_string(string);
lxc_iterate_parts(token, str, sep) {
while (token[0] == ' ' || token[0] == '\t')
token++;
From 1ec622860e7599a8015196a7f47867af41178478 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:31:16 +0100
Subject: [PATCH 15/23] monitor: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/monitor.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/lxc/monitor.c b/src/lxc/monitor.c
index 4f8c285a0..03584e531 100644
--- a/src/lxc/monitor.c
+++ b/src/lxc/monitor.c
@@ -49,6 +49,7 @@
#include "log.h"
#include "lxclock.h"
#include "macro.h"
+#include "memory_utils.h"
#include "monitor.h"
#include "state.h"
#include "utils.h"
@@ -170,9 +171,9 @@ int lxc_monitor_close(int fd)
*/
int lxc_monitor_sock_name(const char *lxcpath, struct sockaddr_un *addr)
{
+ __attribute__((__cleanup__(__auto_free__))) char *path;
size_t len;
int ret;
- char *path;
uint64_t hash;
/* addr.sun_path is only 108 bytes, so we hash the full name and
@@ -183,7 +184,7 @@ int lxc_monitor_sock_name(const char *lxcpath, struct sockaddr_un *addr)
/* strlen("lxc/") + strlen("/monitor-sock") + 1 = 18 */
len = strlen(lxcpath) + 18;
- path = alloca(len);
+ path = must_realloc(NULL, len);
ret = snprintf(path, len, "lxc/%s/monitor-sock", lxcpath);
if (ret < 0 || (size_t)ret >= len) {
ERROR("Failed to create name for monitor socket");
From b4055bbed9bf647755d38d175b621d8086e3192c Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:32:21 +0100
Subject: [PATCH 16/23] storage: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/storage/storage.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/src/lxc/storage/storage.c b/src/lxc/storage/storage.c
index c4f4c2ea3..95cf9c6ae 100644
--- a/src/lxc/storage/storage.c
+++ b/src/lxc/storage/storage.c
@@ -51,6 +51,7 @@
#include "lvm.h"
#include "lxc.h"
#include "lxclock.h"
+#include "memory_utils.h"
#include "namespace.h"
#include "nbd.h"
#include "overlay.h"
@@ -568,13 +569,11 @@ struct lxc_storage *storage_create(const char *dest, const char *type,
/* -B lvm,dir */
if (strchr(type, ',')) {
- char *dup, *token;
+ __attribute__((__cleanup__(__auto_free__))) char *dup;
+ char *token;
size_t len;
- len = strlen(type);
- dup = alloca(len + 1);
- (void)strlcpy(dup, type, len + 1);
-
+ dup = must_copy_string(type);
lxc_iterate_parts(token, dup, ",") {
bdev = do_storage_create(dest, token, cname, specs);
if (bdev)
From 1e06ae28b8d3118556b7ab1fbc358e32258f670f Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:33:48 +0100
Subject: [PATCH 17/23] pam_cgfs: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/Makefile.am | 1 +
src/lxc/pam/pam_cgfs.c | 6 ++++--
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am
index 7d1522bf2..6ba9ecad2 100644
--- a/src/lxc/Makefile.am
+++ b/src/lxc/Makefile.am
@@ -433,6 +433,7 @@ pam_LTLIBRARIES = pam_cgfs.la
pam_cgfs_la_SOURCES = pam/pam_cgfs.c \
file_utils.c file_utils.h \
macro.h \
+ memory_utils.h \
string_utils.c string_utils.h
if !HAVE_STRLCAT
diff --git a/src/lxc/pam/pam_cgfs.c b/src/lxc/pam/pam_cgfs.c
index 4a45600ea..955227cce 100644
--- a/src/lxc/pam/pam_cgfs.c
+++ b/src/lxc/pam/pam_cgfs.c
@@ -59,6 +59,7 @@
#include "config.h"
#include "file_utils.h"
#include "macro.h"
+#include "memory_utils.h"
#include "string_utils.h"
#define PAM_SM_SESSION
@@ -842,8 +843,9 @@ static char **cgv1_get_proc_mountinfo_controllers(char **klist, char **nlist, ch
/* Check if a cgroupfs v2 controller is present in the string @cgline. */
static bool cgv1_controller_in_clist(char *cgline, char *c)
{
+ __attribute__((__cleanup__(__auto_free__))) char *tmp = NULL;
size_t len;
- char *tok, *eol, *tmp;
+ char *tok, *eol;
char *saveptr = NULL;
eol = strchr(cgline, ':');
@@ -851,7 +853,7 @@ static bool cgv1_controller_in_clist(char *cgline, char *c)
return false;
len = eol - cgline;
- tmp = alloca(len + 1);
+ tmp = must_realloc(NULL, len + 1);
memcpy(tmp, cgline, len);
tmp[len] = '\0';
From 7d03f71e470612a2d963f75efb86bf1e1c63330e Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:38:02 +0100
Subject: [PATCH 18/23] loop: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/storage/loop.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/lxc/storage/loop.c b/src/lxc/storage/loop.c
index 35cb13e06..776fe86de 100644
--- a/src/lxc/storage/loop.c
+++ b/src/lxc/storage/loop.c
@@ -39,6 +39,7 @@
#include "config.h"
#include "log.h"
#include "loop.h"
+#include "memory_utils.h"
#include "storage.h"
#include "storage_utils.h"
#include "utils.h"
@@ -56,9 +57,9 @@ int loop_clonepaths(struct lxc_storage *orig, struct lxc_storage *new,
const char *lxcpath, int snap, uint64_t newsize,
struct lxc_conf *conf)
{
+ __attribute__((__cleanup__(__auto_free__))) char *srcdev = NULL;
uint64_t size = newsize;
int len, ret;
- char *srcdev;
char fstype[100] = "ext4";
if (snap) {
@@ -70,7 +71,7 @@ int loop_clonepaths(struct lxc_storage *orig, struct lxc_storage *new,
return -1;
len = strlen(lxcpath) + strlen(cname) + strlen("rootdev") + 3;
- srcdev = alloca(len);
+ srcdev = must_realloc(NULL, len);
ret = snprintf(srcdev, len, "%s/%s/rootdev", lxcpath, cname);
if (ret < 0 || ret >= len) {
ERROR("Failed to create string");
@@ -136,10 +137,10 @@ int loop_clonepaths(struct lxc_storage *orig, struct lxc_storage *new,
int loop_create(struct lxc_storage *bdev, const char *dest, const char *n,
struct bdev_specs *specs)
{
+ __attribute__((__cleanup__(__auto_free__))) char *srcdev;
const char *fstype;
uint64_t sz;
int ret, len;
- char *srcdev;
if (!specs)
return -1;
@@ -148,7 +149,7 @@ int loop_create(struct lxc_storage *bdev, const char *dest, const char *n,
* be <lxcpath>/<lxcname>/rootdev, and <src> will be "loop:<srcdev>".
*/
len = strlen(dest) + 2;
- srcdev = alloca(len);
+ srcdev = must_realloc(NULL, len);
ret = snprintf(srcdev, len, "%s", dest);
if (ret < 0 || ret >= len) {
From d79360c21e7d20c9549df2506e2ed5d066022f25 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:39:51 +0100
Subject: [PATCH 19/23] lvm: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/storage/lvm.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/lxc/storage/lvm.c b/src/lxc/storage/lvm.c
index c06e1a325..151f33ca8 100644
--- a/src/lxc/storage/lvm.c
+++ b/src/lxc/storage/lvm.c
@@ -37,6 +37,7 @@
#include "config.h"
#include "log.h"
#include "lvm.h"
+#include "memory_utils.h"
#include "rsync.h"
#include "storage.h"
#include "storage_utils.h"
@@ -113,7 +114,7 @@ static int do_lvm_create(const char *path, uint64_t size, const char *thinpool)
char *pathdup, *vg, *lv;
char cmd_output[PATH_MAX];
char sz[24];
- char *tp = NULL;
+ __attribute__((__cleanup__(__auto_free__))) char *tp;
struct lvcreate_args cmd_args = {0};
ret = snprintf(sz, 24, "%" PRIu64 "b", size);
@@ -149,7 +150,7 @@ static int do_lvm_create(const char *path, uint64_t size, const char *thinpool)
if (thinpool) {
len = strlen(pathdup) + strlen(thinpool) + 2;
- tp = alloca(len);
+ tp = must_realloc(NULL, len);
ret = snprintf(tp, len, "%s/%s", pathdup, thinpool);
if (ret < 0 || ret >= len) {
@@ -266,16 +267,16 @@ int lvm_umount(struct lxc_storage *bdev)
int lvm_compare_lv_attr(const char *path, int pos, const char expected)
{
+ __attribute__((__cleanup__(__auto_free__))) char *cmd;
struct lxc_popen_FILE *f;
int ret, status;
size_t len;
- char *cmd;
char output[12];
int start = 0;
const char *lvscmd = "lvs --unbuffered --noheadings -o lv_attr %s 2>/dev/null";
len = strlen(lvscmd) + strlen(path) + 1;
- cmd = alloca(len);
+ cmd = must_realloc(NULL, len);
ret = snprintf(cmd, len, lvscmd, path);
if (ret < 0 || (size_t)ret >= len)
From c585aa2678e08a69b3688d76f60895c977662859 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:42:50 +0100
Subject: [PATCH 20/23] nbd: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/storage/nbd.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/src/lxc/storage/nbd.c b/src/lxc/storage/nbd.c
index 2fae1fdb2..410b3b057 100644
--- a/src/lxc/storage/nbd.c
+++ b/src/lxc/storage/nbd.c
@@ -35,6 +35,7 @@
#include "config.h"
#include "log.h"
+#include "memory_utils.h"
#include "nbd.h"
#include "storage.h"
#include "storage_utils.h"
@@ -61,14 +62,11 @@ static bool wait_for_partition(const char *path);
bool attach_nbd(char *src, struct lxc_conf *conf)
{
- char *orig, *p, path[50];
+ __attribute__((__cleanup__(__auto_free__))) char *orig;
+ char *p, path[50];
int i = 0;
- size_t len;
-
- len = strlen(src);
- orig = alloca(len + 1);
- (void)strlcpy(orig, src, len + 1);
+ orig = must_copy_string(src);
/* if path is followed by a partition, drop that for now */
p = strchr(orig, ':');
if (p)
From 86198961259a4c52867d1d524e23c9bcf140e089 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:44:13 +0100
Subject: [PATCH 21/23] rbd: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/storage/rbd.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/lxc/storage/rbd.c b/src/lxc/storage/rbd.c
index e02a629b9..8cc8605ae 100644
--- a/src/lxc/storage/rbd.c
+++ b/src/lxc/storage/rbd.c
@@ -33,6 +33,7 @@
#include "config.h"
#include "log.h"
+#include "memory_utils.h"
#include "storage.h"
#include "storage_utils.h"
#include "utils.h"
@@ -195,9 +196,9 @@ int rbd_create(struct lxc_storage *bdev, const char *dest, const char *n,
int rbd_destroy(struct lxc_storage *orig)
{
+ __attribute__((__cleanup__(__auto_free__))) char *rbdfullname = NULL;
int ret;
const char *src;
- char *rbdfullname;
char cmd_output[PATH_MAX];
struct rbd_args args = {0};
size_t len;
@@ -215,7 +216,7 @@ int rbd_destroy(struct lxc_storage *orig)
}
len = strlen(src);
- rbdfullname = alloca(len - 8);
+ rbdfullname = must_realloc(NULL, len - 8);
(void)strlcpy(rbdfullname, &src[9], len - 8);
args.rbd_name = rbdfullname;
From 37f909346fdef4b34d517854cb8e686cbfe389b1 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:46:13 +0100
Subject: [PATCH 22/23] overlay: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/storage/overlay.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/src/lxc/storage/overlay.c b/src/lxc/storage/overlay.c
index 01546b1bf..36a545126 100644
--- a/src/lxc/storage/overlay.c
+++ b/src/lxc/storage/overlay.c
@@ -35,6 +35,7 @@
#include "log.h"
#include "lxccontainer.h"
#include "macro.h"
+#include "memory_utils.h"
#include "overlay.h"
#include "rsync.h"
#include "storage.h"
@@ -491,8 +492,10 @@ bool ovl_detect(const char *path)
int ovl_mount(struct lxc_storage *bdev)
{
- char *tmp, *options, *dup, *lower, *upper;
- char *options_work, *work, *lastslash;
+ __attribute__((__cleanup__(__auto_free__))) char *options = NULL,
+ *options_work = NULL;
+ char *tmp, *dup, *lower, *upper;
+ char *work, *lastslash;
int lastslashidx;
size_t len, len2;
unsigned long mntflags;
@@ -602,27 +605,27 @@ int ovl_mount(struct lxc_storage *bdev)
if (mntdata) {
len = strlen(lower) + strlen(upper) +
strlen("upperdir=,lowerdir=,") + strlen(mntdata) + 1;
- options = alloca(len);
+ options = must_realloc(NULL, len);
ret = snprintf(options, len, "upperdir=%s,lowerdir=%s,%s",
upper, lower, mntdata);
len2 = strlen(lower) + strlen(upper) + strlen(work) +
strlen("upperdir=,lowerdir=,workdir=") +
strlen(mntdata) + 1;
- options_work = alloca(len2);
+ options_work = must_realloc(NULL, len2);
ret2 = snprintf(options, len2,
"upperdir=%s,lowerdir=%s,workdir=%s,%s", upper,
lower, work, mntdata);
} else {
len = strlen(lower) + strlen(upper) +
strlen("upperdir=,lowerdir=") + 1;
- options = alloca(len);
+ options = must_realloc(NULL, len);
ret = snprintf(options, len, "upperdir=%s,lowerdir=%s", upper,
lower);
len2 = strlen(lower) + strlen(upper) + strlen(work) +
strlen("upperdir=,lowerdir=,workdir=") + 1;
- options_work = alloca(len2);
+ options_work = must_realloc(NULL, len2);
ret2 = snprintf(options_work, len2,
"upperdir=%s,lowerdir=%s,workdir=%s", upper,
lower, work);
From 3fbf0a23aa52a795d39135f20f78a2e7264553ce Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 5 Feb 2019 07:47:18 +0100
Subject: [PATCH 23/23] lxc-unshare: remove stack allocations
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/tools/lxc_unshare.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lxc/tools/lxc_unshare.c b/src/lxc/tools/lxc_unshare.c
index a86d12b3c..ed9350906 100644
--- a/src/lxc/tools/lxc_unshare.c
+++ b/src/lxc/tools/lxc_unshare.c
@@ -398,7 +398,7 @@ int main(int argc, char *argv[])
if (my_args.setuid) {
uint64_t wait_val = 1;
/* enough space to accommodate uids */
- char *umap = (char *)alloca(100);
+ char umap[100];
/* create new uid mapping using current UID and the one
* specified as parameter
More information about the lxc-devel
mailing list