Author: kevans
Date: Thu Aug 16 17:56:03 2018
New Revision: 337915
URL: https://svnweb.freebsd.org/changeset/base/337915

Log:
  libbe(3)/bectl(8): Hit rewind on a bunch of off-by-ones
  
  While here, use sizeof() in some places that it makes sense to reduce room
  for error and prefer strlcpy to strncpy

Modified:
  head/lib/libbe/be.c
  head/lib/libbe/be_access.c
  head/lib/libbe/be_impl.h
  head/sbin/bectl/bectl_jail.c

Modified: head/lib/libbe/be.c
==============================================================================
--- head/lib/libbe/be.c Thu Aug 16 16:30:23 2018        (r337914)
+++ head/lib/libbe/be.c Thu Aug 16 17:56:03 2018        (r337915)
@@ -66,7 +66,7 @@ be_locate_rootfs(zfs_handle_t *chkds, void *data)
 
        mntpoint = NULL;
        if (zfs_is_mounted(chkds, &mntpoint) && strcmp(mntpoint, "/") == 0) {
-               strlcpy(lbh->rootfs, zfs_get_name(chkds), BE_MAXPATHLEN + 1);
+               strlcpy(lbh->rootfs, zfs_get_name(chkds), sizeof(lbh->rootfs));
                free(mntpoint);
                return (1);
        } else if(mntpoint != NULL)
@@ -118,13 +118,14 @@ libbe_init(void)
                goto err;
 
        /* Obtain path to boot environment root */
-       if ((kenv(KENV_GET, "zfs_be_root", lbh->root, BE_MAXPATHLEN)) == -1)
+       if ((kenv(KENV_GET, "zfs_be_root", lbh->root,
+           sizeof(lbh->root))) == -1)
                goto err;
 
        /* Remove leading 'zfs:' if present, otherwise use value as-is */
        if (strcmp(lbh->root, "zfs:") == 0)
                strlcpy(lbh->root, strchr(lbh->root, ':') + sizeof(char),
-                   BE_MAXPATHLEN + 1);
+                   sizeof(lbh->root));
 
        if ((pos = strchr(lbh->root, '/')) == NULL)
                goto err;
@@ -134,13 +135,12 @@ libbe_init(void)
        if (poolname == NULL)
                goto err;
 
-       strncpy(poolname, lbh->root, pnamelen);
-       poolname[pnamelen] = '\0';
+       strlcpy(poolname, lbh->root, pnamelen + 1);
        if ((lbh->active_phandle = zpool_open(lbh->lzh, poolname)) == NULL)
                goto err;
 
        if (zpool_get_prop(lbh->active_phandle, ZPOOL_PROP_BOOTFS, lbh->bootfs,
-           BE_MAXPATHLEN, NULL, true) != 0)
+           sizeof(lbh->bootfs), NULL, true) != 0)
                goto err;
 
        /* Obtain path to boot environment rootfs (currently booted) */
@@ -282,7 +282,7 @@ be_snapshot(libbe_handle_t *lbh, const char *source, c
        } else {
                time(&rawtime);
                len = strlen(buf);
-               strftime(buf + len, BE_MAXPATHLEN - len,
+               strftime(buf + len, sizeof(buf) - len,
                    "@%F-%T", localtime(&rawtime));
                if (result != NULL)
                        strcpy(result, strrchr(buf, '/') + 1);
@@ -499,7 +499,7 @@ int
 be_validate_snap(libbe_handle_t *lbh, const char *snap_name)
 {
        zfs_handle_t *zfs_hdl;
-       char buf[BE_MAXPATHLEN + 1];
+       char buf[BE_MAXPATHLEN];
        char *delim_pos;
        int err = BE_ERR_SUCCESS;
 
@@ -510,7 +510,7 @@ be_validate_snap(libbe_handle_t *lbh, const char *snap
            ZFS_TYPE_SNAPSHOT))
                return (BE_ERR_NOENT);
 
-       strlcpy(buf, snap_name, BE_MAXPATHLEN + 1);
+       strlcpy(buf, snap_name, sizeof(buf));
 
        /* Find the base filesystem of the snapshot */
        if ((delim_pos = strchr(buf, '@')) == NULL)
@@ -521,11 +521,11 @@ be_validate_snap(libbe_handle_t *lbh, const char *snap
            zfs_open(lbh->lzh, buf, ZFS_TYPE_DATASET)) == NULL)
                return (BE_ERR_NOORIGIN);
 
-       if ((err = zfs_prop_get(zfs_hdl, ZFS_PROP_MOUNTPOINT, buf, 
BE_MAXPATHLEN,
-           NULL, NULL, 0, 1)) != 0)
+       if ((err = zfs_prop_get(zfs_hdl, ZFS_PROP_MOUNTPOINT, buf,
+           sizeof(buf), NULL, NULL, 0, 1)) != 0)
                err = BE_ERR_INVORIGIN;
 
-       if ((err != 0) && (strncmp(buf, "/", BE_MAXPATHLEN) != 0))
+       if ((err != 0) && (strncmp(buf, "/", sizeof(buf)) != 0))
                err = BE_ERR_INVORIGIN;
 
        zfs_close(zfs_hdl);
@@ -558,7 +558,7 @@ be_root_concat(libbe_handle_t *lbh, const char *name, 
                if (name_len >= BE_MAXPATHLEN)
                        return (BE_ERR_PATHLEN);
 
-               strncpy(result, name, BE_MAXPATHLEN);
+               strlcpy(result, name, BE_MAXPATHLEN);
                return (BE_ERR_SUCCESS);
        } else if (name_len + root_len + 1 < BE_MAXPATHLEN) {
                snprintf(result, BE_MAXPATHLEN, "%s/%s", lbh->root,
@@ -690,8 +690,7 @@ be_import(libbe_handle_t *lbh, const char *bootenv, in
 
        time(&rawtime);
        len = strlen(buf);
-       strftime(buf + len, BE_MAXPATHLEN - len,
-           "@%F-%T", localtime(&rawtime));
+       strftime(buf + len, sizeof(buf) - len, "@%F-%T", localtime(&rawtime));
 
        if ((err = lzc_receive(buf, NULL, NULL, false, fd)) != 0) {
                switch (err) {

Modified: head/lib/libbe/be_access.c
==============================================================================
--- head/lib/libbe/be_access.c  Thu Aug 16 16:30:23 2018        (r337914)
+++ head/lib/libbe/be_access.c  Thu Aug 16 17:56:03 2018        (r337915)
@@ -64,12 +64,12 @@ be_mountcheck_cb(zfs_handle_t *zfs_hdl, void *data)
 int
 be_mounted_at(libbe_handle_t *lbh, const char *path, nvlist_t *details)
 {
-       char be[BE_MAXPATHLEN + 1];
+       char be[BE_MAXPATHLEN];
        zfs_handle_t *root_hdl;
        struct be_mountcheck_info info;
        prop_data_t propinfo;
 
-       bzero(&be, BE_MAXPATHLEN + 1);
+       bzero(&be, BE_MAXPATHLEN);
        if ((root_hdl = zfs_open(lbh->lzh, lbh->root,
            ZFS_TYPE_FILESYSTEM)) == NULL)
                return (BE_ERR_ZFSOPEN);

Modified: head/lib/libbe/be_impl.h
==============================================================================
--- head/lib/libbe/be_impl.h    Thu Aug 16 16:30:23 2018        (r337914)
+++ head/lib/libbe/be_impl.h    Thu Aug 16 17:56:03 2018        (r337915)
@@ -38,9 +38,9 @@
 struct libbe_handle {
        libzfs_handle_t *lzh;
        zpool_handle_t *active_phandle;
-       char root[BE_MAXPATHLEN + 1];
-       char rootfs[BE_MAXPATHLEN + 1];
-       char bootfs[BE_MAXPATHLEN + 1];
+       char root[BE_MAXPATHLEN];
+       char rootfs[BE_MAXPATHLEN];
+       char bootfs[BE_MAXPATHLEN];
        be_error_t error;
        bool print_on_err;
 };

Modified: head/sbin/bectl/bectl_jail.c
==============================================================================
--- head/sbin/bectl/bectl_jail.c        Thu Aug 16 16:30:23 2018        
(r337914)
+++ head/sbin/bectl/bectl_jail.c        Thu Aug 16 17:56:03 2018        
(r337915)
@@ -57,7 +57,7 @@ static int bectl_locate_jail(const char *ident);
 static struct jailparam *jp;
 static int jpcnt;
 static int jpused;
-static char mnt_loc[BE_MAXPATHLEN + 1];
+static char mnt_loc[BE_MAXPATHLEN];
 
 static void
 jailparam_grow(void)
@@ -147,7 +147,7 @@ jailparam_addarg(char *arg)
 
        *val++ = '\0';
        if (strcmp(name, "path") == 0) {
-               if (strlen(val) > BE_MAXPATHLEN) {
+               if (strlen(val) >= BE_MAXPATHLEN) {
                        fprintf(stderr,
                            "bectl jail: skipping too long path assignment '%s' 
(max length = %d)\n",
                            val, BE_MAXPATHLEN);
@@ -283,7 +283,7 @@ bectl_cmd_jail(int argc, char *argv[])
 static int
 bectl_search_jail_paths(const char *mnt)
 {
-       char jailpath[MAXPATHLEN + 1];
+       char jailpath[MAXPATHLEN];
        int jid;
 
        jid = 0;
@@ -337,7 +337,7 @@ bectl_locate_jail(const char *ident)
 int
 bectl_cmd_unjail(int argc, char *argv[])
 {
-       char path[MAXPATHLEN + 1];
+       char path[MAXPATHLEN];
        char *cmd, *name, *target;
        int jid;
 
@@ -358,7 +358,7 @@ bectl_cmd_unjail(int argc, char *argv[])
                return (1);
        }
 
-       bzero(&path, MAXPATHLEN + 1);
+       bzero(&path, MAXPATHLEN);
        name = jail_getname(jid);
        if (jail_getv(0, "name", name, "path", path, NULL) != jid) {
                free(name);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to