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

Aaron Watry awatry at gmail.com
Thu Aug 21 09:18:59 PDT 2014


On Thu, Aug 21, 2014 at 11:09 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> 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?

Yeah, that'd be better. I'll send v2 shortly.

--Aaron

>
>>  #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