[VDPAU] [PATCH] Don't leak the vdpau_wrapper.cfg file pointer
Andy Ritger
aritger at nvidia.com
Mon Jul 22 14:24:51 PDT 2013
Reviewed-by: Andy Ritger <aritger at nvidia.com>
On Mon, Jul 22, 2013 at 02:14:05PM -0700, Aaron Plattner wrote:
> init_config opens vdpau_wrapper.cfg and reads its contents, but never closes it.
> This causes a file descriptor leak if libvdpau is unloaded and reloaded.
>
> Signed-off-by: Aaron Plattner <aplattner at nvidia.com>
> ---
> src/vdpau_wrapper.c | 2 ++
> test/dlclose.c | 28 ++++++++++++++++++++++++++++
> 2 files changed, 30 insertions(+)
>
> diff --git a/src/vdpau_wrapper.c b/src/vdpau_wrapper.c
> index d847a87..0130597 100644
> --- a/src/vdpau_wrapper.c
> +++ b/src/vdpau_wrapper.c
> @@ -357,6 +357,8 @@ void init_config(void)
> _disable_flash_pq_bg_color = atoi(param);
> }
> }
> +
> + fclose(fp);
> }
>
> void init_fixes(void)
> diff --git a/test/dlclose.c b/test/dlclose.c
> index 14a957f..e2295c9 100644
> --- a/test/dlclose.c
> +++ b/test/dlclose.c
> @@ -1,3 +1,4 @@
> +#include <dirent.h>
> #include <dlfcn.h>
> #include <stdio.h>
> #include <vdpau/vdpau.h>
> @@ -8,11 +9,32 @@
> #define FAIL 1
> #define SKIP 77
>
> +static int countOpenFDs(void)
> +{
> + DIR *dir = opendir("/proc/self/fd");
> + struct dirent *ent;
> + int count = 0;
> +
> + if (!dir) {
> + fprintf(stderr, "Couldn't open /proc/self/fd; skipping file descriptor "
> + "leak test\n");
> + return 0;
> + }
> +
> + while (ent = readdir(dir)) {
> + count++;
> + }
> +
> + closedir(dir);
> + return count;
> +}
> +
> int main()
> {
> // Work around a bug in libXext: dlclosing it after it has registered the
> // Generic Event Extension causes an identical bug to the one this program
> // is trying to test for.
> + int nOpenFDs = countOpenFDs();
> void *libXext = dlopen("libXext.so.6", RTLD_LAZY);
> void *libvdpau = dlopen("../src/.libs/libvdpau.so", RTLD_LAZY);
> Display *dpy = XOpenDisplay(NULL);
> @@ -60,5 +82,11 @@ int main()
> dlclose(libvdpau);
> XCloseDisplay(dpy);
>
> + // Make sure no file descriptors were leaked.
> + if (countOpenFDs() != nOpenFDs) {
> + fprintf(stderr, "Mismatch in the number of open file descriptors!\n");
> + return FAIL;
> + }
> +
> return PASS;
> }
> --
> 1.8.3.3
>
> _______________________________________________
> VDPAU mailing list
> VDPAU at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/vdpau
More information about the VDPAU
mailing list