-O2 broke udpxd, for some unknown reasons, revert back

This commit is contained in:
git@daemon.de
2015-04-22 10:38:44 +02:00
parent e54effb3a1
commit 6829eeecf4
3 changed files with 16 additions and 14 deletions

View File

@@ -18,8 +18,8 @@
# #
# You can contact me by mail: <tom AT vondein DOT org>. # You can contact me by mail: <tom AT vondein DOT org>.
# warning: do not set -O to 2, see TODO
CFLAGS = -Wall -Wextra -Werror -O2 -g CFLAGS = -Wall -Wextra -Werror -O1 -g
LDFLAGS= LDFLAGS=
OBJS = client.o net.o udpxd.o OBJS = client.o net.o udpxd.o
DST = udpxd DST = udpxd

1
TODO
View File

@@ -2,6 +2,7 @@ MUST:
- support ipv6 - support ipv6
- daemonize - daemonize
- syslog - syslog
- if compiled with -O2, gcc mangles the dst sockaddr_in pointers in some weird ways
MAYBE: MAYBE:
- ctrl client to view current "sessions", refresh etc - ctrl client to view current "sessions", refresh etc

25
net.c
View File

@@ -24,8 +24,8 @@
char *ntoa(struct sockaddr_in *src) { char *ntoa(struct sockaddr_in *src) {
char *ip; char *ip = malloc(32);
ip = inet_ntoa(src->sin_addr); inet_ntop(AF_INET, (struct in_addr *)&src->sin_addr, ip, 32);
return ip; return ip;
} }
@@ -85,11 +85,10 @@ void handle_inside(int inside, char *bindip, struct sockaddr_in *dst) {
int output; int output;
char *srcip; char *srcip;
char *dstip = ntoa(dst); char *dstip = ntoa(dst);
socklen_t size; size_t size = sizeof(struct sockaddr_in);
src = malloc(sizeof(struct sockaddr_in)); src = malloc(size);
len = recvfrom( inside, buffer, sizeof( buffer ), 0, len = recvfrom( inside, buffer, sizeof( buffer ), 0, (struct sockaddr*)src, (socklen_t *)&size );
(struct sockaddr*)src, &size );
srcip = ntoa(src); srcip = ntoa(src);
if(VERBOSE) { 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) { 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); perror(NULL);
} }
else { else {
@@ -131,7 +130,7 @@ void handle_inside(int inside, char *bindip, struct sockaddr_in *dst) {
/* send req out */ /* send req out */
if(sendto(output, buffer, len, 0, (struct sockaddr*)dst, size) < 0) { 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); perror(NULL);
} }
else { 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 */ /* handle answer from the outside */
@@ -159,12 +161,11 @@ void handle_outside(int inside, int outside) {
unsigned char buffer[MAX_BUFFER_SIZE]; unsigned char buffer[MAX_BUFFER_SIZE];
struct sockaddr_in *src; struct sockaddr_in *src;
client_t *client; 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, len = recvfrom( outside, buffer, sizeof( buffer ), 0, (struct sockaddr*)src, (socklen_t *)&size );
(struct sockaddr*)src, &size );
if(len > 0) { if(len > 0) {
/* do we know it? */ /* do we know it? */