Browse Source

libvlc: fix potentially leaked error message

pull/18/head
Rémi Denis-Courmont 13 years ago
parent
commit
6ae117da3f
  1. 27
      lib/error.c

27
lib/error.c

@ -30,8 +30,10 @@ static const char oom[] = "Out of memory";
/* TODO: use only one thread-specific key for whole libvlc */ /* TODO: use only one thread-specific key for whole libvlc */
static vlc_threadvar_t context; static vlc_threadvar_t context;
static vlc_mutex_t lock = VLC_STATIC_MUTEX; static char *get_error (void)
static uintptr_t refs = 0; {
return vlc_threadvar_get (context);
}
static void free_msg (void *msg) static void free_msg (void *msg)
{ {
@ -39,6 +41,14 @@ static void free_msg (void *msg)
free (msg); free (msg);
} }
static void free_error (void)
{
free_msg (get_error ());
}
static vlc_mutex_t lock = VLC_STATIC_MUTEX;
static uintptr_t refs = 0;
void libvlc_threads_init (void) void libvlc_threads_init (void)
{ {
vlc_mutex_lock (&lock); vlc_mutex_lock (&lock);
@ -52,20 +62,13 @@ void libvlc_threads_deinit (void)
vlc_mutex_lock (&lock); vlc_mutex_lock (&lock);
assert (refs > 0); assert (refs > 0);
if (--refs == 0) if (--refs == 0)
{
free_error ();
vlc_threadvar_delete (&context); vlc_threadvar_delete (&context);
}
vlc_mutex_unlock (&lock); vlc_mutex_unlock (&lock);
} }
static char *get_error (void)
{
return vlc_threadvar_get (context);
}
static void free_error (void)
{
free_msg (get_error ());
}
/** /**
* Gets a human-readable error message for the last LibVLC error in the calling * Gets a human-readable error message for the last LibVLC error in the calling
* thread. The resulting string is valid until another error occurs (at least * thread. The resulting string is valid until another error occurs (at least

Loading…
Cancel
Save