aboutsummaryrefslogtreecommitdiff
path: root/cddl/contrib/opensolaris/cmd/ztest
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2016-09-01 15:08:27 +0000
committerAlexander Motin <mav@FreeBSD.org>2016-09-01 15:08:27 +0000
commit41b9077ef675c307fd1112bcea26aa3aeba1bb91 (patch)
treef27c52b6e8e48c5fa24f1c37b22bc3f2cbef83b7 /cddl/contrib/opensolaris/cmd/ztest
parent9862cef0409368e9bcba5a44f8ba2ad6a2e1a4b5 (diff)
parentf728d00c4d5c4953ad98710a09778247875dccb4 (diff)
downloadsrc-41b9077ef675c307fd1112bcea26aa3aeba1bb91.tar.gz
src-41b9077ef675c307fd1112bcea26aa3aeba1bb91.zip
MFV r302660: 6314 buffer overflow in dsl_dataset_name
illumos/illumos-gate@9adfa60d484ce2435f5af77cc99dcd4e692b6660 https://github.com/illumos/illumos-gate/commit/9adfa60d484ce2435f5af77cc99dcd4e6 92b6660 https://www.illumos.org/issues/6314 Callers of dsl_dataset_name pass a buffer of size ZFS_MAXNAMELEN, but dsl_dataset_name copies the datasets' name PLUS the snapshot name to it, resulting in a max of 2 * ZFS_MAXNAMELEN + '@'. Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Prakash Surya <prakash.surya@delphix.com> Reviewed by: Igor Kozhukhov <ikozhukhov@gmail.com> Approved by: Dan McDonald <danmcd@omniti.com> Author: Matthew Ahrens <mahrens@delphix.com>
Notes
Notes: svn path=/head/; revision=305209
Diffstat (limited to 'cddl/contrib/opensolaris/cmd/ztest')
-rw-r--r--cddl/contrib/opensolaris/cmd/ztest/ztest.c84
1 files changed, 47 insertions, 37 deletions
diff --git a/cddl/contrib/opensolaris/cmd/ztest/ztest.c b/cddl/contrib/opensolaris/cmd/ztest/ztest.c
index 211348cf7426..f655c3d3c9c6 100644
--- a/cddl/contrib/opensolaris/cmd/ztest/ztest.c
+++ b/cddl/contrib/opensolaris/cmd/ztest/ztest.c
@@ -141,8 +141,8 @@ typedef struct ztest_shared_hdr {
static ztest_shared_hdr_t *ztest_shared_hdr;
typedef struct ztest_shared_opts {
- char zo_pool[MAXNAMELEN];
- char zo_dir[MAXNAMELEN];
+ char zo_pool[ZFS_MAX_DATASET_NAME_LEN];
+ char zo_dir[ZFS_MAX_DATASET_NAME_LEN];
char zo_alt_ztest[MAXNAMELEN];
char zo_alt_libpath[MAXNAMELEN];
uint64_t zo_vdevs;
@@ -268,7 +268,7 @@ typedef struct ztest_od {
uint64_t od_crblocksize;
uint64_t od_gen;
uint64_t od_crgen;
- char od_name[MAXNAMELEN];
+ char od_name[ZFS_MAX_DATASET_NAME_LEN];
} ztest_od_t;
/*
@@ -280,7 +280,7 @@ typedef struct ztest_ds {
rwlock_t zd_zilog_lock;
zilog_t *zd_zilog;
ztest_od_t *zd_od; /* debugging aid */
- char zd_name[MAXNAMELEN];
+ char zd_name[ZFS_MAX_DATASET_NAME_LEN];
mutex_t zd_dirobj_lock;
rll_t zd_object_lock[ZTEST_OBJECT_LOCKS];
rll_t zd_range_lock[ZTEST_RANGE_LOCKS];
@@ -3227,7 +3227,7 @@ ztest_objset_destroy_cb(const char *name, void *arg)
static boolean_t
ztest_snapshot_create(char *osname, uint64_t id)
{
- char snapname[MAXNAMELEN];
+ char snapname[ZFS_MAX_DATASET_NAME_LEN];
int error;
(void) snprintf(snapname, sizeof (snapname), "%llu", (u_longlong_t)id);
@@ -3247,10 +3247,10 @@ ztest_snapshot_create(char *osname, uint64_t id)
static boolean_t
ztest_snapshot_destroy(char *osname, uint64_t id)
{
- char snapname[MAXNAMELEN];
+ char snapname[ZFS_MAX_DATASET_NAME_LEN];
int error;
- (void) snprintf(snapname, MAXNAMELEN, "%s@%llu", osname,
+ (void) snprintf(snapname, sizeof (snapname), "%s@%llu", osname,
(u_longlong_t)id);
error = dsl_destroy_snapshot(snapname, B_FALSE);
@@ -3267,12 +3267,12 @@ ztest_dmu_objset_create_destroy(ztest_ds_t *zd, uint64_t id)
int iters;
int error;
objset_t *os, *os2;
- char name[MAXNAMELEN];
+ char name[ZFS_MAX_DATASET_NAME_LEN];
zilog_t *zilog;
(void) rw_rdlock(&ztest_name_lock);
- (void) snprintf(name, MAXNAMELEN, "%s/temp_%llu",
+ (void) snprintf(name, sizeof (name), "%s/temp_%llu",
ztest_opts.zo_pool, (u_longlong_t)id);
/*
@@ -3378,18 +3378,23 @@ ztest_dmu_snapshot_create_destroy(ztest_ds_t *zd, uint64_t id)
void
ztest_dsl_dataset_cleanup(char *osname, uint64_t id)
{
- char snap1name[MAXNAMELEN];
- char clone1name[MAXNAMELEN];
- char snap2name[MAXNAMELEN];
- char clone2name[MAXNAMELEN];
- char snap3name[MAXNAMELEN];
+ char snap1name[ZFS_MAX_DATASET_NAME_LEN];
+ char clone1name[ZFS_MAX_DATASET_NAME_LEN];
+ char snap2name[ZFS_MAX_DATASET_NAME_LEN];
+ char clone2name[ZFS_MAX_DATASET_NAME_LEN];
+ char snap3name[ZFS_MAX_DATASET_NAME_LEN];
int error;
- (void) snprintf(snap1name, MAXNAMELEN, "%s@s1_%llu", osname, id);
- (void) snprintf(clone1name, MAXNAMELEN, "%s/c1_%llu", osname, id);
- (void) snprintf(snap2name, MAXNAMELEN, "%s@s2_%llu", clone1name, id);
- (void) snprintf(clone2name, MAXNAMELEN, "%s/c2_%llu", osname, id);
- (void) snprintf(snap3name, MAXNAMELEN, "%s@s3_%llu", clone1name, id);
+ (void) snprintf(snap1name, sizeof (snap1name),
+ "%s@s1_%llu", osname, id);
+ (void) snprintf(clone1name, sizeof (clone1name),
+ "%s/c1_%llu", osname, id);
+ (void) snprintf(snap2name, sizeof (snap2name),
+ "%s@s2_%llu", clone1name, id);
+ (void) snprintf(clone2name, sizeof (clone2name),
+ "%s/c2_%llu", osname, id);
+ (void) snprintf(snap3name, sizeof (snap3name),
+ "%s@s3_%llu", clone1name, id);
error = dsl_destroy_head(clone2name);
if (error && error != ENOENT)
@@ -3415,11 +3420,11 @@ void
ztest_dsl_dataset_promote_busy(ztest_ds_t *zd, uint64_t id)
{
objset_t *os;
- char snap1name[MAXNAMELEN];
- char clone1name[MAXNAMELEN];
- char snap2name[MAXNAMELEN];
- char clone2name[MAXNAMELEN];
- char snap3name[MAXNAMELEN];
+ char snap1name[ZFS_MAX_DATASET_NAME_LEN];
+ char clone1name[ZFS_MAX_DATASET_NAME_LEN];
+ char snap2name[ZFS_MAX_DATASET_NAME_LEN];
+ char clone2name[ZFS_MAX_DATASET_NAME_LEN];
+ char snap3name[ZFS_MAX_DATASET_NAME_LEN];
char *osname = zd->zd_name;
int error;
@@ -3427,11 +3432,16 @@ ztest_dsl_dataset_promote_busy(ztest_ds_t *zd, uint64_t id)
ztest_dsl_dataset_cleanup(osname, id);
- (void) snprintf(snap1name, MAXNAMELEN, "%s@s1_%llu", osname, id);
- (void) snprintf(clone1name, MAXNAMELEN, "%s/c1_%llu", osname, id);
- (void) snprintf(snap2name, MAXNAMELEN, "%s@s2_%llu", clone1name, id);
- (void) snprintf(clone2name, MAXNAMELEN, "%s/c2_%llu", osname, id);
- (void) snprintf(snap3name, MAXNAMELEN, "%s@s3_%llu", clone1name, id);
+ (void) snprintf(snap1name, sizeof (snap1name),
+ "%s@s1_%llu", osname, id);
+ (void) snprintf(clone1name, sizeof (clone1name),
+ "%s/c1_%llu", osname, id);
+ (void) snprintf(snap2name, sizeof (snap2name),
+ "%s@s2_%llu", clone1name, id);
+ (void) snprintf(clone2name, sizeof (clone2name),
+ "%s/c2_%llu", osname, id);
+ (void) snprintf(snap3name, sizeof (snap3name),
+ "%s@s3_%llu", clone1name, id);
error = dmu_objset_snapshot_one(osname, strchr(snap1name, '@') + 1);
if (error && error != EEXIST) {
@@ -4249,7 +4259,7 @@ ztest_fzap(ztest_ds_t *zd, uint64_t id)
* 2050 entries we should see ptrtbl growth and leaf-block split.
*/
for (int i = 0; i < 2050; i++) {
- char name[MAXNAMELEN];
+ char name[ZFS_MAX_DATASET_NAME_LEN];
uint64_t value = i;
dmu_tx_t *tx;
int error;
@@ -4654,7 +4664,7 @@ ztest_dmu_snapshot_hold(ztest_ds_t *zd, uint64_t id)
char fullname[100];
char clonename[100];
char tag[100];
- char osname[MAXNAMELEN];
+ char osname[ZFS_MAX_DATASET_NAME_LEN];
nvlist_t *holds;
(void) rw_rdlock(&ztest_name_lock);
@@ -5450,13 +5460,13 @@ ztest_thread(void *arg)
static void
ztest_dataset_name(char *dsname, char *pool, int d)
{
- (void) snprintf(dsname, MAXNAMELEN, "%s/ds_%d", pool, d);
+ (void) snprintf(dsname, ZFS_MAX_DATASET_NAME_LEN, "%s/ds_%d", pool, d);
}
static void
ztest_dataset_destroy(int d)
{
- char name[MAXNAMELEN];
+ char name[ZFS_MAX_DATASET_NAME_LEN];
ztest_dataset_name(name, ztest_opts.zo_pool, d);
@@ -5505,7 +5515,7 @@ ztest_dataset_open(int d)
uint64_t committed_seq = ZTEST_GET_SHARED_DS(d)->zd_seq;
objset_t *os;
zilog_t *zilog;
- char name[MAXNAMELEN];
+ char name[ZFS_MAX_DATASET_NAME_LEN];
int error;
ztest_dataset_name(name, ztest_opts.zo_pool, d);
@@ -5728,8 +5738,8 @@ ztest_run(ztest_shared_t *zs)
* different name.
*/
if (ztest_random(2) == 0) {
- char name[MAXNAMELEN];
- (void) snprintf(name, MAXNAMELEN, "%s_import",
+ char name[ZFS_MAX_DATASET_NAME_LEN];
+ (void) snprintf(name, sizeof (name), "%s_import",
ztest_opts.zo_pool);
ztest_spa_import_export(ztest_opts.zo_pool, name);
ztest_spa_import_export(name, ztest_opts.zo_pool);
@@ -6297,7 +6307,7 @@ main(int argc, char **argv)
if (spa_open(ztest_opts.zo_pool, &spa, FTAG) == 0) {
spa_close(spa, FTAG);
} else {
- char tmpname[MAXNAMELEN];
+ char tmpname[ZFS_MAX_DATASET_NAME_LEN];
kernel_fini();
kernel_init(FREAD | FWRITE);
(void) snprintf(tmpname, sizeof (tmpname), "%s_tmp",