diff options
author | Ryan Moeller <[email protected]> | 2020-03-18 15:54:12 -0400 |
---|---|---|
committer | GitHub <[email protected]> | 2020-03-18 12:54:12 -0700 |
commit | 22df2457a7b8265d999a2fe48f3e8e941c8fdde5 (patch) | |
tree | 78a33a544b885b5cdbfcff1d2c7c16c44e35f529 /cmd | |
parent | 4df8b2c3739c50be2e0a5aa5b6d0d131e8b8e3f3 (diff) |
Avoid core dump on invalid redaction bookmark
libzfs aborts and dumps core on EINVAL from the kernel when trying to
do a redacted send with a bookmark that is not a redaction bookmark.
Move redacted bookmark validation into libzfs.
Check if the bookmark given for redactions is actually a redaction
bookmark. Print an error message and exit gracefully if it is not.
Don't abort on EINVAL in zfs_send_one.
Reviewed-by: Paul Dagnelie <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Ryan Moeller <[email protected]>
Closes #10138
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/zfs/zfs_main.c | 22 |
1 files changed, 4 insertions, 18 deletions
diff --git a/cmd/zfs/zfs_main.c b/cmd/zfs/zfs_main.c index 82b91754e..150bebd32 100644 --- a/cmd/zfs/zfs_main.c +++ b/cmd/zfs/zfs_main.c @@ -4408,24 +4408,6 @@ zfs_do_send(int argc, char **argv) if (!(flags.replicate || flags.doall)) { char frombuf[ZFS_MAX_DATASET_NAME_LEN]; - if (redactbook != NULL) { - if (strchr(argv[0], '@') == NULL) { - (void) fprintf(stderr, gettext("Error: Cannot " - "do a redacted send to a filesystem.\n")); - return (1); - } - if (strchr(redactbook, '#') != NULL) { - (void) fprintf(stderr, gettext("Error: " - "redaction bookmark argument must " - "not contain '#'\n")); - return (1); - } - } - - zhp = zfs_open(g_zfs, argv[0], ZFS_TYPE_DATASET); - if (zhp == NULL) - return (1); - if (fromname != NULL && (strchr(fromname, '#') == NULL && strchr(fromname, '@') == NULL)) { /* @@ -4454,6 +4436,10 @@ zfs_do_send(int argc, char **argv) (void) strlcat(frombuf, tmpbuf, sizeof (frombuf)); fromname = frombuf; } + + zhp = zfs_open(g_zfs, argv[0], ZFS_TYPE_DATASET); + if (zhp == NULL) + return (1); err = zfs_send_one(zhp, fromname, STDOUT_FILENO, &flags, redactbook); zfs_close(zhp); |