From 5d13ce1ec12c703bec8c8d06beb6918a6cdf4815 Mon Sep 17 00:00:00 2001 From: modbw Date: Thu, 2 Sep 2021 08:44:35 +0200 Subject: [PATCH 1/3] Fix memory leak in uio_free_info If a map has a name it won't be freed uio_free_info causing a memory leak. --- base.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/base.c b/base.c index 95b77db..82df009 100644 --- a/base.c +++ b/base.c @@ -178,6 +178,8 @@ int uio_get_fd(struct uio_info_t* info) */ void uio_free_info(struct uio_info_t* info) { + int i; + if (info) { if (info->path) @@ -187,7 +189,14 @@ void uio_free_info(struct uio_info_t* info) if (info->version) free (info->version); if (info->maps) + { + for (i = 0; i < info->maxmap; i++) + { + if (info->maps[i].name) + free(info->maps[i].name); + } free (info->maps); + } if (info->devname) free (info->devname); free (info); From e2d3eeb9242ab396a3dac254216281063aa93153 Mon Sep 17 00:00:00 2001 From: modbw Date: Thu, 2 Sep 2021 10:05:30 +0200 Subject: [PATCH 2/3] Make uio_free_info available To prevent memory leaks uio_free_info is needed by the user of the library --- libuio.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libuio.h b/libuio.h index 36d7287..e6dbf46 100644 --- a/libuio.h +++ b/libuio.h @@ -39,6 +39,7 @@ struct uio_info_t **uio_find_devices (); struct uio_info_t *uio_find_by_uio_name (char *uio_name); struct uio_info_t *uio_find_by_uio_num (int num); struct uio_info_t *uio_find_by_base_addr (unsigned int base_addr); +void uio_free_info(struct uio_info_t* info); void uio_setsysfs_point (const char *sysfs_mpoint); char *uio_get_name (struct uio_info_t* info); char *uio_get_version (struct uio_info_t* info); From 1499fe41f38b1ed7b4d2444abd14464ffdca4390 Mon Sep 17 00:00:00 2001 From: modbw Date: Thu, 2 Sep 2021 10:09:26 +0200 Subject: [PATCH 3/3] Fix memory leak in uio_find_by_uio_name When a uio_info_t doesn't match the searched name if will be freed --- base.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/base.c b/base.c index 82df009..9104afe 100644 --- a/base.c +++ b/base.c @@ -270,11 +270,14 @@ struct uio_info_t *uio_find_by_uio_name (char *uio_name) name = uio_get_name (candidate); - if (!strcmp (name, uio_name)) { + if ((!info) && (!strcmp (name, uio_name))) { info = candidate; - break; } + else + uio_free_info(candidate); + } + free (uio_list); return info;