/* $lxcpath + '/' + $cname + '/config' + \0 */
len = strlen(lxcpath) + 1 + strlen(cname) + 1 + strlen(LXC_CONFIG_FNAME) + 1;
fname = must_realloc(NULL, len);
- ret = snprintf(fname, len, "%s/%s/%s", lxcpath, cname, LXC_CONFIG_FNAME);
- if (ret < 0 || (size_t)ret >= len)
+ ret = strnprintf(fname, len, "%s/%s/%s", lxcpath, cname, LXC_CONFIG_FNAME);
+ if (ret < 0)
return false;
return file_exists(fname);
len = strlen(c->config_path) + 1 + strlen(c->name) + 1 + strlen(LXC_PARTIAL_FNAME) + 1;
path = must_realloc(NULL, len);
- ret = snprintf(path, len, "%s/%s/%s", c->config_path, c->name, LXC_PARTIAL_FNAME);
- if (ret < 0 || (size_t)ret >= len)
+ ret = strnprintf(path, len, "%s/%s/%s", c->config_path, c->name, LXC_PARTIAL_FNAME);
+ if (ret < 0)
return LXC_CREATE_FAILED;
fd = open(path, O_RDWR | O_CLOEXEC);
/* $lxcpath + '/' + $name + '/partial' + \0 */
len = strlen(c->config_path) + 1 + strlen(c->name) + 1 + strlen(LXC_PARTIAL_FNAME) + 1;
path = must_realloc(NULL, len);
- ret = snprintf(path, len, "%s/%s/%s", c->config_path, c->name, LXC_PARTIAL_FNAME);
- if (ret < 0 || (size_t)ret >= len)
+ ret = strnprintf(path, len, "%s/%s/%s", c->config_path, c->name, LXC_PARTIAL_FNAME);
+ if (ret < 0)
return -1;
fd = open(path, O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC, 0000);
/* $lxcpath + '/' + $name + '/partial' + \0 */
len = strlen(c->config_path) + 1 + strlen(c->name) + 1 + strlen(LXC_PARTIAL_FNAME) + 1;
path = must_realloc(NULL, len);
- ret = snprintf(path, len, "%s/%s/%s", c->config_path, c->name, LXC_PARTIAL_FNAME);
- if (ret < 0 || (size_t)ret >= len)
+ ret = strnprintf(path, len, "%s/%s/%s", c->config_path, c->name, LXC_PARTIAL_FNAME);
+ if (ret < 0)
return;
ret = unlink(path);
* characters. All that it means is that the proctitle will be
* ugly. Similarly, we also don't care if setproctitle() fails.
*/
- ret = snprintf(title, sizeof(title), "[lxc monitor] %s %s", c->config_path, c->name);
+ ret = strnprintf(title, sizeof(title), "[lxc monitor] %s %s", c->config_path, c->name);
if (ret > 0) {
ret = setproctitle(title);
if (ret < 0)
int w;
char pidstr[INTTYPE_TO_STRLEN(pid_t)];
- w = snprintf(pidstr, sizeof(pidstr), "%d", lxc_raw_getpid());
- if (w < 0 || (size_t)w >= sizeof(pidstr)) {
+ w = strnprintf(pidstr, sizeof(pidstr), "%d", lxc_raw_getpid());
+ if (w < 0) {
free_init_cmd(init_cmd);
lxc_put_handler(handler);
/* Create the standard expected container dir. */
static bool create_container_dir(struct lxc_container *c)
{
+ __do_free char *s = NULL;
int ret;
size_t len;
- char *s;
len = strlen(c->config_path) + strlen(c->name) + 2;
s = malloc(len);
if (!s)
return false;
- ret = snprintf(s, len, "%s/%s", c->config_path, c->name);
- if (ret < 0 || (size_t)ret >= len) {
- free(s);
+ ret = strnprintf(s, len, "%s/%s", c->config_path, c->name);
+ if (ret < 0)
return false;
- }
-
- ret = do_create_container_dir(s, c->lxc_conf);
- free(s);
- return ret == 0;
+ return do_create_container_dir(s, c->lxc_conf) == 0;
}
/* do_storage_create: thin wrapper around storage_create(). Like
const char *rpath = c->lxc_conf->rootfs.path;
len = strlen(rpath) + 1;
dest = must_realloc(NULL, len);
- ret = snprintf(dest, len, "%s", rpath);
+ ret = strnprintf(dest, len, "%s", rpath);
} else {
const char *lxcpath = do_lxcapi_get_config_path(c);
len = strlen(c->name) + 1 + strlen(lxcpath) + 1 + strlen(LXC_ROOTFS_DNAME) + 1;
dest = must_realloc(NULL, len);
- ret = snprintf(dest, len, "%s/%s/%s", lxcpath, c->name, LXC_ROOTFS_DNAME);
+ ret = strnprintf(dest, len, "%s/%s/%s", lxcpath, c->name, LXC_ROOTFS_DNAME);
}
- if (ret < 0 || (size_t)ret >= len)
+ if (ret < 0)
return NULL;
bdev = storage_create(dest, type, c->name, specs, c->lxc_conf);
if (!patharg)
_exit(EXIT_FAILURE);
- ret = snprintf(patharg, len, "--path=%s/%s", c->config_path, c->name);
- if (ret < 0 || ret >= len)
+ ret = strnprintf(patharg, len, "--path=%s/%s", c->config_path, c->name);
+ if (ret < 0)
_exit(EXIT_FAILURE);
newargv[1] = patharg;
if (!namearg)
_exit(EXIT_FAILURE);
- ret = snprintf(namearg, len, "--name=%s", c->name);
- if (ret < 0 || ret >= len)
+ ret = strnprintf(namearg, len, "--name=%s", c->name);
+ if (ret < 0)
_exit(EXIT_FAILURE);
newargv[2] = namearg;
if (!rootfsarg)
_exit(EXIT_FAILURE);
- ret = snprintf(rootfsarg, len, "--rootfs=%s", bdev->dest);
- if (ret < 0 || ret >= len)
+ ret = strnprintf(rootfsarg, len, "--rootfs=%s", bdev->dest);
+ if (ret < 0)
_exit(EXIT_FAILURE);
newargv[3] = rootfsarg;
if (!n2[n2args - 1])
_exit(EXIT_FAILURE);
- ret = snprintf(n2[n2args - 1], 200, "%c:%lu:%lu:%lu",
+ ret = strnprintf(n2[n2args - 1], 200, "%c:%lu:%lu:%lu",
map->idtype == ID_TYPE_UID ? 'u' : 'g',
map->nsid, map->hostid, map->range);
- if (ret < 0 || ret >= 200)
+ if (ret < 0)
_exit(EXIT_FAILURE);
}
_exit(EXIT_FAILURE);
}
- ret = snprintf(n2[n2args - 1], 200, "u:%d:%d:1",
+ ret = strnprintf(n2[n2args - 1], 200, "u:%d:%d:1",
hostuid_mapped, geteuid());
- if (ret < 0 || ret >= 200)
+ if (ret < 0)
_exit(EXIT_FAILURE);
}
_exit(EXIT_FAILURE);
}
- ret = snprintf(n2[n2args - 1], 200, "g:%d:%d:1",
+ ret = strnprintf(n2[n2args - 1], 200, "g:%d:%d:1",
hostgid_mapped, getegid());
- if (ret < 0 || ret >= 200)
+ if (ret < 0)
_exit(EXIT_FAILURE);
}
/* note n2[n2args-1] is NULL */
n2[n2args - 5] = "--mapped-uid";
- ret = snprintf(txtuid, 20, "%d", hostuid_mapped);
- if (ret < 0 || ret >= 20) {
+ ret = strnprintf(txtuid, 20, "%d", hostuid_mapped);
+ if (ret < 0) {
free(newargv);
free(n2);
_exit(EXIT_FAILURE);
n2[n2args - 4] = txtuid;
n2[n2args - 3] = "--mapped-gid";
- ret = snprintf(txtgid, 20, "%d", hostgid_mapped);
- if (ret < 0 || ret >= 20) {
+ ret = strnprintf(txtgid, 20, "%d", hostgid_mapped);
+ if (ret < 0) {
free(newargv);
free(n2);
_exit(EXIT_FAILURE);
if (container_disk_lock(c0))
return false;
- ret = snprintf(path, PATH_MAX, "%s/%s/lxc_snapshots", c0->config_path, c0->name);
- if (ret < 0 || ret > PATH_MAX)
+ ret = strnprintf(path, sizeof(path), "%s/%s/lxc_snapshots", c0->config_path, c0->name);
+ if (ret < 0)
goto out;
- ret = snprintf(newpath, PATH_MAX, "%s\n%s\n", c->config_path, c->name);
- if (ret < 0 || ret > PATH_MAX)
+ ret = strnprintf(newpath, sizeof(newpath), "%s\n%s\n", c->config_path, c->name);
+ if (ret < 0)
goto out;
/* If we find an lxc-snapshot file using the old format only listing the
char path[PATH_MAX];
int ret;
- ret = snprintf(path, PATH_MAX, "%s/%s/lxc_rdepends",
+ ret = strnprintf(path, sizeof(path), "%s/%s/lxc_rdepends",
c->config_path, c->name);
- if (ret < 0 || ret >= PATH_MAX) {
+ if (ret < 0) {
ERROR("Path name too long");
return;
}
int ret, v;
struct stat fbuf;
- ret = snprintf(path, PATH_MAX, "%s/%s/lxc_snapshots", c->config_path,
+ ret = strnprintf(path, sizeof(path), "%s/%s/lxc_snapshots", c->config_path,
c->name);
- if (ret < 0 || ret > PATH_MAX)
+ if (ret < 0)
return false;
/* If the file doesn't exist there are no snapshots. */
if (storage && (!strcmp(storage->type, "overlay") ||
!strcmp(storage->type, "overlayfs")) &&
(storage->flags & LXC_STORAGE_INTERNAL_OVERLAY_RESTORE)) {
- ret = snprintf(path, len, "%s/%s/%s", p1, c->name, LXC_CONFIG_FNAME);
- if (ret < 0 || (size_t)ret >= len)
+ ret = strnprintf(path, len, "%s/%s/%s", p1, c->name, LXC_CONFIG_FNAME);
+ if (ret < 0)
goto out;
if (am_guest_unpriv())
goto out;
}
- ret = snprintf(path, len, "%s/%s", p1, c->name);
- if (ret < 0 || (size_t)ret >= len)
+ ret = strnprintf(path, len, "%s/%s", p1, c->name);
+ if (ret < 0)
goto out;
if (am_guest_unpriv())
if (!newpath)
return false;
- ret = snprintf(newpath, len, "%s/%s/%s", c->config_path, c->name, LXC_CONFIG_FNAME);
- if (ret < 0 || ret >= len) {
+ ret = strnprintf(newpath, len, "%s/%s/%s", c->config_path, c->name, LXC_CONFIG_FNAME);
+ if (ret < 0) {
fprintf(stderr, "Error printing out config file name\n");
free(newpath);
return false;
len = strlen(oldc->config_path) + strlen(oldc->name) + 3;
cpath = must_realloc(NULL, len);
- ret = snprintf(cpath, len, "%s/%s/", oldc->config_path, oldc->name);
- if (ret < 0 || ret >= len)
+ ret = strnprintf(cpath, len, "%s/%s/", oldc->config_path, oldc->name);
+ if (ret < 0)
return -1;
for (i=0; i<NUM_LXC_HOOKS; i++) {
}
/* copy the script, and change the entry in confile */
- ret = snprintf(tmppath, PATH_MAX, "%s/%s/%s",
+ ret = strnprintf(tmppath, sizeof(tmppath), "%s/%s/%s",
c->config_path, c->name, fname+1);
- if (ret < 0 || ret >= PATH_MAX)
+ if (ret < 0)
return -1;
ret = copy_file(it->elem, tmppath);
if (!p)
return -1;
- ret = snprintf(newpath, PATH_MAX, "%s/%s%s",
+ ret = strnprintf(newpath, sizeof(newpath), "%s/%s%s",
c->config_path, c->name, p);
- if (ret < 0 || ret >= PATH_MAX) {
+ if (ret < 0) {
ERROR("error printing new path for %s", oldpath);
return -1;
}
char path0[PATH_MAX], path1[PATH_MAX];
int ret;
- ret = snprintf(path0, PATH_MAX, "%s/%s/lxc_rdepends", c0->config_path,
+ ret = strnprintf(path0, sizeof(path0), "%s/%s/lxc_rdepends", c0->config_path,
c0->name);
- if (ret < 0 || ret >= PATH_MAX) {
+ if (ret < 0) {
WARN("Error copying reverse dependencies");
return;
}
- ret = snprintf(path1, PATH_MAX, "%s/%s/lxc_rdepends", c->config_path,
+ ret = strnprintf(path1, sizeof(path1), "%s/%s/lxc_rdepends", c->config_path,
c->name);
- if (ret < 0 || ret >= PATH_MAX) {
+ if (ret < 0) {
WARN("Error copying reverse dependencies");
return;
}
int ret;
char path[PATH_MAX];
- ret = snprintf(path, sizeof(path), "%s/%s/lxc_rdepends", c->config_path, c->name);
- if (ret < 0 || ret >= sizeof(path))
+ ret = strnprintf(path, sizeof(path), "%s/%s/lxc_rdepends", c->config_path, c->name);
+ if (ret < 0)
return false;
f = fopen(path, "ae");
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)
+ ret = strnprintf(p0, l0, "%s/%s", c0->config_path, c0->name);
+ if (ret < 0)
return false;
- ret = snprintf(p1, l1, "%s/%s", c1->config_path, c1->name);
- if (ret < 0 || ret >= l1)
+ ret = strnprintf(p1, l1, "%s/%s", c1->config_path, c1->name);
+ if (ret < 0)
return false;
if (!is_btrfs_fs(p0) || !is_btrfs_fs(p1))
}
if (!(flags & LXC_CLONE_KEEPNAME)) {
- ret = snprintf(path, PATH_MAX, "%s/etc/hostname", bdev->dest);
+ ret = strnprintf(path, sizeof(path), "%s/etc/hostname", bdev->dest);
storage_put(bdev);
- if (ret < 0 || ret >= PATH_MAX)
+ if (ret < 0)
return -1;
if (!file_exists(path))
if (!lxcpath)
lxcpath = do_lxcapi_get_config_path(c);
- ret = snprintf(newpath, PATH_MAX, "%s/%s/%s", lxcpath, newname, LXC_CONFIG_FNAME);
- if (ret < 0 || ret >= PATH_MAX) {
+ ret = strnprintf(newpath, sizeof(newpath), "%s/%s/%s", lxcpath, newname, LXC_CONFIG_FNAME);
+ if (ret < 0) {
SYSERROR("clone: failed making config pathname");
goto out;
}
saved_unexp_conf = NULL;
c->lxc_conf->unexpanded_len = saved_unexp_len;
- ret = snprintf(newpath, PATH_MAX, "%s/%s/%s", lxcpath, newname, LXC_ROOTFS_DNAME);
- if (ret < 0 || ret >= PATH_MAX) {
+ ret = strnprintf(newpath, sizeof(newpath), "%s/%s/%s", lxcpath, newname, LXC_ROOTFS_DNAME);
+ if (ret < 0) {
SYSERROR("clone: failed making rootfs pathname");
goto out;
}
* If the old style snapshot path exists, use it
* /var/lib/lxc -> /var/lib/lxcsnaps
*/
- ret = snprintf(snappath, PATH_MAX, "%ssnaps", c->config_path);
- if (ret < 0 || ret >= PATH_MAX)
+ ret = strnprintf(snappath, PATH_MAX, "%ssnaps", c->config_path);
+ if (ret < 0)
return false;
if (dir_exists(snappath)) {
- ret = snprintf(snappath, PATH_MAX, "%ssnaps/%s", c->config_path, c->name);
- if (ret < 0 || ret >= PATH_MAX)
+ ret = strnprintf(snappath, PATH_MAX, "%ssnaps/%s", c->config_path, c->name);
+ if (ret < 0)
return false;
return true;
* Use the new style path
* /var/lib/lxc -> /var/lib/lxc + c->name + /snaps + \0
*/
- ret = snprintf(snappath, PATH_MAX, "%s/%s/snaps", c->config_path, c->name);
- if (ret < 0 || ret >= PATH_MAX)
+ ret = strnprintf(snappath, PATH_MAX, "%s/%s/snaps", c->config_path, c->name);
+ if (ret < 0)
return false;
return true;
return -1;
}
- ret = snprintf(newname, 20, "snap%d", i);
- if (ret < 0 || ret >= 20)
+ ret = strnprintf(newname, 20, "snap%d", i);
+ if (ret < 0)
return -1;
/*
len = strlen(snappath) + 1 + strlen(newname) + 1 + strlen(LXC_TIMESTAMP_FNAME) + 1;
dfnam = must_realloc(NULL, len);
- snprintf(dfnam, len, "%s/%s/%s", snappath, newname, LXC_TIMESTAMP_FNAME);
+ ret = strnprintf(dfnam, len, "%s/%s/%s", snappath, newname, LXC_TIMESTAMP_FNAME);
+ if (ret < 0)
+ return -1;
f = fopen(dfnam, "we");
if (!f) {
ERROR("Failed to open %s", dfnam);
len = strlen(snappath) + 1 + strlen(newname) + 1 + strlen(LXC_COMMENT_FNAME) + 1;
path = must_realloc(NULL, len);
- snprintf(path, len, "%s/%s/%s", snappath, newname, LXC_COMMENT_FNAME);
+ ret = strnprintf(path, len, "%s/%s/%s", snappath, newname, LXC_COMMENT_FNAME);
+ if (ret < 0)
+ return -1;
return copy_file(commentfile, path) < 0 ? -1 : i;
}
free(s->lxcpath);
}
-static char *get_snapcomment_path(char* snappath, char *name)
+static char *get_snapcomment_path(char *snappath, char *name)
{
+ __do_free char *s = NULL;
/* $snappath/$name/comment */
int ret, len = strlen(snappath) + strlen(name) + 10;
- char *s = malloc(len);
- if (s) {
- ret = snprintf(s, len, "%s/%s/comment", snappath, name);
- if (ret < 0 || ret >= len) {
- free(s);
- s = NULL;
- }
- }
+ s = malloc(len);
+ if (!s)
+ return NULL;
- return s;
+ ret = strnprintf(s, len, "%s/%s/comment", snappath, name);
+ if (ret < 0)
+ return NULL;
+
+ return move_ptr(s);
}
static char *get_timestamp(char* snappath, char *name)
char path[PATH_MAX];
int ret, len;
- ret = snprintf(path, PATH_MAX, "%s/%s/ts", snappath, name);
- if (ret < 0 || ret >= PATH_MAX)
+ ret = strnprintf(path, sizeof(path), "%s/%s/ts", snappath, name);
+ if (ret < 0)
return NULL;
fin = fopen(path, "re");
if (!strcmp(direntp->d_name, ".."))
continue;
- ret = snprintf(path2, PATH_MAX, "%s/%s/%s", snappath, direntp->d_name, LXC_CONFIG_FNAME);
- if (ret < 0 || ret >= PATH_MAX) {
+ ret = strnprintf(path2, sizeof(path2), "%s/%s/%s", snappath, direntp->d_name, LXC_CONFIG_FNAME);
+ if (ret < 0) {
ERROR("pathname too long");
goto out_free;
}
}
/* prepare the path */
- ret = snprintf(chrootpath, PATH_MAX, "/proc/%d/root", init_pid);
- if (ret < 0 || ret >= PATH_MAX)
+ ret = strnprintf(chrootpath, sizeof(chrootpath), "/proc/%d/root", init_pid);
+ if (ret < 0)
return false;
ret = chroot(chrootpath);
/* continue if path is character device or block device */
if (S_ISCHR(st.st_mode))
- ret = snprintf(value, LXC_MAX_BUFFER, "c %d:%d rwm", major(st.st_rdev), minor(st.st_rdev));
+ ret = strnprintf(value, sizeof(value), "c %d:%d rwm", major(st.st_rdev), minor(st.st_rdev));
else if (S_ISBLK(st.st_mode))
- ret = snprintf(value, LXC_MAX_BUFFER, "b %d:%d rwm", major(st.st_rdev), minor(st.st_rdev));
+ ret = strnprintf(value, sizeof(value), "b %d:%d rwm", major(st.st_rdev), minor(st.st_rdev));
else
return false;
-
- /* check snprintf return code */
- if (ret < 0 || ret >= LXC_MAX_BUFFER)
+ if (ret < 0)
return false;
init_pid = do_lxcapi_init_pid(c);
return -EINVAL;
}
- ret = snprintf(template, sizeof(template), "%s/.lxcmount_XXXXXX", c->lxc_conf->shmount.path_host);
- if (ret < 0 || (size_t)ret >= sizeof(template)) {
+ ret = strnprintf(template, sizeof(template), "%s/.lxcmount_XXXXXX", c->lxc_conf->shmount.path_host);
+ if (ret < 0) {
SYSERROR("Error writing shmounts tempdir name");
goto out;
}
if (!suff)
goto cleanup_target_in_child;
- ret = snprintf(path, sizeof(path), "%s%s", c->lxc_conf->shmount.path_cont, suff);
- if (ret < 0 || (size_t)ret >= sizeof(path)) {
+ ret = strnprintf(path, sizeof(path), "%s%s", c->lxc_conf->shmount.path_cont, suff);
+ if (ret < 0) {
SYSERROR("Error writing container mountpoint name");
goto cleanup_target_in_child;
}