[Mesa-dev] [PATCH 4/4] aux/pipe_loader: Don't leak dlerror string on dlopen failure

Ilia Mirkin imirkin at alum.mit.edu
Thu Aug 21 09:09:07 PDT 2014


On Thu, Aug 21, 2014 at 12:06 PM, Aaron Watry <awatry at gmail.com> wrote:
> dlopen allocates a string on dlopen failure which is retrieved via dlerror. In
> order to free that string, you need to retrieve and then free it.
>
> In order to keep things legit the windows/other util_dl_error paths allocate
> and then copy their error message into a buffer as well.
>
> Signed-off-by: Aaron Watry <awatry at gmail.com>
> ---
>  src/gallium/auxiliary/pipe-loader/pipe_loader.c |  5 +++++
>  src/gallium/auxiliary/util/u_dl.c               | 13 +++++++++++--
>  2 files changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader.c b/src/gallium/auxiliary/pipe-loader/pipe_loader.c
> index 8e79f85..bf3acca 100644
> --- a/src/gallium/auxiliary/pipe-loader/pipe_loader.c
> +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader.c
> @@ -25,6 +25,8 @@
>   *
>   **************************************************************************/
>
> +#include <dlfcn.h>
> +
>  #include "pipe_loader_priv.h"
>
>  #include "util/u_inlines.h"
> @@ -101,6 +103,9 @@ pipe_loader_find_module(struct pipe_loader_device *dev,
>           if (lib) {
>              return lib;
>           }
> +
> +         //Retrieve the dlerror() str so that it can be freed properly
> +         FREE(util_dl_error());
>        }
>     }
>
> diff --git a/src/gallium/auxiliary/util/u_dl.c b/src/gallium/auxiliary/util/u_dl.c
> index aca435d..7f9231f 100644
> --- a/src/gallium/auxiliary/util/u_dl.c
> +++ b/src/gallium/auxiliary/util/u_dl.c
> @@ -39,6 +39,7 @@
>
>  #include "u_dl.h"
>  #include "u_pointer.h"
> +#include "u_memory.h"
>
>
>  struct util_dl_library *
> @@ -87,8 +88,16 @@ util_dl_error(void)
>  #if defined(PIPE_OS_UNIX)
>     return dlerror();
>  #elif defined(PIPE_OS_WINDOWS)
> -   return "unknown error";
> +   char *error = CALLOC(14, sizeof(char));
> +   if (error == NULL) {
> +      return NULL;
> +   }
> +   return strcpy(error, "unknown error");
>  #else
> -   return "unknown error";
> +   char *error = CALLOC(14, sizeof(char));
> +   if (error == NULL) {
> +      return NULL;
> +   }
> +   return strcpy(error, "unknown error");

return strdup("unknown error") seems like it'd be sufficient, no?

>  #endif
>  }
> --
> 1.9.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list