Browse Source

Fix another potential out of bound access. #1465

pull/752/merge
Max Lv 8 years ago
parent
commit
d252da8d83
1 changed files with 10 additions and 10 deletions
  1. 20
      src/server.c

20
src/server.c

@ -516,7 +516,7 @@ connect_to_remote(EV_P_ struct addrinfo *res,
endpoints.sae_dstaddrlen = res->ai_addrlen; endpoints.sae_dstaddrlen = res->ai_addrlen;
struct iovec iov; struct iovec iov;
iov.iov_base = server->buf->data + server->buf->idx;
iov.iov_base = server->buf->data;
iov.iov_len = server->buf->len; iov.iov_len = server->buf->len;
size_t len; size_t len;
int s = connectx(sockfd, &endpoints, SAE_ASSOCID_ANY, CONNECT_DATA_IDEMPOTENT, int s = connectx(sockfd, &endpoints, SAE_ASSOCID_ANY, CONNECT_DATA_IDEMPOTENT,
@ -525,9 +525,8 @@ connect_to_remote(EV_P_ struct addrinfo *res,
s = len; s = len;
} }
#else #else
ssize_t s = sendto(sockfd, server->buf->data + server->buf->idx,
server->buf->len, MSG_FASTOPEN, res->ai_addr,
res->ai_addrlen);
ssize_t s = sendto(sockfd, server->buf->data, server->buf->len,
MSG_FASTOPEN, res->ai_addr, res->ai_addrlen);
#endif #endif
if (s == -1) { if (s == -1) {
if (errno == CONNECT_IN_PROGRESS || errno == EAGAIN if (errno == CONNECT_IN_PROGRESS || errno == EAGAIN
@ -542,12 +541,9 @@ connect_to_remote(EV_P_ struct addrinfo *res,
} else { } else {
ERROR("sendto"); ERROR("sendto");
} }
} else if (s <= server->buf->len) {
} else {
server->buf->idx += s; server->buf->idx += s;
server->buf->len -= s; server->buf->len -= s;
} else {
server->buf->idx = 0;
server->buf->len = 0;
} }
} }
#endif #endif
@ -885,7 +881,9 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
// XXX: should handle buffer carefully // XXX: should handle buffer carefully
if (server->buf->len > 0) { if (server->buf->len > 0) {
memcpy(remote->buf->data, server->buf->data, server->buf->len);
brealloc(remote->buf, server->buf->len, BUF_SIZE);
memcpy(remote->buf->data, server->buf->data + server->buf->idx,
server->buf->len);
remote->buf->len = server->buf->len; remote->buf->len = server->buf->len;
remote->buf->idx = 0; remote->buf->idx = 0;
server->buf->len = 0; server->buf->len = 0;
@ -1041,7 +1039,9 @@ server_resolve_cb(struct sockaddr *addr, void *data)
// XXX: should handle buffer carefully // XXX: should handle buffer carefully
if (server->buf->len > 0) { if (server->buf->len > 0) {
memcpy(remote->buf->data, server->buf->data, server->buf->len);
brealloc(remote->buf, server->buf->len, BUF_SIZE);
memcpy(remote->buf->data, server->buf->data + server->buf->idx,
server->buf->len);
remote->buf->len = server->buf->len; remote->buf->len = server->buf->len;
remote->buf->idx = 0; remote->buf->idx = 0;
server->buf->len = 0; server->buf->len = 0;

Loading…
Cancel
Save