treewide: rework mutex

Wrap mutex calls with traceable messages to help debugging resource locks.

[cleanup commit message]
Signed-off-by: Nick Hainke <vincent@systemli.org>
This commit is contained in:
Ian Clowes 2022-01-31 10:54:38 +00:00 committed by Nick Hainke
parent 0a962bea1f
commit be49c35686
6 changed files with 76 additions and 46 deletions

View file

@ -3,6 +3,7 @@
#include <stdint.h>
#include <syslog.h>
#include <pthread.h>
/**
* Check if a string is greater than another one.
@ -99,4 +100,20 @@ void dawnlog(int level, const char* fmt, ...);
* @return
*/
const char* dawnlog_basename(const char* file);
#endif
/**
** Wrap mutex operations to help track down mis-matches
*/
#define DAWN_MUTEX_WRAP
#ifndef DAWN_MUTEX_WRAP
#define dawn_mutex_lock(m) pthread_mutex_lock(m)
#define dawn_mutex_unlock(m) pthread_mutex_unlock(m)
#else
#define dawn_mutex_lock(m) _dawn_mutex_lock(m, __FILE__, __LINE__)
int _dawn_mutex_lock(pthread_mutex_t* m, char* f, int l);
#define dawn_mutex_unlock(m) _dawn_mutex_unlock(m, __FILE__, __LINE__)
int _dawn_mutex_unlock(pthread_mutex_t* m, char* f, int l);
#endif
#endif

View file

@ -124,7 +124,7 @@ void *receive_msg_enc(void *args) {
}
int send_string(char *msg, bool is_enc) {
pthread_mutex_lock(&send_mutex);
dawn_mutex_lock(&send_mutex);
char* final_msg = NULL;
size_t msglen = 0;
@ -143,7 +143,7 @@ int send_string(char *msg, bool is_enc) {
char* gcrypt_buf = gcrypt_encrypt_msg(msg, strlen(msg) + 1, &gcrypt_len);
if (!gcrypt_buf) {
dawnlog_error("sendto() error: not enough memory\n");
pthread_mutex_unlock(&send_mutex);
dawn_mutex_unlock(&send_mutex);
exit(EXIT_FAILURE);
}
@ -153,7 +153,7 @@ int send_string(char *msg, bool is_enc) {
dawnlog_error("sendto() error: not enough memory\n");
dawn_free(gcrypt_buf);
gcrypt_buf = NULL;
pthread_mutex_unlock(&send_mutex);
dawn_mutex_unlock(&send_mutex);
exit(EXIT_FAILURE);
}
@ -175,7 +175,7 @@ int send_string(char *msg, bool is_enc) {
// Tidy up probbaly unnecessary if we're exiting, but...
if (is_enc)
dawn_free(final_msg);
pthread_mutex_unlock(&send_mutex);
dawn_mutex_unlock(&send_mutex);
exit(EXIT_FAILURE);
}
@ -186,7 +186,7 @@ int send_string(char *msg, bool is_enc) {
final_msg = NULL;
}
pthread_mutex_unlock(&send_mutex);
dawn_mutex_unlock(&send_mutex);
return 0;
}

View file

@ -161,7 +161,7 @@ struct mac_entry_s* mac_find_entry(struct dawn_mac mac)
}
void send_beacon_requests(ap *a, int id) {
pthread_mutex_lock(&client_array_mutex);
dawn_mutex_lock(&client_array_mutex);
dawnlog_debug_func("Entering...");
@ -183,7 +183,7 @@ void send_beacon_requests(ap *a, int id) {
i = i->next_entry_bc;
}
pthread_mutex_unlock(&client_array_mutex);
dawn_mutex_unlock(&client_array_mutex);
}
int get_band(int freq) {
@ -448,8 +448,8 @@ int kick_clients(struct dawn_mac bssid_mac, uint32_t id) {
ap* kicking_ap = ap_array_get_ap(bssid_mac);
pthread_mutex_lock(&client_array_mutex);
pthread_mutex_lock(&probe_array_mutex);
dawn_mutex_lock(&client_array_mutex);
dawn_mutex_lock(&probe_array_mutex);
int kicked_clients = 0;
@ -564,8 +564,8 @@ int kick_clients(struct dawn_mac bssid_mac, uint32_t id) {
dawnlog_trace("KICKING: --------- AP Finished ---------\n");
pthread_mutex_unlock(&probe_array_mutex);
pthread_mutex_unlock(&client_array_mutex);
dawn_mutex_unlock(&probe_array_mutex);
dawn_mutex_unlock(&client_array_mutex);
return kicked_clients;
}
@ -573,8 +573,8 @@ int kick_clients(struct dawn_mac bssid_mac, uint32_t id) {
void update_iw_info(struct dawn_mac bssid_mac) {
dawnlog_debug_func("Entering...");
pthread_mutex_lock(&client_array_mutex);
pthread_mutex_lock(&probe_array_mutex);
dawn_mutex_lock(&client_array_mutex);
dawn_mutex_lock(&probe_array_mutex);
dawnlog_trace("-------- IW INFO UPDATE!!!---------\n");
dawnlog_trace("EVAL " MACSTR "\n", MAC2STR(bssid_mac.u8));
@ -600,8 +600,8 @@ void update_iw_info(struct dawn_mac bssid_mac) {
dawnlog_trace("---------------------------\n");
pthread_mutex_unlock(&probe_array_mutex);
pthread_mutex_unlock(&client_array_mutex);
dawn_mutex_unlock(&probe_array_mutex);
dawn_mutex_unlock(&client_array_mutex);
}
client *client_array_get_client(const struct dawn_mac client_addr)
@ -727,14 +727,14 @@ int probe_array_set_all_probe_count(struct dawn_mac client_addr, uint32_t probe_
dawnlog_debug_func("Entering...");
// MUSTDO: Has some code been lost here? updated never set... Certain to hit not found...
pthread_mutex_lock(&probe_array_mutex);
dawn_mutex_lock(&probe_array_mutex);
for (probe_entry *i = probe_array_find_first_entry(client_addr, dawn_mac_null, false);
i != NULL && mac_is_equal_bb(client_addr, i->client_addr);
i = i->next_probe) {
dawnlog_debug("Setting probecount for given mac!\n");
i->counter = probe_count;
}
pthread_mutex_unlock(&probe_array_mutex);
dawn_mutex_unlock(&probe_array_mutex);
return updated;
}
@ -799,7 +799,7 @@ void print_probe_array() {
probe_entry* insert_to_probe_array(probe_entry* entry, int is_local, int save_80211k, int is_beacon, time_t expiry) {
dawnlog_debug_func("Entering...");
pthread_mutex_lock(&probe_array_mutex);
dawn_mutex_lock(&probe_array_mutex);
struct probe_entry_s** node_ref = &probe_set.first_probe;
struct probe_entry_s** skip_ref = &probe_set.first_probe_skip;
@ -889,7 +889,7 @@ probe_entry* insert_to_probe_array(probe_entry* entry, int is_local, int save_80
entry->time = expiry;
}
pthread_mutex_unlock(&probe_array_mutex);
dawn_mutex_unlock(&probe_array_mutex);
return entry; // return pointer to what we used, which may not be what was passed in
}
@ -959,9 +959,9 @@ ap *insert_to_ap_array(ap* entry, time_t expiry) {
entry->time = expiry;
pthread_mutex_lock(&ap_array_mutex);
dawn_mutex_lock(&ap_array_mutex);
ap* old_entry = ap_array_update_entry(entry);
pthread_mutex_unlock(&ap_array_mutex);
dawn_mutex_unlock(&ap_array_mutex);
if (old_entry)
dawn_free(old_entry);
@ -1002,7 +1002,7 @@ ap* ap_array_get_ap(struct dawn_mac bssid_mac) {
dawnlog_debug_func("Entering...");;
pthread_mutex_lock(&ap_array_mutex);
dawn_mutex_lock(&ap_array_mutex);
ap* ret = ap_set;
@ -1010,7 +1010,7 @@ ap* ap_array_get_ap(struct dawn_mac bssid_mac) {
ret = ret->next_ap;
}
pthread_mutex_unlock(&ap_array_mutex);
dawn_mutex_unlock(&ap_array_mutex);
return ret;
}

View file

@ -229,11 +229,11 @@ int handle_deauth_req(struct blob_attr* msg) {
dawnlog_debug_func("Entering...");
pthread_mutex_lock(&client_array_mutex);
dawn_mutex_lock(&client_array_mutex);
client_array_delete_bc(notify_req.bssid_addr, notify_req.client_addr);
pthread_mutex_unlock(&client_array_mutex);
dawn_mutex_unlock(&client_array_mutex);
dawnlog_debug("[WC] Deauth: %s\n", "deauth");
@ -434,7 +434,7 @@ dump_client(struct blob_attr** tb, struct dawn_mac client_addr, const char* bssi
memset(client_entry->signature, 0, SIGNATURE_LEN);
}
pthread_mutex_lock(&client_array_mutex);
dawn_mutex_lock(&client_array_mutex);
// If entry was already in list we get back the old entry, which needs to be freed
client* prev_entry = client_array_update_entry(client_entry, time(0));
if (prev_entry)
@ -443,7 +443,7 @@ dump_client(struct blob_attr** tb, struct dawn_mac client_addr, const char* bssi
prev_entry = NULL;
}
pthread_mutex_unlock(&client_array_mutex);
dawn_mutex_unlock(&client_array_mutex);
}
static int

View file

@ -346,14 +346,14 @@ bool discard_entry = true;
dawnlog_trace("Allow authentication due to mac_in_maclist()");
}
else {
pthread_mutex_lock(&probe_array_mutex);
dawn_mutex_lock(&probe_array_mutex);
if (dawnlog_showing(DAWNLOG_DEBUG))
print_probe_array();
probe_entry *tmp = probe_array_get_entry(auth_req->client_addr, auth_req->bssid_addr);
pthread_mutex_unlock(&probe_array_mutex);
dawn_mutex_unlock(&probe_array_mutex);
/*** Deprecated function decide_function() removed here ***/
int deny_request = 0;
@ -418,14 +418,14 @@ int discard_entry = true;
else if (mac_find_entry(assoc_req->client_addr)) {
dawnlog_trace("Allow association due to mac_in_maclist()");
} else {
pthread_mutex_lock(&probe_array_mutex);
dawn_mutex_lock(&probe_array_mutex);
if (dawnlog_showing(DAWNLOG_DEBUG))
print_probe_array();
probe_entry *tmp = probe_array_get_entry(assoc_req->client_addr, assoc_req->bssid_addr);
pthread_mutex_unlock(&probe_array_mutex);
dawn_mutex_unlock(&probe_array_mutex);
/*** Deprecated function decide_function() removed here ***/
int deny_request = 0;
@ -547,11 +547,11 @@ static int handle_beacon_rep(struct blob_attr *msg) {
else
{
// Update RxxI of current entry if it exists
pthread_mutex_lock(&probe_array_mutex);
dawn_mutex_lock(&probe_array_mutex);
probe_entry* entry_updated = probe_array_update_rcpi_rsni(entry->client_addr, entry->bssid_addr, entry->rcpi, entry->rsni, true);
pthread_mutex_unlock(&probe_array_mutex);
dawn_mutex_unlock(&probe_array_mutex);
if (entry_updated)
{
@ -1726,7 +1726,7 @@ int build_hearing_map_sort_client(struct blob_buf *b) {
if (dawnlog_showing(DAWNLOG_DEBUG))
print_probe_array();
pthread_mutex_lock(&probe_array_mutex);
dawn_mutex_lock(&probe_array_mutex);
void *client_list, *ap_list, *ssid_list;
char ap_mac_buf[20];
@ -1801,7 +1801,7 @@ int build_hearing_map_sort_client(struct blob_buf *b) {
same_ssid = true;
}
pthread_mutex_unlock(&probe_array_mutex);
dawn_mutex_unlock(&probe_array_mutex);
return 0;
}
@ -1872,7 +1872,7 @@ int build_network_overview(struct blob_buf *b) {
blobmsg_add_rrm_string(b, "rrm-caps", k->rrm_enabled_capa);
pthread_mutex_lock(&probe_array_mutex);
dawn_mutex_lock(&probe_array_mutex);
probe_entry* n = probe_array_get_entry(k->client_addr, k->bssid_addr);
if (n != NULL) {
@ -1882,7 +1882,7 @@ int build_network_overview(struct blob_buf *b) {
blobmsg_add_u32(b, "rsni", n->rsni);
}
}
pthread_mutex_unlock(&probe_array_mutex);
dawn_mutex_unlock(&probe_array_mutex);
blobmsg_close_table(b, client_list);
@ -1949,7 +1949,7 @@ int ap_get_nr(struct blob_buf *b_local, struct dawn_mac own_bssid_addr, const ch
if (own_ap->freq <= max_band_freq[band])
break;
}
pthread_mutex_lock(&ap_array_mutex);
dawn_mutex_lock(&ap_array_mutex);
for (i = ap_set; i != NULL; i = i->next_ap) {
if (i != own_ap && !strncmp((char *)i->ssid, ssid, SSID_MAX_LEN) &&
!mac_is_in_entry_list(i->bssid_addr, preferred_list))
@ -1957,7 +1957,7 @@ int ap_get_nr(struct blob_buf *b_local, struct dawn_mac own_bssid_addr, const ch
blobmsg_add_nr(b_local, i);
}
}
pthread_mutex_unlock(&ap_array_mutex);
dawn_mutex_unlock(&ap_array_mutex);
for (n = preferred_list; n; n = n->next_mac) {
if ((i = ap_array_get_ap(n->mac)))
@ -1979,9 +1979,9 @@ void uloop_add_data_cbs() {
void remove_probe_array_cb(struct uloop_timeout* t) {
dawnlog_debug_func("[Thread] : Removing old probe entries!\n");
pthread_mutex_lock(&probe_array_mutex);
dawn_mutex_lock(&probe_array_mutex);
remove_old_probe_entries(time(0), timeout_config.remove_probe);
pthread_mutex_unlock(&probe_array_mutex);
dawn_mutex_unlock(&probe_array_mutex);
dawnlog_debug("[Thread] : Removing old entries finished!\n");
@ -1993,10 +1993,10 @@ void remove_probe_array_cb(struct uloop_timeout* t) {
void remove_client_array_cb(struct uloop_timeout* t) {
dawnlog_debug_func("Entering...");
pthread_mutex_lock(&client_array_mutex);
dawn_mutex_lock(&client_array_mutex);
dawnlog_debug("[Thread] : Removing old client entries!\n");
remove_old_client_entries(time(0), timeout_config.update_client);
pthread_mutex_unlock(&client_array_mutex);
dawn_mutex_unlock(&client_array_mutex);
uloop_timeout_set(&client_timeout, timeout_config.update_client * 1000);
}
@ -2005,10 +2005,10 @@ void remove_client_array_cb(struct uloop_timeout* t) {
void remove_ap_array_cb(struct uloop_timeout* t) {
dawnlog_debug_func("Entering...");
pthread_mutex_lock(&ap_array_mutex);
dawn_mutex_lock(&ap_array_mutex);
dawnlog_debug("[ULOOP] : Removing old ap entries!\n");
remove_old_ap_entries(time(0), timeout_config.remove_ap);
pthread_mutex_unlock(&ap_array_mutex);
dawn_mutex_unlock(&ap_array_mutex);
uloop_timeout_set(&ap_timeout, timeout_config.remove_ap * 1000);
}

View file

@ -5,6 +5,7 @@
#include <stdarg.h>
#include <syslog.h>
#include <stdio.h>
#include <inttypes.h>
#include "utils.h"
@ -128,3 +129,15 @@ const char* dawnlog_basename(const char* file)
return(xfile ? xfile + 1 : file);
}
int _dawn_mutex_lock(pthread_mutex_t* m, char * f, int l)
{
dawnlog_debug("MUTEX lock = %" PRIXPTR "@%s:%d", m, dawnlog_basename(f), l);
return pthread_mutex_lock(m);
}
int _dawn_mutex_unlock(pthread_mutex_t* m, char* f, int l)
{
dawnlog_debug("MUTEX unlock = %" PRIXPTR "@%s:%d", m, dawnlog_basename(f), l);
return pthread_mutex_unlock(m);
}