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:
Levi Neely 2026-03-03 15:12:02 +01:00
parent 2f733a5025
commit df1b8b576b
1 changed files with 19 additions and 5 deletions

View File

@ -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 {