git: 5385c7e13b06 - main - stand/zfs: Fix memory leaking on error cases
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 13 Jan 2023 21:24:46 UTC
The branch main has been updated by imp:
URL: https://cgit.FreeBSD.org/src/commit/?id=5385c7e13b06cb42a28bbf8c0d910b0c2ffddec7
commit 5385c7e13b06cb42a28bbf8c0d910b0c2ffddec7
Author: Warner Losh <imp@FreeBSD.org>
AuthorDate: 2023-01-13 21:20:00 +0000
Commit: Warner Losh <imp@FreeBSD.org>
CommitDate: 2023-01-13 21:22:38 +0000
stand/zfs: Fix memory leaking on error cases
Now that we return an allocated zfs_devdesc, we have to free it. These
frees were missing from the error cases. In addition, simplify the code
a bit for the out of memory case.
Sponsored by: Netflix
Reviewed by: kevans
Differential Revision: https://reviews.freebsd.org/D38006
---
stand/libsa/zfs/zfs.c | 42 ++++++++++++++++++++++++++----------------
1 file changed, 26 insertions(+), 16 deletions(-)
diff --git a/stand/libsa/zfs/zfs.c b/stand/libsa/zfs/zfs.c
index 57fecf2f4d68..3d5a392dd03f 100644
--- a/stand/libsa/zfs/zfs.c
+++ b/stand/libsa/zfs/zfs.c
@@ -379,9 +379,9 @@ zfs_readdir(struct open_file *f, struct dirent *d)
static int
zfs_mount(const char *dev, const char *path, void **data)
{
- struct zfs_devdesc *zfsdev;
+ struct zfs_devdesc *zfsdev = NULL;
spa_t *spa;
- struct zfsmount *mnt;
+ struct zfsmount *mnt = NULL;
int rv;
errno = 0;
@@ -391,36 +391,46 @@ zfs_mount(const char *dev, const char *path, void **data)
}
spa = spa_find_by_dev(zfsdev);
- if (spa == NULL)
- return (ENXIO);
+ if (spa == NULL) {
+ rv = ENXIO;
+ goto err;
+ }
mnt = calloc(1, sizeof(*mnt));
- if (mnt != NULL && path != NULL)
+ if (mnt == NULL) {
+ rv = ENOMEM;
+ goto err;
+ }
+
+ if (mnt->path != NULL) {
mnt->path = strdup(path);
- rv = errno;
+ if (mnt->path == NULL) {
+ rv = ENOMEM;
+ goto err;
+ }
+ }
- if (mnt != NULL)
- rv = zfs_mount_impl(spa, zfsdev->root_guid, mnt);
- free(zfsdev);
+ rv = zfs_mount_impl(spa, zfsdev->root_guid, mnt);
- if (rv == 0 && mnt != NULL && mnt->objset.os_type != DMU_OST_ZFS) {
+ if (rv == 0 && mnt->objset.os_type != DMU_OST_ZFS) {
printf("Unexpected object set type %ju\n",
(uintmax_t)mnt->objset.os_type);
rv = EIO;
}
-
+err:
if (rv != 0) {
if (mnt != NULL)
free(mnt->path);
free(mnt);
+ free(zfsdev);
return (rv);
}
- if (mnt != NULL) {
- *data = mnt;
- if (path != NULL)
- STAILQ_INSERT_TAIL(&zfsmount, mnt, next);
- }
+ *data = mnt;
+ if (path != NULL)
+ STAILQ_INSERT_TAIL(&zfsmount, mnt, next);
+
+ free(zfsdev);
return (rv);
}