From e7e5729f46812929e2acbde19d99eea7e7929670 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Sat, 22 Oct 2016 15:19:31 +0200 Subject: lib: Fix wrong comparison FLOW_O_RDONLY is 0, so the previous statement would always be false. --- src/lib/dev.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/lib/dev.c') diff --git a/src/lib/dev.c b/src/lib/dev.c index 86a5913e..f737b74c 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -699,7 +699,7 @@ ssize_t flow_write(int fd, void * buf, size_t count) return -ENOTALLOC; } - if (ai.flows[fd].oflags & FLOW_O_RDONLY) { + if ((ai.flows[fd].oflags & FLOW_O_ACCMODE) == FLOW_O_RDONLY) { pthread_rwlock_unlock(&ai.flows_lock); pthread_rwlock_unlock(&ai.data_lock); return -EPERM; @@ -1257,7 +1257,7 @@ int ipcp_flow_write(int fd, struct shm_du_buff * sdb) pthread_rwlock_rdlock(&ai.data_lock); pthread_rwlock_rdlock(&ai.flows_lock); - if (ai.flows[fd].oflags & FLOW_O_RDONLY) { + if ((ai.flows[fd].oflags & FLOW_O_ACCMODE) == FLOW_O_RDONLY) { pthread_rwlock_unlock(&ai.flows_lock); pthread_rwlock_unlock(&ai.data_lock); return -EPERM; -- cgit v1.2.3 From 2bc5cafc514ab92c389ce0d7dd376f89dfa7bb8e Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Sat, 22 Oct 2016 16:12:29 +0200 Subject: lib: Revert bad fqueue modification An untested (and wrong) modification to the fqueue was mistakenly added to a previous commit. This corrects the bad code. --- src/lib/dev.c | 3 ++- src/lib/shm_flow_set.c | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) (limited to 'src/lib/dev.c') diff --git a/src/lib/dev.c b/src/lib/dev.c index f737b74c..41841988 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -960,12 +960,13 @@ int flow_event_wait(struct flow_set * set, if (fq->fqsize > 0) return 0; + assert(!fq->next); + ret = shm_flow_set_wait(ai.fqset, set->idx, fq->fqueue, timeout); if (ret == -ETIMEDOUT) return -ETIMEDOUT; fq->fqsize = ret; - fq->next = 0; return 0; } diff --git a/src/lib/shm_flow_set.c b/src/lib/shm_flow_set.c index f68773aa..3b1af83f 100644 --- a/src/lib/shm_flow_set.c +++ b/src/lib/shm_flow_set.c @@ -356,6 +356,7 @@ ssize_t shm_flow_set_wait(const struct shm_flow_set * shm_set, assert(shm_set); assert(idx < AP_MAX_FQUEUES); + assert(fqueue); #ifdef __APPLE__ pthread_mutex_lock(shm_set->lock); @@ -397,10 +398,11 @@ ssize_t shm_flow_set_wait(const struct shm_flow_set * shm_set, memcpy(fqueue, fqueue_ptr(shm_set, idx), shm_set->heads[idx] * sizeof(int)); + ret = shm_set->heads[idx]; shm_set->heads[idx] = 0; } pthread_cleanup_pop(true); - return 0; + return ret; } -- cgit v1.2.3 From 4bb18901fa222dc686886e7736e9935cfa1a4672 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Sat, 22 Oct 2016 16:18:58 +0200 Subject: lib: Fix closing applications with active flows The rdrbuff was previously closed before the remaining SDUs were removed. --- src/lib/dev.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/lib/dev.c') diff --git a/src/lib/dev.c b/src/lib/dev.c index 41841988..cac3ca37 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -276,7 +276,6 @@ void ap_fini() bmp_destroy(ai.fds); bmp_destroy(ai.fqueues); shm_flow_set_destroy(ai.fqset); - shm_rdrbuff_close(ai.rdrb); if (ai.daf_name != NULL) free(ai.daf_name); @@ -303,6 +302,8 @@ void ap_fini() pthread_cond_destroy(&ai.ports[i].state_cond); } + shm_rdrbuff_close(ai.rdrb); + free(ai.flows); free(ai.ports); -- cgit v1.2.3