Call underlying bev ctrl SET_FD on filtered bufferevents

If a bufferevent_filter is set on an underlying bufferevent which has
ctrl functions, bufferevent_filter needs to handle this.

For now I have added just BEV_CTRL_SET_FD, since this is needed for
bufferevent_sock to assign file descriptors to the proper
bufferevent_read/write callbacks.

A good example of the problem can be found in issue #237
https://github.com/libevent/libevent/issues/237
This commit is contained in:
Mark Ellzey 2015-05-05 10:37:00 -07:00
parent a695a720cd
commit c2aa7dcb70

View File

@ -536,10 +536,20 @@ be_filter_ctrl(struct bufferevent *bev, enum bufferevent_ctrl_op op,
bevf = upcast(bev); bevf = upcast(bev);
data->ptr = bevf->underlying; data->ptr = bevf->underlying;
return 0; return 0;
case BEV_CTRL_GET_FD:
case BEV_CTRL_SET_FD: case BEV_CTRL_SET_FD:
bevf = upcast(bev);
if (bevf->underlying &&
bevf->underlying->be_ops &&
bevf->underlying->be_ops->ctrl) {
return (bevf->underlying->be_ops->ctrl)(bevf->underlying, op, data);
}
case BEV_CTRL_GET_FD:
case BEV_CTRL_CANCEL_ALL: case BEV_CTRL_CANCEL_ALL:
default: default:
return -1; return -1;
} }
return -1;
} }