9512 zfs remap poolname@snapname coredumps
Only filesystems and volumes are valid "zfs remap" parameters: when passed a snapshot name zfs_remap_indirects() does not handle the EINVAL returned from libzfs_core, which results in failing an assertion and consequently crashing. illumos/illumos-gate@0b2e825398 Reviewed by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: John Wren Kennedy <john.kennedy@delphix.com> Reviewed by: Sara Hartse <sara.hartse@delphix.com> Approved by: Matt Ahrens <mahrens@delphix.com> Author: loli10K <ezomori.nozomu@gmail.com>
This commit is contained in:
parent
2395a7f52d
commit
cf8fc527c9
@ -6924,11 +6924,28 @@ zfs_do_diff(int argc, char **argv)
|
||||
return (err != 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* zfs remap <filesystem | volume>
|
||||
*
|
||||
* Remap the indirect blocks in the given fileystem or volume.
|
||||
*/
|
||||
static int
|
||||
zfs_do_remap(int argc, char **argv)
|
||||
{
|
||||
const char *fsname;
|
||||
int err = 0;
|
||||
int c;
|
||||
|
||||
/* check options */
|
||||
while ((c = getopt(argc, argv, "")) != -1) {
|
||||
switch (c) {
|
||||
case '?':
|
||||
(void) fprintf(stderr,
|
||||
gettext("invalid option '%c'\n"), optopt);
|
||||
usage(B_FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
if (argc != 2) {
|
||||
(void) fprintf(stderr, gettext("wrong number of arguments\n"));
|
||||
usage(B_FALSE);
|
||||
|
@ -3877,12 +3877,24 @@ zfs_remap_indirects(libzfs_handle_t *hdl, const char *fs)
|
||||
char errbuf[1024];
|
||||
|
||||
(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
|
||||
"cannot remap filesystem '%s' "), fs);
|
||||
"cannot remap dataset '%s'"), fs);
|
||||
|
||||
err = lzc_remap(fs);
|
||||
|
||||
if (err != 0) {
|
||||
(void) zfs_standard_error(hdl, err, errbuf);
|
||||
switch (err) {
|
||||
case ENOTSUP:
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||
"pool must be upgraded"));
|
||||
(void) zfs_error(hdl, EZFS_BADVERSION, errbuf);
|
||||
break;
|
||||
case EINVAL:
|
||||
(void) zfs_error(hdl, EZFS_BADTYPE, errbuf);
|
||||
break;
|
||||
default:
|
||||
(void) zfs_standard_error(hdl, err, errbuf);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (err);
|
||||
|
Loading…
x
Reference in New Issue
Block a user