Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ambrop72/badvpn.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmbroz Bizjak <ambrop7@gmail.com>2015-12-26 01:03:10 +0300
committerAmbroz Bizjak <ambrop7@gmail.com>2015-12-26 01:03:10 +0300
commit1d2cb74f35e00924e695403b21275ce926a4eae6 (patch)
treec42eb9d09883c83bf777fb4876b42418b540c8f1
parent4b761996519288e4daf0c3379585d1bfb74b93a3 (diff)
FreeBSD assertion fix attempt.freebsd-fix
-rw-r--r--system/BReactor_badvpn.c29
-rw-r--r--system/BReactor_badvpn.h3
2 files changed, 20 insertions, 12 deletions
diff --git a/system/BReactor_badvpn.c b/system/BReactor_badvpn.c
index 1b03d58..ef3ab1a 100644
--- a/system/BReactor_badvpn.c
+++ b/system/BReactor_badvpn.c
@@ -193,13 +193,14 @@ static void set_kevent_fd_pointers (BReactor *bsys)
for (int i = 0; i < bsys->kevent_results_num; i++) {
struct kevent *event = &bsys->kevent_results[i];
ASSERT(event->udata)
+
int *tag = event->udata;
switch (*tag) {
case KEVENT_TAG_FD: {
BFileDescriptor *bfd = UPPER_OBJECT(tag, BFileDescriptor, kevent_tag);
ASSERT(bfd->active)
- ASSERT(!bfd->kevent_returned_ptr)
- bfd->kevent_returned_ptr = (int **)&event->udata;
+ bsys->kevent_prev_event[i] = bfd->kevent_last_event;
+ bfd->kevent_last_event = i;
} break;
case KEVENT_TAG_KEVENT: {
@@ -873,7 +874,8 @@ int BReactor_Exec (BReactor *bsys)
// dispatch kevent
if (bsys->kevent_results_pos < bsys->kevent_results_num) {
// grab event
- struct kevent *event = &bsys->kevent_results[bsys->kevent_results_pos];
+ int event_index = bsys->kevent_results_pos;
+ struct kevent *event = &bsys->kevent_results[event_index];
bsys->kevent_results_pos++;
// check if the event was removed
@@ -888,10 +890,11 @@ int BReactor_Exec (BReactor *bsys)
// get BFileDescriptor
BFileDescriptor *bfd = UPPER_OBJECT(tag, BFileDescriptor, kevent_tag);
ASSERT(bfd->active)
- ASSERT(bfd->kevent_returned_ptr == (int **)&event->udata)
- // zero pointer to the kevent entry
- bfd->kevent_returned_ptr = NULL;
+ // when we get to the last event for this fd, reset kevent_last_event
+ if (event_index == bfd->kevent_last_event) {
+ bfd->kevent_last_event = -1;
+ }
// calculate event to report
int events = 0;
@@ -1109,8 +1112,8 @@ int BReactor_AddFileDescriptor (BReactor *bsys, BFileDescriptor *bs)
// set kevent tag
bs->kevent_tag = KEVENT_TAG_FD;
- // set kevent returned pointer
- bs->kevent_returned_ptr = NULL;
+ // have no events
+ bs->kevent_last_event = -1;
#endif
@@ -1163,9 +1166,13 @@ void BReactor_RemoveFileDescriptor (BReactor *bsys, BFileDescriptor *bs)
// delete kevents
update_kevent_fd_events(bsys, bs, 0);
- // write through kevent returned pointer
- if (bs->kevent_returned_ptr) {
- *bs->kevent_returned_ptr = NULL;
+ // invalidate any events
+ int event_index = bs->kevent_last_event;
+ while (event_index != -1) {
+ ASSERT(event_index >= 0 && event_index < bsys->kevent_results_num)
+ struct kevent *event = &bsys->kevent_results[event_index];
+ event->udata = NULL;
+ event_index = bsys->kevent_prev_event[event_index];
}
#endif
diff --git a/system/BReactor_badvpn.h b/system/BReactor_badvpn.h
index 2c5ab4c..f945a00 100644
--- a/system/BReactor_badvpn.h
+++ b/system/BReactor_badvpn.h
@@ -203,7 +203,7 @@ typedef struct BFileDescriptor_t {
#ifdef BADVPN_USE_KEVENT
int kevent_tag;
- int **kevent_returned_ptr;
+ int kevent_last_event;
#endif
#ifdef BADVPN_USE_POLL
@@ -265,6 +265,7 @@ typedef struct {
#ifdef BADVPN_USE_KEVENT
int kqueue_fd;
struct kevent kevent_results[BSYSTEM_MAX_RESULTS];
+ int kevent_prev_event[BSYSTEM_MAX_RESULTS];
int kevent_results_num;
int kevent_results_pos;
#endif