diff --git a/extend.c b/extend.c index 92abe93..b91edf1 100644 --- a/extend.c +++ b/extend.c @@ -90,7 +90,7 @@ int mode_add_get(struct sockaddr_ina *dst, int m) } -inline bool check_port(uint16_t *p, struct sockaddr_in6 *dst) +static inline bool check_port(uint16_t *p, struct sockaddr_in6 *dst) { return (dst->sin6_port >= p[0] && dst->sin6_port <= p[1]); diff --git a/packets.c b/packets.c index 52fd278..f669796 100644 --- a/packets.c +++ b/packets.c @@ -17,6 +17,10 @@ #define ANTOHS(data, i) \ (uint16_t)((data[i] << 8) + (uint8_t)data[i + 1]) +#define SHTONA(data, i, x) \ + data[i] = (uint8_t)(x >> 8); \ + data[i + 1] = x & 0xff; + char tls_data[517] = { "\x16\x03\x01\x02\x00\x01\x00\x01\xfc\x03\x03\x03\x5f" @@ -137,10 +141,10 @@ int change_tls_sni(const char *host, char *buffer, size_t bsize) || free_sz < diff) { return -1; } - *(uint16_t *)(sni + 2) = htons(old_sz + diff + 5); - *(uint16_t *)(sni + 4) = htons(old_sz + diff + 3); - *(uint16_t *)(sni + 7) = htons(old_sz + diff); - *(uint16_t *)(pad + 2) = htons(free_sz - diff); + SHTONA(sni, 2, old_sz + diff + 5); + SHTONA(sni, 4, old_sz + diff + 3); + SHTONA(sni, 7, old_sz + diff); + SHTONA(pad, 2, free_sz - diff); char *host_end = sni + 9 + old_sz; int oth_sz = bsize - (sni_offs + 9 + old_sz); @@ -410,7 +414,7 @@ int part_tls(char *buffer, size_t bsize, ssize_t n, long pos) memmove(buffer + 5 + pos + 5, buffer + 5 + pos, n - (5 + pos)); memcpy(buffer + 5 + pos, buffer, 3); - *(uint16_t *)(buffer + 3) = htons(pos); - *(uint16_t *)(buffer + 5 + pos + 3) = htons(r_sz - pos); + SHTONA(buffer, 3, pos); + SHTONA(buffer, 5 + pos + 3, r_sz - pos); return 5; } diff --git a/proxy.c b/proxy.c index c631d88..de5ad7a 100644 --- a/proxy.c +++ b/proxy.c @@ -274,7 +274,7 @@ int s5_get_addr(char *buffer, size_t n, addr->in6.sin6_addr = r->i6; } } - addr->in.sin_port = *(uint16_t *)&buffer[o - 2]; + memcpy(&addr->in.sin_port, &buffer[o - 2], sizeof(uint16_t)); return o; }