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:
parent
13f2b8fb92
commit
7195c04d98
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue