diff options
| author | dimitri staessens <dimitri.staessens@intec.ugent.be> | 2016-05-24 19:13:55 +0200 | 
|---|---|---|
| committer | dimitri staessens <dimitri.staessens@intec.ugent.be> | 2016-05-24 19:13:55 +0200 | 
| commit | 82622409f7b32b697581837a9392a83342a45ad6 (patch) | |
| tree | 611ca96b38a39733a4e59d75f3c6a97574ac5bdf | |
| parent | ca0d5f79a77cc56d529d40f5802d9772ab729703 (diff) | |
| parent | b94660e9e96af7d523a7fc147c56dac7d613b0ec (diff) | |
| download | ouroboros-82622409f7b32b697581837a9392a83342a45ad6.tar.gz ouroboros-82622409f7b32b697581837a9392a83342a45ad6.zip | |
Merged in sandervrijders/ouroboros/be (pull request #109)
lib: Fix memleaks in 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)                          ; | 
