Skip to content

Commit

Permalink
Avoid EBADF warnings from epoll using bufferevent_free more accurately
Browse files Browse the repository at this point in the history
  • Loading branch information
darkk committed Mar 17, 2016
1 parent 5c71632 commit 4e222f3
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 21 deletions.
3 changes: 1 addition & 2 deletions http-connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,7 @@ static void httpc_read_cb(struct bufferevent *buffev, void *_arg)
}

/* close relay tunnel */
redsocks_close(EVENT_FD(&client->relay->ev_write));
bufferevent_free(client->relay);
redsocks_bufferevent_free(client->relay);

/* set to initial state*/
client->state = httpc_new;
Expand Down
3 changes: 1 addition & 2 deletions http-relay.c
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,7 @@ static void httpr_relay_read_cb(struct bufferevent *buffev, void *_arg)
}

/* close relay tunnel */
redsocks_close(EVENT_FD(&client->relay->ev_write));
bufferevent_free(client->relay);
redsocks_bufferevent_free(client->relay);

/* set to initial state*/
client->state = httpr_recv_request_headers;
Expand Down
20 changes: 12 additions & 8 deletions redsocks.c
Original file line number Diff line number Diff line change
Expand Up @@ -352,15 +352,11 @@ void redsocks_drop_client(redsocks_client *client)
if (client->instance->relay_ss->fini)
client->instance->relay_ss->fini(client);

if (client->client) {
redsocks_close(EVENT_FD(&client->client->ev_write));
bufferevent_free(client->client);
}
if (client->client)
redsocks_bufferevent_free(client->client);

if (client->relay) {
redsocks_close(EVENT_FD(&client->relay->ev_write));
bufferevent_free(client->relay);
}
if (client->relay)
redsocks_bufferevent_free(client->relay);

list_del(&client->list);
free(client);
Expand Down Expand Up @@ -634,6 +630,14 @@ void redsocks_close_internal(int fd, const char* file, int line, const char *fun
}
}

void redsocks_bufferevent_free(struct bufferevent *buffev)
{
int fd = bufferevent_getfd(buffev);
bufferevent_setfd(buffev, -1); // to avoid EBADFD warnings from epoll
bufferevent_free(buffev);
redsocks_close(fd);
}

static void redsocks_accept_client(int fd, short what, void *_arg)
{
redsocks_instance *self = _arg;
Expand Down
3 changes: 3 additions & 0 deletions redsocks.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ int redsocks_write_helper(
#define redsocks_close(fd) redsocks_close_internal((fd), __FILE__, __LINE__, __func__)
void redsocks_close_internal(int fd, const char* file, int line, const char *func);

// I have to account descriptiors for accept-backoff, that's why BEV_OPT_CLOSE_ON_FREE is not used.
void redsocks_bufferevent_free(struct bufferevent *buffev);

#define redsocks_log_error(client, prio, msg...) \
redsocks_log_write_plain(__FILE__, __LINE__, __func__, 0, &(client)->clientaddr, &(client)->destaddr, prio, ## msg)
#define redsocks_log_errno(client, prio, msg...) \
Expand Down
11 changes: 3 additions & 8 deletions redudp.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,21 +214,16 @@ static struct evbuffer* socks5_mkassociate(void *p)
*/
static void redudp_drop_client(redudp_client *client)
{
int fd;
redudp_log_error(client, LOG_INFO, "Dropping...");
enqueued_packet *q, *tmp;
if (event_initialized(&client->timeout)) {
if (event_del(&client->timeout) == -1)
redudp_log_errno(client, LOG_ERR, "event_del");
}
if (client->relay) {
fd = EVENT_FD(&client->relay->ev_read);
bufferevent_free(client->relay);
shutdown(fd, SHUT_RDWR);
redsocks_close(fd);
}
if (client->relay)
redsocks_bufferevent_free(client->relay);
if (event_initialized(&client->udprelay)) {
fd = EVENT_FD(&client->udprelay);
int fd = EVENT_FD(&client->udprelay);
if (event_del(&client->udprelay) == -1)
redudp_log_errno(client, LOG_ERR, "event_del");
redsocks_close(fd);
Expand Down
4 changes: 3 additions & 1 deletion utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ struct bufferevent* red_connect_relay(struct sockaddr_in *addr, evbuffercb write
goto fail;
}

relay_fd = -1;

error = bufferevent_enable(retval, EV_WRITE); // we wait for connection...
if (error) {
log_errno(LOG_ERR, "bufferevent_enable");
Expand All @@ -161,7 +163,7 @@ struct bufferevent* red_connect_relay(struct sockaddr_in *addr, evbuffercb write
if (relay_fd != -1)
redsocks_close(relay_fd);
if (retval)
bufferevent_free(retval);
redsocks_bufferevent_free(retval);
return NULL;
}

Expand Down

0 comments on commit 4e222f3

Please sign in to comment.