Fix ptevent: memory leak, NULL-deref, and race condition
1. Free str1/str2 in proc_send_data_event() after callback 2. Add NULL guards before strdup() in ptevent_process() 3. Protect data_event_fptr with mutex for thread safety Fixes #228
This commit is contained in:
parent
2f733a5025
commit
df1b8b576b
|
|
@ -1,7 +1,9 @@
|
|||
#include "pdbg.h"
|
||||
#include "prun.h"
|
||||
#include "ptevent.h"
|
||||
#include <pthread.h>
|
||||
|
||||
static pthread_mutex_t data_event_fptr_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
data_event_callback data_event_fptr = NULL;
|
||||
|
||||
static void proc_send_data_event(void *ptr) {
|
||||
|
|
@ -12,27 +14,39 @@ static void proc_send_data_event(void *ptr) {
|
|||
"Uint2:[%lu]",
|
||||
data->eventid, data->str1, data->str2, data->uint1, data->uint2);
|
||||
|
||||
data_event_fptr(data->eventid, (char *)data->str1, (char *)data->str2,
|
||||
data->uint1, data->uint2);
|
||||
pthread_mutex_lock(&data_event_fptr_mutex);
|
||||
if (data_event_fptr) {
|
||||
data_event_fptr(data->eventid, (char *)data->str1, (char *)data->str2,
|
||||
data->uint1, data->uint2);
|
||||
}
|
||||
pthread_mutex_unlock(&data_event_fptr_mutex);
|
||||
|
||||
free((void *)data->str1);
|
||||
free((void *)data->str2);
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
void ptevent_init(void *ptr) {
|
||||
pthread_mutex_lock(&data_event_fptr_mutex);
|
||||
data_event_fptr = (data_event_callback)ptr;
|
||||
pthread_mutex_unlock(&data_event_fptr_mutex);
|
||||
pdbg_logf(D_NOTICE, "Data event handler set.");
|
||||
}
|
||||
|
||||
void ptevent_process(event_data_struct *data) {
|
||||
event_data_struct *event_data;
|
||||
|
||||
if (data_event_fptr) {
|
||||
pthread_mutex_lock(&data_event_fptr_mutex);
|
||||
int has_callback = (data_event_fptr != NULL);
|
||||
pthread_mutex_unlock(&data_event_fptr_mutex);
|
||||
|
||||
if (has_callback) {
|
||||
event_data = malloc(sizeof(event_data_struct));
|
||||
event_data->eventid = data->eventid;
|
||||
event_data->uint1 = data->uint1;
|
||||
event_data->uint2 = data->uint2;
|
||||
event_data->str1 = strdup(data->str1);
|
||||
event_data->str2 = strdup(data->str2);
|
||||
event_data->str1 = data->str1 ? strdup(data->str1) : NULL;
|
||||
event_data->str2 = data->str2 ? strdup(data->str2) : NULL;
|
||||
|
||||
prun_thread1("Data Event", proc_send_data_event, event_data);
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Reference in New Issue