diff options
author | Sander Vrijders <sander.vrijders@ugent.be> | 2017-03-25 12:20:05 +0100 |
---|---|---|
committer | Sander Vrijders <sander.vrijders@ugent.be> | 2017-03-25 12:24:12 +0100 |
commit | 0bbd4b30d618acd50bf2d6d09facf3e5f814e4ff (patch) | |
tree | ad1dec3d3cc797918188763381a3b91e206479b0 | |
parent | 1d9061666656ba1cc5a5c72fcc564a3a45b2dd8a (diff) | |
download | ouroboros-0bbd4b30d618acd50bf2d6d09facf3e5f814e4ff.tar.gz ouroboros-0bbd4b30d618acd50bf2d6d09facf3e5f814e4ff.zip |
ipcpd: normal: Avoid double free
The flow manager should clean up the buffer after the call to frct
create instance has either failed or succeeded.
-rw-r--r-- | src/ipcpd/normal/fmgr.c | 6 | ||||
-rw-r--r-- | src/ipcpd/normal/frct.c | 1 | ||||
-rw-r--r-- | src/ipcpd/normal/shm_pci.c | 2 |
3 files changed, 4 insertions, 5 deletions
diff --git a/src/ipcpd/normal/fmgr.c b/src/ipcpd/normal/fmgr.c index 8cefd317..d2966d0c 100644 --- a/src/ipcpd/normal/fmgr.c +++ b/src/ipcpd/normal/fmgr.c @@ -489,11 +489,13 @@ int fmgr_np1_alloc(int fd, cep_id = frct_i_create(addr, &buf, cube); if (cep_id == INVALID_CEP_ID) { - free(buf.data); pthread_rwlock_unlock(&fmgr.np1_flows_lock); + free(buf.data); return -1; } + free(buf->data); + fmgr.np1_fd_to_cep_id[fd] = cep_id; fmgr.np1_cep_id_to_fd[cep_id] = fd; @@ -721,14 +723,12 @@ int fmgr_nm1_write_buf(struct pci * pci, fd = pff_nhop(fmgr.pff[pci->qos_id], pci->dst_addr); if (fd < 0) { log_err("Could not get nhop for address %lu", pci->dst_addr); - free(buf->data); return -1; } buffer = shm_pci_ser_buf(buf, pci); if (buffer == NULL) { log_err("Failed to serialize buffer."); - free(buf->data); return -1; } diff --git a/src/ipcpd/normal/frct.c b/src/ipcpd/normal/frct.c index 62cbf9f7..8bf080ce 100644 --- a/src/ipcpd/normal/frct.c +++ b/src/ipcpd/normal/frct.c @@ -280,6 +280,7 @@ cep_id_t frct_i_create(uint64_t address, pthread_mutex_unlock(&frct.instances_lock); return INVALID_CEP_ID; } + id = instance->cep_id; instance->cube = cube; pthread_mutex_unlock(&frct.instances_lock); diff --git a/src/ipcpd/normal/shm_pci.c b/src/ipcpd/normal/shm_pci.c index 1170adff..001463eb 100644 --- a/src/ipcpd/normal/shm_pci.c +++ b/src/ipcpd/normal/shm_pci.c @@ -188,8 +188,6 @@ buffer_t * shm_pci_ser_buf(buffer_t * buf, memcpy(buffer->data + pci_info.head_size, buf->data, buf->len); - free(buf->data); - if (pci_info.dtc.has_chk) crc32((uint32_t *) (buffer->data + pci_info.head_size + buf->len), |