aboutsummaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorRyan Moeller <[email protected]>2020-03-18 15:54:12 -0400
committerGitHub <[email protected]>2020-03-18 12:54:12 -0700
commit22df2457a7b8265d999a2fe48f3e8e941c8fdde5 (patch)
tree78a33a544b885b5cdbfcff1d2c7c16c44e35f529 /cmd
parent4df8b2c3739c50be2e0a5aa5b6d0d131e8b8e3f3 (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.c22
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);