Browse Source

Changing direct type cast into memory copy to solve issue #2412 and issue #9346 of openwrt/packages.

pull/2414/head
mkyybx 6 years ago
parent
commit
7b7873a664
3 changed files with 28 additions and 19 deletions
  1. 17
      src/local.c
  2. 14
      src/server.c
  3. 16
      src/udprelay.c

17
src/local.c

@ -381,7 +381,9 @@ server_handshake(EV_P_ ev_io *w, buffer_t *buf)
abuf->len += in_addr_len + 2;
if (acl || verbose) {
uint16_t p = ntohs(*(uint16_t *)(buf->data + request_len + in_addr_len));
uint16_t p;
memcpy(&p, (uint8_t*)(buf->data + request_len + in_addr_len), sizeof(uint16_t));
p = ntohs(p);
if (!inet_ntop(AF_INET, (const void *)(buf->data + request_len),
ip, INET_ADDRSTRLEN)) {
LOGI("inet_ntop(AF_INET): %s", strerror(errno));
@ -399,8 +401,9 @@ server_handshake(EV_P_ ev_io *w, buffer_t *buf)
abuf->len += name_len + 2;
if (acl || verbose) {
uint16_t p =
ntohs(*(uint16_t *)(buf->data + request_len + 1 + name_len));
uint16_t p;
memcpy(&p, (uint8_t*)(buf->data + request_len + 1 + name_len), sizeof(uint16_t));
p = ntohs(p);
memcpy(host, buf->data + request_len + 1, name_len);
host[name_len] = '\0';
sprintf(port, "%d", p);
@ -414,7 +417,9 @@ server_handshake(EV_P_ ev_io *w, buffer_t *buf)
abuf->len += in6_addr_len + 2;
if (acl || verbose) {
uint16_t p = ntohs(*(uint16_t *)(buf->data + request_len + in6_addr_len));
uint16_t p;
memcpy(&p, (uint8_t*)(buf->data + request_len + in6_addr_len), sizeof(uint16_t));
p = ntohs(p);
if (!inet_ntop(AF_INET6, (const void *)(buf->data + request_len),
ip, INET6_ADDRSTRLEN)) {
LOGI("inet_ntop(AF_INET6): %s", strerror(errno));
@ -437,7 +442,9 @@ server_handshake(EV_P_ ev_io *w, buffer_t *buf)
int hostname_len = 0;
char *hostname;
uint16_t dst_port = ntohs(*(uint16_t *)(abuf->data + abuf->len - 2));
uint16_t dst_port;
memcpy(&dst_port, (uint8_t*)(abuf->data + abuf->len - 2), sizeof(uint16_t));
dst_port = ntohs(dst_port);
if (atyp == SOCKS5_ATYP_IPV4 || atyp == SOCKS5_ATYP_IPV6) {
if (dst_port == http_protocol->default_port)

14
src/server.c

@ -803,7 +803,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
size_t in_addr_len = sizeof(struct in_addr);
addr->sin_family = AF_INET;
if (server->buf->len >= in_addr_len + 3) {
addr->sin_addr = *(struct in_addr *)(server->buf->data + offset);
memcpy(&(addr->sin_addr), (uint8_t*)(server->buf->data + offset), sizeof(struct in_addr));
inet_ntop(AF_INET, (const void *)(server->buf->data + offset),
host, INET_ADDRSTRLEN);
offset += in_addr_len;
@ -812,7 +812,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
stop_server(EV_A_ server);
return;
}
addr->sin_port = *(uint16_t *)(server->buf->data + offset);
memcpy(&(addr->sin_port), (uint8_t *)(server->buf->data + offset), sizeof(uint16_t));
info.ai_family = AF_INET;
info.ai_socktype = SOCK_STREAM;
info.ai_protocol = IPPROTO_TCP;
@ -842,7 +842,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
if (ip.version == 4) {
struct sockaddr_in *addr = (struct sockaddr_in *)&storage;
inet_pton(AF_INET, host, &(addr->sin_addr));
addr->sin_port = *(uint16_t *)(server->buf->data + offset);
memcpy(&(addr->sin_port), (uint8_t *)(server->buf->data + offset), sizeof(uint16_t));
addr->sin_family = AF_INET;
info.ai_family = AF_INET;
info.ai_addrlen = sizeof(struct sockaddr_in);
@ -850,7 +850,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
} else if (ip.version == 6) {
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&storage;
inet_pton(AF_INET6, host, &(addr->sin6_addr));
addr->sin6_port = *(uint16_t *)(server->buf->data + offset);
memcpy(&(addr->sin6_port), (uint8_t *)(server->buf->data + offset), sizeof(uint16_t));
addr->sin6_family = AF_INET6;
info.ai_family = AF_INET6;
info.ai_addrlen = sizeof(struct sockaddr_in6);
@ -870,7 +870,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
size_t in6_addr_len = sizeof(struct in6_addr);
addr->sin6_family = AF_INET6;
if (server->buf->len >= in6_addr_len + 3) {
addr->sin6_addr = *(struct in6_addr *)(server->buf->data + offset);
memcpy(&(addr->sin6_addr), (uint8_t*)(server->buf->data + offset), sizeof(struct in6_addr));
inet_ntop(AF_INET6, (const void *)(server->buf->data + offset),
host, INET6_ADDRSTRLEN);
offset += in6_addr_len;
@ -880,7 +880,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
stop_server(EV_A_ server);
return;
}
addr->sin6_port = *(uint16_t *)(server->buf->data + offset);
memcpy(&(addr->sin6_port), (uint8_t *)(server->buf->data + offset), sizeof(uint16_t));
info.ai_family = AF_INET6;
info.ai_socktype = SOCK_STREAM;
info.ai_protocol = IPPROTO_TCP;
@ -894,7 +894,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
return;
}
port = (*(uint16_t *)(server->buf->data + offset));
memcpy(&port, (uint8_t*)(server->buf->data + offset), sizeof(uint16_t));
offset += 2;

16
src/udprelay.c

@ -252,8 +252,8 @@ parse_udprelay_header(const char *buf, const size_t buf_len,
if (storage != NULL) {
struct sockaddr_in *addr = (struct sockaddr_in *)storage;
addr->sin_family = AF_INET;
addr->sin_addr = *(struct in_addr *)(buf + offset);
addr->sin_port = *(uint16_t *)(buf + offset + in_addr_len);
memcpy(&(addr->sin_addr), (uint8_t*)(buf + offset), sizeof(struct in_addr));
memcpy(&(addr->sin_port), (uint8_t*)(buf + offset + in_addr_len), sizeof(uint16_t));
}
if (host != NULL) {
inet_ntop(AF_INET, (const void *)(buf + offset),
@ -273,12 +273,12 @@ parse_udprelay_header(const char *buf, const size_t buf_len,
if (ip.version == 4) {
struct sockaddr_in *addr = (struct sockaddr_in *)storage;
inet_pton(AF_INET, tmp, &(addr->sin_addr));
addr->sin_port = *(uint16_t *)(buf + offset + 1 + name_len);
memcpy(&(addr->sin_port), (uint8_t*)(buf + offset + 1 + name_len), sizeof(uint16_t));
addr->sin_family = AF_INET;
} else if (ip.version == 6) {
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)storage;
inet_pton(AF_INET, tmp, &(addr->sin6_addr));
addr->sin6_port = *(uint16_t *)(buf + offset + 1 + name_len);
memcpy(&(addr->sin6_port), (uint8_t*)(buf + offset + 1 + name_len), sizeof(uint16_t));
addr->sin6_family = AF_INET6;
}
}
@ -295,8 +295,8 @@ parse_udprelay_header(const char *buf, const size_t buf_len,
if (storage != NULL) {
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)storage;
addr->sin6_family = AF_INET6;
addr->sin6_addr = *(struct in6_addr *)(buf + offset);
addr->sin6_port = *(uint16_t *)(buf + offset + in6_addr_len);
memcpy(&(addr->sin6_addr), (uint8_t*)(buf + offset), sizeof(struct in6_addr));
memcpy(&(addr->sin6_port), (uint8_t*)(buf + offset + in6_addr_len), sizeof(uint16_t));
}
if (host != NULL) {
inet_ntop(AF_INET6, (const void *)(buf + offset),
@ -312,7 +312,9 @@ parse_udprelay_header(const char *buf, const size_t buf_len,
}
if (port != NULL) {
sprintf(port, "%d", ntohs(*(uint16_t *)(buf + offset)));
uint16_t port_int;
memcpy(&port_int, (uint8_t*)(buf + offset), sizeof(uint16_t));
sprintf(port, "%d", ntohs(port_int);
}
offset += 2;

Loading…
Cancel
Save