diff --git a/kqueue.c b/kqueue.c index 9a249511..d08f512c 100644 --- a/kqueue.c +++ b/kqueue.c @@ -37,6 +37,7 @@ #endif #include #include +#include #include #include #include @@ -208,15 +209,17 @@ kq_build_changes_list(const struct event_changelist *changelist, struct event_change *in_ch = &changelist->changes[i]; struct kevent *out_ch; if (n_changes >= kqop->changes_size - 1) { - int newsize = kqop->changes_size * 2; + int newsize; struct kevent *newchanges; - if (newsize < 0 || (size_t)newsize > - EV_SIZE_MAX / sizeof(struct kevent)) { + if (kqop->changes_size > INT_MAX / 2 || + (size_t)kqop->changes_size * 2 > EV_SIZE_MAX / + sizeof(struct kevent)) { event_warnx("%s: int overflow", __func__); return (-1); } + newsize = kqop->changes_size * 2; newchanges = mm_realloc(kqop->changes, newsize * sizeof(struct kevent)); if (newchanges == NULL) {