fix the core when acceptfd_sk_t->ep is null and dereference it in acceptfd_sk_delete

This commit is contained in:
496148326@qq.com 2024-01-15 06:42:49 +00:00 committed by ob-robot
parent 0ab14a6721
commit 165bd11da4
2 changed files with 21 additions and 10 deletions

View File

@ -36,9 +36,11 @@ static void clientfd_sk_delete(ussl_sf_t *sf, clientfd_sk_t *s)
if (s->has_error) {
shutdown(s->fd, SHUT_WR);
}
if (0 != (ret = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) {
ussl_log_warn("delete client fd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd,
s->fd, errno);
if (NULL != s->ep) {
if (0 != (ret = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) {
ussl_log_warn("delete client fd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd,
s->fd, errno);
}
}
if (0 != (ret = libc_epoll_ctl(s->fd_info.org_epfd, EPOLL_CTL_ADD,
s->fd_info.client_fd, &s->fd_info.event))) {
@ -72,6 +74,8 @@ static acceptfd_sk_t *acceptfd_sk_new(ussl_sf_t *sf)
s->type = SERVER_SOCK;
s->has_error = 0;
s->start_time = time(NULL);
s->fd = -1;
s->ep = NULL;
ussl_dlink_init(&s->timeout_link);
}
return s;
@ -86,7 +90,9 @@ static void acceptfd_sk_delete(ussl_sf_t *sf, acceptfd_sk_t *s)
int err = 0;
if (s->has_error) {
} else {
if (0 != (err = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) {
if (NULL == s->ep) {
need_close = 1;
} else if (0 != (err = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) {
ussl_log_warn("remove acceptfd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd, s->fd,
errno);
} else if (0 != (err = dispatch_accept_fd_to_certain_group(s->fd, s->fd_info.client_gid))) {
@ -96,9 +102,11 @@ static void acceptfd_sk_delete(ussl_sf_t *sf, acceptfd_sk_t *s)
}
}
if (need_close) {
if (0 != (err = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) {
ussl_log_warn("delete accept fd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd,
s->fd, errno);
if (NULL != s->ep) {
if (0 != (err = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) {
ussl_log_warn("delete accept fd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd,
s->fd, errno);
}
}
if (0 != (err = ussl_close(s->fd))) {
ussl_log_warn("ussl_close failed, fd:%d, errno:%d", s->fd, errno);

View File

@ -41,11 +41,14 @@ void ussl_on_accept(int fd, ussl_sf_t *sf, ussl_eloop_t *ep)
}
}
if (!add_succ) {
if (fd >= 0) {
close(fd);
}
if (NULL != ns) {
ns->has_error = 1;
ns->fd = fd;
sf->destroy(sf, ns);
} else {
if (fd >= 0) {
close(fd);
}
}
}
}