]> git.proxmox.com Git - mirror_zfs-debian.git/blobdiff - lib/libzfs/libzfs_iter.c
New upstream version 0.7.2
[mirror_zfs-debian.git] / lib / libzfs / libzfs_iter.c
index 5c1cf966a543fc52f64538db1f9f6bbae21084bb..57ebdd89d1b8e562cc092c85248ef41305ae3a0d 100644 (file)
@@ -21,7 +21,7 @@
 
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2013 by Delphix. All rights reserved.
+ * Copyright (c) 2013, 2015 by Delphix. All rights reserved.
  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
  */
 
@@ -197,15 +197,18 @@ zfs_iter_bookmarks(zfs_handle_t *zhp, zfs_iter_f func, void *data)
 
        for (pair = nvlist_next_nvpair(bmarks, NULL);
            pair != NULL; pair = nvlist_next_nvpair(bmarks, pair)) {
-               char name[ZFS_MAXNAMELEN];
+               char name[ZFS_MAX_DATASET_NAME_LEN];
                char *bmark_name;
                nvlist_t *bmark_props;
 
                bmark_name = nvpair_name(pair);
                bmark_props = fnvpair_value_nvlist(pair);
 
-               (void) snprintf(name, sizeof (name), "%s#%s", zhp->zfs_name,
-                   bmark_name);
+               if (snprintf(name, sizeof (name), "%s#%s", zhp->zfs_name,
+                   bmark_name) >= sizeof (name)) {
+                       err = EINVAL;
+                       goto out;
+               }
 
                nzhp = make_bookmark_handle(zhp, name, bmark_props);
                if (nzhp == NULL)
@@ -272,12 +275,7 @@ zfs_snapshot_compare(const void *larg, const void *rarg)
        lcreate = zfs_prop_get_int(l, ZFS_PROP_CREATETXG);
        rcreate = zfs_prop_get_int(r, ZFS_PROP_CREATETXG);
 
-       if (lcreate < rcreate)
-               return (-1);
-       else if (lcreate > rcreate)
-               return (+1);
-       else
-               return (0);
+       return (AVL_CMP(lcreate, rcreate));
 }
 
 int
@@ -314,18 +312,20 @@ typedef struct {
 } snapspec_arg_t;
 
 static int
-snapspec_cb(zfs_handle_t *zhp, void *arg) {
+snapspec_cb(zfs_handle_t *zhp, void *arg)
+{
        snapspec_arg_t *ssa = arg;
-       char *shortsnapname;
+       const char *shortsnapname;
        int err = 0;
 
        if (ssa->ssa_seenlast)
                return (0);
-       shortsnapname = zfs_strdup(zhp->zfs_hdl,
-           strchr(zfs_get_name(zhp), '@') + 1);
 
+       shortsnapname = strchr(zfs_get_name(zhp), '@') + 1;
        if (!ssa->ssa_seenfirst && strcmp(shortsnapname, ssa->ssa_first) == 0)
                ssa->ssa_seenfirst = B_TRUE;
+       if (strcmp(shortsnapname, ssa->ssa_last) == 0)
+               ssa->ssa_seenlast = B_TRUE;
 
        if (ssa->ssa_seenfirst) {
                err = ssa->ssa_func(zhp, ssa->ssa_arg);
@@ -333,10 +333,6 @@ snapspec_cb(zfs_handle_t *zhp, void *arg) {
                zfs_close(zhp);
        }
 
-       if (strcmp(shortsnapname, ssa->ssa_last) == 0)
-               ssa->ssa_seenlast = B_TRUE;
-       free(shortsnapname);
-
        return (err);
 }
 
@@ -384,7 +380,7 @@ zfs_iter_snapspec(zfs_handle_t *fs_zhp, const char *spec_orig,
                         * exists.
                         */
                        if (ssa.ssa_last[0] != '\0') {
-                               char snapname[ZFS_MAXNAMELEN];
+                               char snapname[ZFS_MAX_DATASET_NAME_LEN];
                                (void) snprintf(snapname, sizeof (snapname),
                                    "%s@%s", zfs_get_name(fs_zhp),
                                    ssa.ssa_last);
@@ -404,7 +400,7 @@ zfs_iter_snapspec(zfs_handle_t *fs_zhp, const char *spec_orig,
                                ret = ENOENT;
                        }
                } else {
-                       char snapname[ZFS_MAXNAMELEN];
+                       char snapname[ZFS_MAX_DATASET_NAME_LEN];
                        zfs_handle_t *snap_zhp;
                        (void) snprintf(snapname, sizeof (snapname), "%s@%s",
                            zfs_get_name(fs_zhp), comma_separated);