diff options
author | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-05-24 17:49:27 +0200 |
---|---|---|
committer | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-05-24 19:13:50 +0200 |
commit | b94660e9e96af7d523a7fc147c56dac7d613b0ec (patch) | |
tree | 611ca96b38a39733a4e59d75f3c6a97574ac5bdf /src/lib/dev.c | |
parent | ca0d5f79a77cc56d529d40f5802d9772ab729703 (diff) | |
download | ouroboros-b94660e9e96af7d523a7fc147c56dac7d613b0ec.tar.gz ouroboros-b94660e9e96af7d523a7fc147c56dac7d613b0ec.zip |
lib: Fix memleaks in dev.c
Fixes some memleaks in dev.c in the case of error conditions.
Diffstat (limited to 'src/lib/dev.c')
-rw-r--r-- | src/lib/dev.c | 53 |
1 files changed, 30 insertions, 23 deletions
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) ; |