#include "log.h"
#include "utils.h"
+#ifndef HAVE_STRLCPY
+#include "include/strlcpy.h"
+#endif
+
lxc_log_define(lxc_af_unix, lxc);
int lxc_abstract_unix_open(const char *path, int type, int flags)
errno = ENAMETOOLONG;
return -1;
}
- /* addr.sun_path[0] has already been set to 0 by memset() */
- strncpy(&addr.sun_path[1], &path[1], len);
+
+ /* do not enforce \0-termination */
+ memcpy(&addr.sun_path[1], &path[1], len);
ret = bind(fd, (struct sockaddr *)&addr,
offsetof(struct sockaddr_un, sun_path) + len + 1);
errno = ENAMETOOLONG;
return -1;
}
- /* addr.sun_path[0] has already been set to 0 by memset() */
- strncpy(&addr.sun_path[1], &path[1], strlen(&path[1]));
+
+ /* do not enforce \0-termination */
+ memcpy(&addr.sun_path[1], &path[1], len);
ret = connect(fd, (struct sockaddr *)&addr,
offsetof(struct sockaddr_un, sun_path) + len + 1);
#include <mntent.h>
#endif
+#ifndef HAVE_STRLCPY
+#include "include/strlcpy.h"
+#endif
+
#define CRIU_VERSION "2.0"
#define CRIU_GITID_VERSION "2.0"
argv = m;
lxc_list_for_each(it, &opts->c->lxc_conf->network) {
+ size_t retlen;
char eth[128], *veth;
char *fmt;
struct lxc_netdev *n = it->elem;
}
if (n->name[0] != '\0') {
- if (strlen(n->name) >= sizeof(eth))
+ retlen = strlcpy(eth, n->name, sizeof(eth));
+ if (retlen >= sizeof(eth))
goto err;
- strncpy(eth, n->name, sizeof(eth));
} else {
ret = snprintf(eth, sizeof(eth), "eth%d", netnr);
if (ret < 0 || ret >= sizeof(eth))
#include "utils.h"
#include "lxccontainer.h"
+#ifndef HAVE_STRLCPY
+#include "include/strlcpy.h"
+#endif
+
/* We're logging in seconds and nanoseconds. Assuming that the underlying
* datatype is currently at maximum a 64bit integer, we have a date string that
* is of maximum length (2^64 - 1) * 2 = (21 + 21) = 42.
extern void lxc_log_set_prefix(const char *prefix)
{
- strncpy(log_prefix, prefix, sizeof(log_prefix));
- log_prefix[sizeof(log_prefix) - 1] = 0;
+ /* We don't care if thte prefix is truncated. */
+ (void)strlcpy(log_prefix, prefix, sizeof(log_prefix));
}
extern const char *lxc_log_get_prefix(void)
#define MAX_BUFFER 4096
#define NOT_SUPPORTED_ERROR "the requested function %s is not currently supported with unprivileged containers"
+#ifndef HAVE_STRLCPY
+#include "include/strlcpy.h"
+#endif
/* Define faccessat() if missing from the C library */
#ifndef HAVE_FACCESSAT
static char **split_init_cmd(const char *incmd)
{
- size_t len;
+ size_t len, retlen;
char *copy, *p;
char **argv;
int nargs = 0;
len = strlen(incmd) + 1;
copy = alloca(len);
- strncpy(copy, incmd, len);
- copy[len - 1] = '\0';
+ retlen = strlcpy(copy, incmd, len);
+ if (retlen >= len) {
+ return NULL;
+ }
do {
argv = malloc(sizeof(char *));
#include "state.h"
#include "utils.h"
+#ifndef HAVE_STRLCPY
+#include "include/strlcpy.h"
+#endif
+
lxc_log_define(lxc_monitor, lxc);
/* routines used by monitor publishers (containers) */
const char *lxcpath)
{
struct lxc_msg msg = {.type = lxc_msg_state, .value = state};
- strncpy(msg.name, name, sizeof(msg.name));
- msg.name[sizeof(msg.name) - 1] = 0;
+ (void)strlcpy(msg.name, name, sizeof(msg.name));
lxc_monitor_fifo_send(&msg, lxcpath);
}
const char *lxcpath)
{
struct lxc_msg msg = {.type = lxc_msg_exit_code, .value = exit_code};
- strncpy(msg.name, name, sizeof(msg.name));
- msg.name[sizeof(msg.name) - 1] = 0;
+ (void)strlcpy(msg.name, name, sizeof(msg.name));
lxc_monitor_fifo_send(&msg, lxcpath);
}
#include <../include/ifaddrs.h>
#endif
+#ifndef HAVE_STRLCPY
+#include "include/strlcpy.h"
+#endif
+
#ifndef IFLA_LINKMODE
#define IFLA_LINKMODE 17
#endif
int lxc_bridge_attach(const char *bridge, const char *ifname)
{
- int fd, index, err;
+ int err, fd, index;
+ size_t retlen;
struct ifreq ifr;
if (strlen(ifname) >= IFNAMSIZ)
if (fd < 0)
return -errno;
- strncpy(ifr.ifr_name, bridge, IFNAMSIZ-1);
- ifr.ifr_name[IFNAMSIZ-1] = '\0';
+ retlen = strlcpy(ifr.ifr_name, bridge, IFNAMSIZ);
+ if (retlen >= IFNAMSIZ)
+ return -E2BIG;
+
ifr.ifr_ifindex = index;
err = ioctl(fd, SIOCBRADDIF, &ifr);
close(fd);
if (child == 0) {
int ret;
+ size_t retlen;
char pidstr[LXC_NUMSTRLEN64];
close(pipefd[0]);
}
if (netdev->link[0] != '\0')
- strncpy(netdev_link, netdev->link, IFNAMSIZ - 1);
+ retlen = strlcpy(netdev_link, netdev->link, IFNAMSIZ);
else
- strncpy(netdev_link, "none", IFNAMSIZ - 1);
+ retlen = strlcpy(netdev_link, "none", IFNAMSIZ);
+ if (retlen >= IFNAMSIZ) {
+ SYSERROR("Invalid network device name");
+ _exit(EXIT_FAILURE);
+ }
ret = snprintf(pidstr, LXC_NUMSTRLEN64, "%d", pid);
if (ret < 0 || ret >= LXC_NUMSTRLEN64)
#include "storage/storage.h"
#include "storage/storage_utils.h"
+#ifndef HAVE_STRLCPY
+#include "include/strlcpy.h"
+#endif
+
lxc_log_define(lxc_start, lxc);
extern void mod_all_rdeps(struct lxc_container *c, bool inc);
int lxc_serve_state_clients(const char *name, struct lxc_handler *handler,
lxc_state_t state)
{
+ size_t retlen;
ssize_t ret;
struct lxc_list *cur, *next;
struct state_client *client;
return 0;
}
- strncpy(msg.name, name, sizeof(msg.name));
- msg.name[sizeof(msg.name) - 1] = 0;
+ retlen = strlcpy(msg.name, name, sizeof(msg.name));
+ if (retlen >= sizeof(msg.name))
+ return -E2BIG;
lxc_list_for_each_safe(cur, &handler->state_clients, next) {
client = cur->elem;
#include "storage.h"
#include "utils.h"
+#ifndef HAVE_STRLCPY
+#include "include/strlcpy.h"
+#endif
+
lxc_log_define(btrfs, lxc);
/* defined in lxccontainer.c: needs to become common helper */
static int btrfs_subvolume_create(const char *path)
{
- int ret, fd = -1;
- struct btrfs_ioctl_vol_args args;
- char *p, *newfull = strdup(path);
+ int ret, saved_errno;
+ size_t retlen;
+ struct btrfs_ioctl_vol_args args;
+ char *p, *newfull;
+ int fd = -1;
+ newfull = strdup(path);
if (!newfull) {
- ERROR("Error: out of memory");
- return -1;
+ errno = ENOMEM;
+ return -ENOMEM;
}
p = strrchr(newfull, '/');
if (!p) {
- ERROR("bad path: %s", path);
free(newfull);
- return -1;
+ errno = EINVAL;
+ return -EINVAL;
}
*p = '\0';
fd = open(newfull, O_RDONLY);
if (fd < 0) {
- ERROR("Error opening %s", newfull);
free(newfull);
- return -1;
+ return -errno;
}
memset(&args, 0, sizeof(args));
- strncpy(args.name, p+1, BTRFS_SUBVOL_NAME_MAX);
- args.name[BTRFS_SUBVOL_NAME_MAX-1] = 0;
+ retlen = strlcpy(args.name, p + 1, BTRFS_SUBVOL_NAME_MAX);
+ if (retlen >= BTRFS_SUBVOL_NAME_MAX) {
+ free(newfull);
+ close(fd);
+ return -E2BIG;
+ }
+
ret = ioctl(fd, BTRFS_IOC_SUBVOL_CREATE, &args);
- INFO("btrfs: snapshot create ioctl returned %d", ret);
+ saved_errno = errno;
- free(newfull);
close(fd);
+ free(newfull);
+ errno = saved_errno;
return ret;
}
int btrfs_snapshot(const char *orig, const char *new)
{
- int fd = -1, fddst = -1, ret = -1;
- struct btrfs_ioctl_vol_args_v2 args;
- char *newdir, *newname, *newfull = NULL;
+ int fd, fddst, ret;
+ size_t retlen;
+ struct btrfs_ioctl_vol_args_v2 args;
+ char *newdir, *newname;
+ char *newfull = NULL;
newfull = strdup(new);
if (!newfull) {
}
memset(&args, 0, sizeof(args));
- args.fd = fd;
- strncpy(args.name, newname, BTRFS_SUBVOL_NAME_MAX);
- args.name[BTRFS_SUBVOL_NAME_MAX-1] = 0;
+ retlen = strlcpy(args.name, newname, BTRFS_SUBVOL_NAME_MAX);
+ if (retlen >= BTRFS_SUBVOL_NAME_MAX)
+ goto out;
+
ret = ioctl(fddst, BTRFS_IOC_SNAP_CREATE_V2, &args);
INFO("btrfs: snapshot create ioctl returned %d", ret);
static int btrfs_do_destroy_subvol(const char *path)
{
int ret, fd = -1;
+ size_t retlen;
struct btrfs_ioctl_vol_args args;
char *p, *newfull = strdup(path);
}
memset(&args, 0, sizeof(args));
- strncpy(args.name, p+1, BTRFS_SUBVOL_NAME_MAX);
- args.name[BTRFS_SUBVOL_NAME_MAX-1] = 0;
+ retlen = strlcpy(args.name, p+1, BTRFS_SUBVOL_NAME_MAX);
+ if (retlen >= BTRFS_SUBVOL_NAME_MAX) {
+ free(newfull);
+ return -E2BIG;
+ }
+
ret = ioctl(fd, BTRFS_IOC_SNAP_DESTROY, &args);
INFO("btrfs: snapshot destroy ioctl returned %d for %s", ret, path);
if (ret < 0 && errno == EPERM)
{
if (id)
n->objid = id;
+
if (parent)
n->parentid = parent;
+
if (name) {
n->name = malloc(name_len + 1);
if (!n->name)
return false;
- strncpy(n->name, name, name_len);
- n->name[name_len] = '\0';
+
+ strcpy(n->name, name);
}
+
if (dirname) {
n->dirname = malloc(strlen(dirname) + 1);
if (!n->dirname) {
free(n->name);
return false;
}
+
strcpy(n->dirname, dirname);
}
return true;
#include "storage_utils.h"
#include "utils.h"
+#ifndef HAVE_STRLCPY
+#include "include/strlcpy.h"
+#endif
+
#ifndef BLKGETSIZE64
#define BLKGETSIZE64 _IOR(0x12, 114, size_t)
#endif
}
while ((p2 = strstr(src, oldname)) != NULL) {
- strncpy(p, src, p2 - src); // copy text up to oldname
- p += p2 - src; // move target pointer (p)
- p += sprintf(p, "%s",
- name); // print new name in place of oldname
- src = p2 + l2; // move src to end of oldname
+ size_t retlen;
+
+ /* copy text up to oldname */
+ retlen = strlcpy(p, src, p2 - src);
+ if (retlen >= p2 - src)
+ return NULL;
+
+ /* move target pointer (p) */
+ p += p2 - src;
+ /* print new name in place of oldname */
+ p += sprintf(p, "%s", name);
+ /* move src to end of oldname */
+ src = p2 + l2;
}
- sprintf(p, "%s", src); // copy the rest of src
+
+ /* copy the rest of src */
+ sprintf(p, "%s", src);
return ret;
}