diff --git a/Makefile b/Makefile index 1887e54..2b1d09d 100644 --- a/Makefile +++ b/Makefile @@ -18,8 +18,8 @@ # # You can contact me by mail: . - -CFLAGS = -Wall -Wextra -Werror -O2 -g +# warning: do not set -O to 2, see TODO +CFLAGS = -Wall -Wextra -Werror -O1 -g LDFLAGS= OBJS = client.o net.o udpxd.o DST = udpxd diff --git a/TODO b/TODO index a0bae1e..a9366b2 100644 --- a/TODO +++ b/TODO @@ -2,6 +2,7 @@ MUST: - support ipv6 - daemonize - syslog +- if compiled with -O2, gcc mangles the dst sockaddr_in pointers in some weird ways MAYBE: - ctrl client to view current "sessions", refresh etc diff --git a/net.c b/net.c index eacbc96..32df7ba 100644 --- a/net.c +++ b/net.c @@ -24,8 +24,8 @@ char *ntoa(struct sockaddr_in *src) { - char *ip; - ip = inet_ntoa(src->sin_addr); + char *ip = malloc(32); + inet_ntop(AF_INET, (struct in_addr *)&src->sin_addr, ip, 32); return ip; } @@ -85,11 +85,10 @@ void handle_inside(int inside, char *bindip, struct sockaddr_in *dst) { int output; char *srcip; char *dstip = ntoa(dst); - socklen_t size; - src = malloc(sizeof(struct sockaddr_in)); + size_t size = sizeof(struct sockaddr_in); + src = malloc(size); - len = recvfrom( inside, buffer, sizeof( buffer ), 0, - (struct sockaddr*)src, &size ); + len = recvfrom( inside, buffer, sizeof( buffer ), 0, (struct sockaddr*)src, (socklen_t *)&size ); srcip = ntoa(src); if(VERBOSE) { @@ -109,7 +108,7 @@ void handle_inside(int inside, char *bindip, struct sockaddr_in *dst) { } if(sendto(client->socket, buffer, len, 0, (struct sockaddr*)dst, size) < 0) { - fprintf(stderr, "unable to forward to %s%d", dstip, ntohs(dst->sin_port)); + fprintf(stderr, "unable to forward to %s:%d\n", dstip, ntohs(dst->sin_port)); perror(NULL); } else { @@ -131,7 +130,7 @@ void handle_inside(int inside, char *bindip, struct sockaddr_in *dst) { /* send req out */ if(sendto(output, buffer, len, 0, (struct sockaddr*)dst, size) < 0) { - fprintf(stderr, "unable to forward to %s%d", dstip, ntohs(dst->sin_port)); + fprintf(stderr, "unable to forward to %s:%d\n", dstip, ntohs(dst->sin_port)); perror(NULL); } else { @@ -151,6 +150,9 @@ void handle_inside(int inside, char *bindip, struct sockaddr_in *dst) { } } } + + free(dstip); + free(srcip); } /* handle answer from the outside */ @@ -159,12 +161,11 @@ void handle_outside(int inside, int outside) { unsigned char buffer[MAX_BUFFER_SIZE]; struct sockaddr_in *src; client_t *client; - socklen_t size; - src = malloc(sizeof(struct sockaddr_in)); + size_t size = sizeof(struct sockaddr_in); + src = malloc(size); - len = recvfrom( outside, buffer, sizeof( buffer ), 0, - (struct sockaddr*)src, &size ); + len = recvfrom( outside, buffer, sizeof( buffer ), 0, (struct sockaddr*)src, (socklen_t *)&size ); if(len > 0) { /* do we know it? */