Fix file descriptor handling in zdb_copy_object()

Coverity found a file descriptor leak. Eyeballing it showed that we had
no handling for the `open()` call failing either. We can address both of
these at once.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Neal Gompa <ngompa@datto.com>
Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu>
Closes #13862
This commit is contained in:
Richard Yao 2022-09-12 15:34:10 -04:00 committed by GitHub
parent 13f2b8fb92
commit 7195c04d98
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 4 additions and 0 deletions

View File

@ -4737,6 +4737,8 @@ zdb_copy_object(objset_t *os, uint64_t srcobj, char *destfile)
} }
int fd = open(destfile, O_WRONLY | O_CREAT | O_TRUNC, 0644); int fd = open(destfile, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1)
return (errno);
/* /*
* We cap the size at 1 mebibyte here to prevent * We cap the size at 1 mebibyte here to prevent
* allocation failures and nigh-infinite printing if the * allocation failures and nigh-infinite printing if the
@ -4746,6 +4748,7 @@ zdb_copy_object(objset_t *os, uint64_t srcobj, char *destfile)
offset = 0; offset = 0;
char *buf = kmem_alloc(oursize, KM_NOSLEEP); char *buf = kmem_alloc(oursize, KM_NOSLEEP);
if (buf == NULL) { if (buf == NULL) {
(void) close(fd);
return (ENOMEM); return (ENOMEM);
} }
@ -4755,6 +4758,7 @@ zdb_copy_object(objset_t *os, uint64_t srcobj, char *destfile)
if (err != 0) { if (err != 0) {
(void) printf("got error %u from dmu_read\n", err); (void) printf("got error %u from dmu_read\n", err);
kmem_free(buf, oursize); kmem_free(buf, oursize);
(void) close(fd);
return (err); return (err);
} }
if (dump_opt['v'] > 3) { if (dump_opt['v'] > 3) {