diff --git a/src/include/utils.h b/src/include/utils.h index 8f9f563..3ae1170 100644 --- a/src/include/utils.h +++ b/src/include/utils.h @@ -3,6 +3,7 @@ #include #include +#include /** * 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 \ No newline at end of file + +/** + ** 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 diff --git a/src/network/networksocket.c b/src/network/networksocket.c index 64dc41a..bc3c8fb 100644 --- a/src/network/networksocket.c +++ b/src/network/networksocket.c @@ -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; } diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index e57f350..97de789 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -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; } diff --git a/src/utils/msghandler.c b/src/utils/msghandler.c index 52eebe4..007c8c1 100644 --- a/src/utils/msghandler.c +++ b/src/utils/msghandler.c @@ -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 diff --git a/src/utils/ubus.c b/src/utils/ubus.c index bef4101..ea0ea43 100644 --- a/src/utils/ubus.c +++ b/src/utils/ubus.c @@ -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); } diff --git a/src/utils/utils.c b/src/utils/utils.c index 3d05b21..2ef5733 100644 --- a/src/utils/utils.c +++ b/src/utils/utils.c @@ -5,6 +5,7 @@ #include #include #include +#include #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); +}