diff --git a/src/local.c b/src/local.c index e14d0b50..11b3eb07 100644 --- a/src/local.c +++ b/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) diff --git a/src/server.c b/src/server.c index b7d805b8..9ca066f3 100644 --- a/src/server.c +++ b/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; diff --git a/src/udprelay.c b/src/udprelay.c index 91d6f330..acbd2cb7 100644 --- a/src/udprelay.c +++ b/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;