diff options
author | Dimitri Staessens <[email protected]> | 2018-12-27 17:25:48 +0100 |
---|---|---|
committer | Sander Vrijders <[email protected]> | 2018-12-29 10:43:31 +0100 |
commit | 93c588892a86333fc3cfa66b7c5da2e7ff4e7e6c (patch) | |
tree | 081ca57d5d9e47bf1c3e8cfa5b2719388558d5bf | |
parent | 9dab3985812e75071271ce69000561156d0d9374 (diff) | |
download | ouroboros-93c588892a86333fc3cfa66b7c5da2e7ff4e7e6c.tar.gz ouroboros-93c588892a86333fc3cfa66b7c5da2e7ff4e7e6c.zip |
lib: Fix deallocating non-initialized np1 flows
This fixes the deallocation of non-initialized IPCP flows. These can
occur when some operations are not implemented.
Signed-off-by: Dimitri Staessens <[email protected]>
Signed-off-by: Sander Vrijders <[email protected]>
-rw-r--r-- | include/ouroboros/ipcp-dev.h | 2 | ||||
-rw-r--r-- | src/ipcpd/normal/fa.c | 3 | ||||
-rw-r--r-- | src/ipcpd/normal/psched.c | 4 | ||||
-rw-r--r-- | src/lib/dev.c | 13 |
4 files changed, 16 insertions, 6 deletions
diff --git a/include/ouroboros/ipcp-dev.h b/include/ouroboros/ipcp-dev.h index 4f8b5da8..86e21cdc 100644 --- a/include/ouroboros/ipcp-dev.h +++ b/include/ouroboros/ipcp-dev.h @@ -43,7 +43,7 @@ int ipcp_flow_read(int fd, int ipcp_flow_write(int fd, struct shm_du_buff * sdb); -void ipcp_flow_fini(int fd); +int ipcp_flow_fini(int fd); int ipcp_flow_get_qoscube(int fd, qoscube_t * cube); diff --git a/src/ipcpd/normal/fa.c b/src/ipcpd/normal/fa.c index 56864e1f..8408033f 100644 --- a/src/ipcpd/normal/fa.c +++ b/src/ipcpd/normal/fa.c @@ -446,7 +446,8 @@ int fa_alloc_resp(int fd, int fa_dealloc(int fd) { - ipcp_flow_fini(fd); + if (ipcp_flow_fini(fd) < 0) + return 0; pthread_rwlock_wrlock(&fa.flows_lock); diff --git a/src/ipcpd/normal/psched.c b/src/ipcpd/normal/psched.c index c38c072d..6d02de18 100644 --- a/src/ipcpd/normal/psched.c +++ b/src/ipcpd/normal/psched.c @@ -217,7 +217,7 @@ void psched_destroy(struct psched * psched) } void psched_add(struct psched * psched, - int fd) + int fd) { qoscube_t qc; @@ -228,7 +228,7 @@ void psched_add(struct psched * psched, } void psched_del(struct psched * psched, - int fd) + int fd) { qoscube_t qc; diff --git a/src/lib/dev.c b/src/lib/dev.c index 57dfc3f2..50b12b43 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -667,7 +667,10 @@ int flow_dealloc(int fd) pthread_rwlock_rdlock(&ai.lock); - assert(ai.flows[fd].flow_id >= 0); + if (ai.flows[fd].flow_id < 0) { + pthread_rwlock_unlock(&ai.lock); + return -ENOTALLOC; + } msg.flow_id = ai.flows[fd].flow_id; @@ -1467,7 +1470,7 @@ void ipcp_sdb_release(struct shm_du_buff * sdb) shm_rdrbuff_remove(ai.rdrb, shm_du_buff_get_idx(sdb)); } -void ipcp_flow_fini(int fd) +int ipcp_flow_fini(int fd) { struct shm_rbuff * rx_rb; @@ -1475,6 +1478,11 @@ void ipcp_flow_fini(int fd) pthread_rwlock_rdlock(&ai.lock); + if (ai.flows[fd].flow_id < 0) { + pthread_rwlock_unlock(&ai.lock); + return -1; + } + shm_rbuff_set_acl(ai.flows[fd].rx_rb, ACL_FLOWDOWN); shm_rbuff_set_acl(ai.flows[fd].tx_rb, ACL_FLOWDOWN); @@ -1489,6 +1497,7 @@ void ipcp_flow_fini(int fd) if (rx_rb != NULL) shm_rbuff_fini(rx_rb); + return 0; } int ipcp_flow_get_qoscube(int fd, |