summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordimitri staessens <dimitri.staessens@intec.ugent.be>2016-10-25 21:22:25 +0200
committerdimitri staessens <dimitri.staessens@intec.ugent.be>2016-10-25 21:26:30 +0200
commitd2ae65cff6a732ef6ad38a74380f27e36d464321 (patch)
tree3269a1d9b5a2d161f3e514bdd00f92453f417f40
parentf689fd95ec35050f4c6bd89bedf21875a3438987 (diff)
downloadouroboros-d2ae65cff6a732ef6ad38a74380f27e36d464321.tar.gz
ouroboros-d2ae65cff6a732ef6ad38a74380f27e36d464321.zip
ipcpd: Fix memory leaks
Fixes memory leaks associated with the dif_name (which doesn't need to be maintained in shim DIFs) and the fqueue for the N + 1 flows.
-rw-r--r--src/ipcpd/shim-eth-llc/main.c33
-rw-r--r--src/ipcpd/shim-udp/main.c33
2 files changed, 35 insertions, 31 deletions
diff --git a/src/ipcpd/shim-eth-llc/main.c b/src/ipcpd/shim-eth-llc/main.c
index 6046d939..836144ea 100644
--- a/src/ipcpd/shim-eth-llc/main.c
+++ b/src/ipcpd/shim-eth-llc/main.c
@@ -115,6 +115,7 @@ struct {
int tx_offset;
#endif
flow_set_t * np1_flows;
+ fqueue_t * fq;
int * ef_to_fd;
struct ef * fd_to_ef;
pthread_rwlock_t flows_lock;
@@ -152,6 +153,15 @@ static int eth_llc_data_init(void)
return -ENOMEM;
}
+ eth_llc_data.fq = fqueue_create();
+ if (eth_llc_data.fq == NULL) {
+ flow_set_destroy(eth_llc_data.np1_flows);
+ bmp_destroy(eth_llc_data.saps);
+ free(eth_llc_data.ef_to_fd);
+ free(eth_llc_data.fd_to_ef);
+ return -ENOMEM;
+ }
+
for (i = 0; i < MAX_SAPS; ++i)
eth_llc_data.ef_to_fd[i] = -1;
@@ -170,6 +180,7 @@ void eth_llc_data_fini(void)
{
bmp_destroy(eth_llc_data.saps);
flow_set_destroy(eth_llc_data.np1_flows);
+ fqueue_destroy(eth_llc_data.fq);
free(eth_llc_data.fd_to_ef);
free(eth_llc_data.ef_to_fd);
pthread_rwlock_destroy(&eth_llc_data.flows_lock);
@@ -605,20 +616,16 @@ static void * eth_llc_ipcp_sdu_writer(void * o)
uint8_t dsap;
uint8_t r_addr[MAC_SIZE];
struct timespec timeout = {0, EVENT_WAIT_TIMEOUT * 1000};
- fqueue_t * fq = fqueue_create();
- if (fq == NULL)
- return (void *) 1;
(void) o;
while (true) {
- int ret = flow_event_wait(eth_llc_data.np1_flows, fq, &timeout);
- if (ret == -ETIMEDOUT)
+ if (flow_event_wait(eth_llc_data.np1_flows,
+ eth_llc_data.fq,
+ &timeout) == -ETIMEDOUT)
continue;
- assert(!ret);
-
- while ((fd = fqueue_next(fq)) >= 0) {
+ while ((fd = fqueue_next(eth_llc_data.fq)) >= 0) {
if (ipcp_flow_read(fd, &sdb)) {
LOG_ERR("Bad read from fd %d.", fd);
continue;
@@ -686,13 +693,11 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)
struct tpacket_req req;
#endif
- if (conf == NULL)
- return -1; /* -EINVAL */
+ assert(conf);
+ assert(conf->type == THIS_TYPE);
- if (conf->type != THIS_TYPE) {
- LOG_ERR("Config doesn't match IPCP type.");
- return -1;
- }
+ /* this IPCP doesn't need to maintain its dif_name */
+ free(conf->dif_name);
if (conf->if_name == NULL) {
LOG_ERR("Interface name is NULL.");
diff --git a/src/ipcpd/shim-udp/main.c b/src/ipcpd/shim-udp/main.c
index 62e1b2d0..5abe0050 100644
--- a/src/ipcpd/shim-udp/main.c
+++ b/src/ipcpd/shim-udp/main.c
@@ -79,6 +79,7 @@ struct {
int s_fd;
flow_set_t * np1_flows;
+ fqueue_t * fq;
fd_set flow_fd_s;
/* bidir mappings of (n - 1) file descriptor to (n) flow descriptor */
int uf_to_fd[FD_SETSIZE];
@@ -112,6 +113,12 @@ static int udp_data_init(void)
if (udp_data.np1_flows == NULL)
return -ENOMEM;
+ udp_data.fq = fqueue_create();
+ if (udp_data.fq == NULL) {
+ flow_set_destroy(udp_data.np1_flows);
+ return -ENOMEM;
+ }
+
pthread_rwlock_init(&udp_data.flows_lock, NULL);
pthread_cond_init(&udp_data.fd_set_cond, NULL);
pthread_mutex_init(&udp_data.fd_set_lock, NULL);
@@ -122,6 +129,7 @@ static int udp_data_init(void)
static void udp_data_fini(void)
{
flow_set_destroy(udp_data.np1_flows);
+ fqueue_destroy(udp_data.fq);
pthread_rwlock_destroy(&udp_data.flows_lock);
pthread_mutex_destroy(&udp_data.fd_set_lock);
@@ -523,23 +531,16 @@ static void * ipcp_udp_sdu_loop(void * o)
int fd;
struct timespec timeout = {0, FD_UPDATE_TIMEOUT * 1000};
struct shm_du_buff * sdb;
- fqueue_t * fq = fqueue_create();
- if (fq == NULL)
- return (void *) 1;
(void) o;
while (true) {
- int ret = flow_event_wait(udp_data.np1_flows, fq, &timeout);
- if (ret == -ETIMEDOUT)
- continue;
-
- if (ret < 0) {
- LOG_ERR("Event wait returned error code %d.", -ret);
+ if (flow_event_wait(udp_data.np1_flows,
+ udp_data.fq,
+ &timeout) == -ETIMEDOUT)
continue;
- }
- while ((fd = fqueue_next(fq)) >= 0) {
+ while ((fd = fqueue_next(udp_data.fq)) >= 0) {
if (ipcp_flow_read(fd, &sdb)) {
LOG_ERR("Bad read from fd %d.", fd);
continue;
@@ -594,13 +595,11 @@ static int ipcp_udp_bootstrap(struct dif_config * conf)
int enable = 1;
int fd = -1;
- if (conf == NULL)
- return -1; /* -EINVAL */
+ assert(conf);
+ assert(conf->type == THIS_TYPE);
- if (conf->type != THIS_TYPE) {
- LOG_ERR("Config doesn't match IPCP type.");
- return -1;
- }
+ /* this IPCP doesn't need to maintain its dif_name */
+ free(conf->dif_name);
if (inet_ntop(AF_INET,
&conf->ip_addr,