mirror of
https://github.com/darkk/redsocks.git
synced 2025-08-26 03:35:30 +00:00
Avoid EBADF warnings from epoll using bufferevent_free more accurately
This commit is contained in:
parent
5c716327b2
commit
4e222f3f27
@ -132,8 +132,7 @@ static void httpc_read_cb(struct bufferevent *buffev, void *_arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* close relay tunnel */
|
/* close relay tunnel */
|
||||||
redsocks_close(EVENT_FD(&client->relay->ev_write));
|
redsocks_bufferevent_free(client->relay);
|
||||||
bufferevent_free(client->relay);
|
|
||||||
|
|
||||||
/* set to initial state*/
|
/* set to initial state*/
|
||||||
client->state = httpc_new;
|
client->state = httpc_new;
|
||||||
|
@ -205,8 +205,7 @@ static void httpr_relay_read_cb(struct bufferevent *buffev, void *_arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* close relay tunnel */
|
/* close relay tunnel */
|
||||||
redsocks_close(EVENT_FD(&client->relay->ev_write));
|
redsocks_bufferevent_free(client->relay);
|
||||||
bufferevent_free(client->relay);
|
|
||||||
|
|
||||||
/* set to initial state*/
|
/* set to initial state*/
|
||||||
client->state = httpr_recv_request_headers;
|
client->state = httpr_recv_request_headers;
|
||||||
|
20
redsocks.c
20
redsocks.c
@ -352,15 +352,11 @@ void redsocks_drop_client(redsocks_client *client)
|
|||||||
if (client->instance->relay_ss->fini)
|
if (client->instance->relay_ss->fini)
|
||||||
client->instance->relay_ss->fini(client);
|
client->instance->relay_ss->fini(client);
|
||||||
|
|
||||||
if (client->client) {
|
if (client->client)
|
||||||
redsocks_close(EVENT_FD(&client->client->ev_write));
|
redsocks_bufferevent_free(client->client);
|
||||||
bufferevent_free(client->client);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client->relay) {
|
if (client->relay)
|
||||||
redsocks_close(EVENT_FD(&client->relay->ev_write));
|
redsocks_bufferevent_free(client->relay);
|
||||||
bufferevent_free(client->relay);
|
|
||||||
}
|
|
||||||
|
|
||||||
list_del(&client->list);
|
list_del(&client->list);
|
||||||
free(client);
|
free(client);
|
||||||
@ -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)
|
static void redsocks_accept_client(int fd, short what, void *_arg)
|
||||||
{
|
{
|
||||||
redsocks_instance *self = _arg;
|
redsocks_instance *self = _arg;
|
||||||
|
@ -94,6 +94,9 @@ int redsocks_write_helper(
|
|||||||
#define redsocks_close(fd) redsocks_close_internal((fd), __FILE__, __LINE__, __func__)
|
#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);
|
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...) \
|
#define redsocks_log_error(client, prio, msg...) \
|
||||||
redsocks_log_write_plain(__FILE__, __LINE__, __func__, 0, &(client)->clientaddr, &(client)->destaddr, prio, ## msg)
|
redsocks_log_write_plain(__FILE__, __LINE__, __func__, 0, &(client)->clientaddr, &(client)->destaddr, prio, ## msg)
|
||||||
#define redsocks_log_errno(client, prio, msg...) \
|
#define redsocks_log_errno(client, prio, msg...) \
|
||||||
|
11
redudp.c
11
redudp.c
@ -214,21 +214,16 @@ static struct evbuffer* socks5_mkassociate(void *p)
|
|||||||
*/
|
*/
|
||||||
static void redudp_drop_client(redudp_client *client)
|
static void redudp_drop_client(redudp_client *client)
|
||||||
{
|
{
|
||||||
int fd;
|
|
||||||
redudp_log_error(client, LOG_INFO, "Dropping...");
|
redudp_log_error(client, LOG_INFO, "Dropping...");
|
||||||
enqueued_packet *q, *tmp;
|
enqueued_packet *q, *tmp;
|
||||||
if (event_initialized(&client->timeout)) {
|
if (event_initialized(&client->timeout)) {
|
||||||
if (event_del(&client->timeout) == -1)
|
if (event_del(&client->timeout) == -1)
|
||||||
redudp_log_errno(client, LOG_ERR, "event_del");
|
redudp_log_errno(client, LOG_ERR, "event_del");
|
||||||
}
|
}
|
||||||
if (client->relay) {
|
if (client->relay)
|
||||||
fd = EVENT_FD(&client->relay->ev_read);
|
redsocks_bufferevent_free(client->relay);
|
||||||
bufferevent_free(client->relay);
|
|
||||||
shutdown(fd, SHUT_RDWR);
|
|
||||||
redsocks_close(fd);
|
|
||||||
}
|
|
||||||
if (event_initialized(&client->udprelay)) {
|
if (event_initialized(&client->udprelay)) {
|
||||||
fd = EVENT_FD(&client->udprelay);
|
int fd = EVENT_FD(&client->udprelay);
|
||||||
if (event_del(&client->udprelay) == -1)
|
if (event_del(&client->udprelay) == -1)
|
||||||
redudp_log_errno(client, LOG_ERR, "event_del");
|
redudp_log_errno(client, LOG_ERR, "event_del");
|
||||||
redsocks_close(fd);
|
redsocks_close(fd);
|
||||||
|
4
utils.c
4
utils.c
@ -149,6 +149,8 @@ struct bufferevent* red_connect_relay(struct sockaddr_in *addr, evbuffercb write
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
relay_fd = -1;
|
||||||
|
|
||||||
error = bufferevent_enable(retval, EV_WRITE); // we wait for connection...
|
error = bufferevent_enable(retval, EV_WRITE); // we wait for connection...
|
||||||
if (error) {
|
if (error) {
|
||||||
log_errno(LOG_ERR, "bufferevent_enable");
|
log_errno(LOG_ERR, "bufferevent_enable");
|
||||||
@ -161,7 +163,7 @@ fail:
|
|||||||
if (relay_fd != -1)
|
if (relay_fd != -1)
|
||||||
redsocks_close(relay_fd);
|
redsocks_close(relay_fd);
|
||||||
if (retval)
|
if (retval)
|
||||||
bufferevent_free(retval);
|
redsocks_bufferevent_free(retval);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user