Skip to content

Commit

Permalink
Fix ztest vdev file paths.
Browse files Browse the repository at this point in the history
Currently, in several instances (but not all), ztest generates vdev
file paths using a statement similar to this:

    snprintf(path, sizeof (path), ztest_dev_template, ...);

This worked fine until 40b84e7, which
changed path to be a pointer to the heap instead of an array allocated
on the stack. Before this change, sizeof(path) would return the size of
the array; now, it returns the size of the pointer instead.

As a result, the aforementioned sprintf statement uses the wrong size
and truncates the vdev file path to the first 4 or 8 bytes (depending
on the architecture). Typically, with default settings, the file path
will become "/tmp/zt" instead of "/test/ztest.XXX".

This issue only exists in ztest_vdev_attach_detach() and
ztest_fault_inject(), which explains why ztest doesn't fail right away.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #989
  • Loading branch information
dechamps authored and behlendorf committed Oct 3, 2012
1 parent 274091c commit 6aec1cd
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions cmd/ztest/ztest.c
Original file line number Diff line number Diff line change
Expand Up @@ -2567,7 +2567,7 @@ ztest_vdev_attach_detach(ztest_ds_t *zd, uint64_t id)
newvd_is_spare = B_TRUE;
(void) strcpy(newpath, newvd->vdev_path);
} else {
(void) snprintf(newpath, sizeof (newpath), ztest_dev_template,
(void) snprintf(newpath, MAXPATHLEN, ztest_dev_template,
zopt_dir, zopt_pool, top * leaves + leaf);
if (ztest_random(2) == 0)
newpath[strlen(newpath) - 1] = 'b';
Expand Down Expand Up @@ -4633,9 +4633,9 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id)
* write failures and random online/offline activity on leaf 0,
* and we'll write random garbage to the randomly chosen leaf.
*/
(void) snprintf(path0, sizeof (path0), ztest_dev_template,
(void) snprintf(path0, MAXPATHLEN, ztest_dev_template,
zopt_dir, zopt_pool, top * leaves + zs->zs_splits);
(void) snprintf(pathrand, sizeof (pathrand), ztest_dev_template,
(void) snprintf(pathrand, MAXPATHLEN, ztest_dev_template,
zopt_dir, zopt_pool, top * leaves + leaf);

vd0 = vdev_lookup_by_path(spa->spa_root_vdev, path0);
Expand Down Expand Up @@ -4999,7 +4999,7 @@ ztest_run_zdb(char *pool)

fp = popen(zdb, "r");

while (fgets(zbuf, sizeof (zbuf), fp) != NULL)
while (fgets(zbuf, 1024, fp) != NULL)
if (zopt_verbose >= 3)
(void) printf("%s", zbuf);

Expand Down

0 comments on commit 6aec1cd

Please sign in to comment.