From b94660e9e96af7d523a7fc147c56dac7d613b0ec Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Tue, 24 May 2016 17:49:27 +0200 Subject: lib: Fix memleaks in dev.c Fixes some memleaks in dev.c in the case of error conditions. --- src/lib/dev.c | 53 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 23 deletions(-) (limited to 'src/lib/dev.c') diff --git a/src/lib/dev.c b/src/lib/dev.c index 1332b014..4f9a00df 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -281,23 +281,6 @@ int flow_accept(int fd, return -1; } - if (ap_name != NULL) { - *ap_name = strdup(recv_msg->ap_name); - if (*ap_name == NULL) { - irm_msg__free_unpacked(recv_msg, NULL); - return -1; - } - } - - - if (ae_name != NULL) { - *ae_name = strdup(recv_msg->ae_name); - if (*ae_name == NULL) { - irm_msg__free_unpacked(recv_msg, NULL); - return -1; - } - } - rw_lock_rdlock(&_ap_instance->data_lock); rw_lock_wrlock(&_ap_instance->flows_lock); @@ -305,6 +288,7 @@ int flow_accept(int fd, if (!bmp_is_id_valid(_ap_instance->fds, cfd)) { rw_lock_unlock(&_ap_instance->flows_lock); rw_lock_unlock(&_ap_instance->data_lock); + irm_msg__free_unpacked(recv_msg, NULL); return -1; } @@ -317,6 +301,32 @@ int flow_accept(int fd, return -1; } + if (ap_name != NULL) { + *ap_name = strdup(recv_msg->ap_name); + if (*ap_name == NULL) { + shm_ap_rbuff_close(_ap_instance->flows[cfd].rb); + bmp_release(_ap_instance->fds, cfd); + rw_lock_unlock(&_ap_instance->flows_lock); + rw_lock_unlock(&_ap_instance->data_lock); + irm_msg__free_unpacked(recv_msg, NULL); + return -1; + } + } + + if (ae_name != NULL) { + *ae_name = strdup(recv_msg->ae_name); + if (*ae_name == NULL) { + if (*ap_name != NULL) + free(*ap_name); + shm_ap_rbuff_close(_ap_instance->flows[cfd].rb); + bmp_release(_ap_instance->fds, cfd); + rw_lock_unlock(&_ap_instance->flows_lock); + rw_lock_unlock(&_ap_instance->data_lock); + irm_msg__free_unpacked(recv_msg, NULL); + return -1; + } + } + _ap_instance->flows[cfd].port_id = recv_msg->port_id; _ap_instance->flows[cfd].oflags = FLOW_O_DEFAULT; @@ -414,8 +424,10 @@ int flow_alloc(char * dst_name, if (!bmp_is_id_valid(_ap_instance->fds, fd)) { rw_lock_unlock(&_ap_instance->flows_lock); rw_lock_unlock(&_ap_instance->data_lock); + irm_msg__free_unpacked(recv_msg, NULL); return -1; } + _ap_instance->flows[fd].rb = shm_ap_rbuff_open(recv_msg->pid); if (_ap_instance->flows[fd].rb == NULL) { bmp_release(_ap_instance->fds, fd); @@ -442,7 +454,7 @@ int flow_alloc_res(int fd) irm_msg_t * recv_msg = NULL; int result = 0; - msg.code = IRM_MSG_CODE__IRM_FLOW_ALLOC_RES; + msg.code = IRM_MSG_CODE__IRM_FLOW_ALLOC_RES; msg.has_port_id = true; rw_lock_rdlock(&_ap_instance->data_lock); @@ -571,11 +583,6 @@ ssize_t flow_write(int fd, void * buf, size_t count) rw_lock_unlock(&_ap_instance->data_lock); return -EPIPE; } - - rw_lock_unlock(&_ap_instance->flows_lock); - rw_lock_unlock(&_ap_instance->data_lock); - - return 0; } else { while (shm_ap_rbuff_write(_ap_instance->flows[fd].rb, &e) < 0) ; -- cgit v1.2.3