Skip to content
This repository was archived by the owner on Feb 6, 2024. It is now read-only.

Commit ae45488

Browse files
committed
surveyor: fix recvmsg and recvfrom
1 parent 59faf3c commit ae45488

File tree

2 files changed

+134
-69
lines changed

2 files changed

+134
-69
lines changed

infra/surveyor/default.nix

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@ let tests =
117117
test_redirectHostsDNS =
118118
''
119119
${runPort 1234}
120-
#strace -f -e trace=network \
121120
dnsmasq \
122121
--address=/www.example.com/0.0.0.42 \
123122
--address=/www.example.com/:: \
@@ -129,17 +128,14 @@ let tests =
129128
sleep 1
130129
done
131130
132-
strace -f -e trace=network \
133-
-E SRV_MAP="0.0.0.42:80:127.0.0.1:1234 127.0.0.1:53:127.0.0.1:8053" \
134-
-E LD_PRELOAD="${surveyor}/lib/surveyor.so" \
135-
nslookup www.example.com
131+
SRV_MAP="0.0.0.42:80:127.0.0.1:1234 127.0.0.1:53:127.0.0.1:8053" \
132+
LD_PRELOAD="${surveyor}/lib/surveyor.so" \
133+
nslookup www.example.com | grep -q 'Address: 0.0.0.42'
136134
137-
exit 55
138135
139-
strace -f -e trace=network \
140-
-E SRV_MAP="0.0.0.42:80:127.0.0.1:1234 127.0.0.1:53:127.0.0.1:8053" \
141-
-E LD_PRELOAD="${surveyor}/lib/surveyor.so" \
142-
curl -s www.example.com | grep -q '1234'
136+
SRV_MAP="0.0.0.42:80:127.0.0.1:1234 127.0.0.1:53:127.0.0.1:8053" \
137+
LD_PRELOAD="${surveyor}/lib/surveyor.so" \
138+
curl www.example.com | grep -q '1234'
143139
'';
144140
}; in
145141

infra/surveyor/surveyor.c

Lines changed: 128 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,26 @@ srv_mapping * srv_find_mapping(const struct sockaddr_in *addr_in)
6262
return NULL;
6363
}
6464

65+
// TODO: attribute hidden
66+
srv_mapping * srv_find_mapping_to(const struct sockaddr_in *addr_in)
67+
{
68+
for (int i = 0; i < n_mappings; i ++)
69+
{
70+
if (mappings[i].addr_to == NULL ||
71+
(*mappings[i].addr_to).s_addr == (addr_in->sin_addr).s_addr)
72+
{
73+
if(mappings[i].port_to == 0 ||
74+
mappings[i].port_to == addr_in->sin_port)
75+
{
76+
fprintf(stderr, "WE HAVE A MATCH!!!!!!\n");
77+
return mappings + i;
78+
}
79+
}
80+
}
81+
82+
return NULL;
83+
}
84+
6585

6686
void _fini(void)
6787
{
@@ -365,47 +385,69 @@ ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags)
365385
}
366386
}
367387

388+
// TODO: this is still wrong
368389
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
369390
struct sockaddr *src_addr, socklen_t *addrlen)
370391
{
371-
fprintf(stderr, "Entering recvfrom(2)\n");
372-
373-
if (src_addr->sa_family != AF_INET) {
374-
fprintf(stderr, "No AF_INET, skipping\n");
375-
return super_recvfrom(sockfd, buf, len, flags, src_addr, addrlen);
376-
}
377-
378392
static struct sockaddr_in *src_addr_in;
379393
src_addr_in = (struct sockaddr_in *)src_addr;
380394

381-
srv_mapping * mapping = srv_find_mapping(src_addr_in);
395+
fprintf(stderr, "Entering recvfrom(2)\n");
382396

383-
if(mapping)
397+
if (src_addr->sa_family != AF_INET) {
398+
fprintf(stderr, "No AF_INET, skipping\n");
399+
} else
384400
{
385-
386-
in_port_t old_port = src_addr_in->sin_port;
387-
struct in_addr old_addr = src_addr_in->sin_addr;
388-
389-
if(mapping->port_to != 0)
401+
srv_mapping * mapping = srv_find_mapping(src_addr_in);
402+
if(!mapping)
390403
{
391-
src_addr_in->sin_port = mapping->port_to;
392-
}
393-
394-
if(mapping->addr_to != NULL)
404+
fprintf(stderr, "No mapping\n");
405+
} else
395406
{
396-
src_addr_in->sin_addr = *mapping->addr_to;
397-
}
407+
fprintf(stderr, "Found mapping\n");
398408

399-
ssize_t res;
400-
res = super_recvfrom(sockfd, buf, len, flags, src_addr, addrlen);
409+
if(mapping->port_to != 0)
410+
{
411+
src_addr_in->sin_port = mapping->port_to;
412+
}
401413

402-
src_addr_in->sin_port = old_port;
403-
src_addr_in->sin_addr = old_addr;
414+
if(mapping->addr_to != NULL)
415+
{
416+
src_addr_in->sin_addr = *mapping->addr_to;
417+
}
418+
}
419+
}
404420

421+
ssize_t res = super_recvfrom(sockfd, buf, len, flags, src_addr, addrlen);
422+
423+
if(src_addr_in->sin_family != AF_INET)
424+
{
425+
fprintf(stderr, "AFTER: recvfrom: No AF_INET, skipping\n");
405426
return res;
406427
} else
407428
{
408-
return super_recvfrom(sockfd, buf, len, flags, src_addr, addrlen);
429+
fprintf(stderr, "AFTER: Found AF_INET\n");
430+
431+
srv_mapping * mapping = srv_find_mapping_to(src_addr_in);
432+
if(!mapping)
433+
{
434+
fprintf(stderr, "AFTER: No mapping\n");
435+
return res;
436+
} else
437+
{
438+
fprintf(stderr, "AFTER: Found mapping\n");
439+
if(mapping->port_from != 0)
440+
{
441+
fprintf(stderr, "AFTER: Setting port\n");
442+
src_addr_in->sin_port = mapping->port_from;
443+
}
444+
if(mapping->addr_from != NULL)
445+
{
446+
fprintf(stderr, "AFTER: Setting addr\n");
447+
src_addr_in->sin_addr = *mapping->addr_from;
448+
}
449+
return res;
450+
}
409451
}
410452
}
411453

@@ -416,50 +458,77 @@ ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags)
416458
if(msg->msg_name == NULL)
417459
{
418460
fprintf(stderr, "No msg_name, skipping\n");
419-
return super_sendmsg(sockfd, msg, flags);
420-
}
421-
461+
} else
462+
{
463+
fprintf(stderr, "Found msg_name\n");
464+
struct sockaddr_in *src_addr_in = msg->msg_name;
422465

423-
struct sockaddr_in *src_addr_in = msg->msg_name;
466+
if(src_addr_in->sin_family != AF_INET)
467+
{
468+
fprintf(stderr, "recvmsg: No AF_INET, skipping\n");
469+
} else
470+
{
471+
fprintf(stderr, "Found AF_INET\n");
472+
srv_mapping * mapping = srv_find_mapping(src_addr_in);
473+
if(!mapping)
474+
{
475+
fprintf(stderr, "No mapping\n");
476+
} else
477+
{
478+
fprintf(stderr, "Found mapping\n");
424479

425-
fprintf(stderr, "recvmsg: msg_namelen: %d\n", msg->msg_namelen);
426-
fprintf(stderr, "recvmsg: AF_INET: %d vs %d\n", AF_INET, src_addr_in->sin_family);
480+
if(mapping->port_to != 0)
481+
{
482+
src_addr_in->sin_port = mapping->port_to;
483+
}
427484

428-
if(src_addr_in->sin_family != AF_INET)
429-
{
430-
fprintf(stderr, "recvmsg: No AF_INET, skipping\n");
431-
return super_recvmsg(sockfd, msg, flags);
485+
if(mapping->addr_to != NULL)
486+
{
487+
src_addr_in->sin_addr = *mapping->addr_to;
488+
}
489+
}
490+
}
432491
}
433492

434-
srv_mapping * mapping = srv_find_mapping(src_addr_in);
493+
ssize_t res = super_recvmsg(sockfd, msg, flags);
435494

436-
if(mapping)
495+
if(msg->msg_name == NULL)
496+
{
497+
fprintf(stderr, "AFTER: No msg_name, skipping\n");
498+
return res;
499+
} else
437500
{
438-
in_port_t old_port = src_addr_in->sin_port;
439-
struct in_addr old_addr = src_addr_in->sin_addr;
501+
fprintf(stderr, "AFTER: Found msg_name\n");
502+
struct sockaddr_in *src_addr_in = msg->msg_name;
440503

441-
if(mapping->port_to != 0)
504+
if(src_addr_in->sin_family != AF_INET)
442505
{
443-
src_addr_in->sin_port = mapping->port_to;
444-
}
445-
446-
if(mapping->addr_to != NULL)
506+
fprintf(stderr, "AFTER: recvmsg: No AF_INET, skipping\n");
507+
return res;
508+
} else
447509
{
448-
src_addr_in->sin_addr = *mapping->addr_to;
449-
}
450-
451-
ssize_t res;
452-
res = super_recvmsg(sockfd, msg, flags);
510+
fprintf(stderr, "AFTER: Found AF_INET\n");
453511

454-
src_addr_in->sin_port = old_port;
455-
src_addr_in->sin_addr = old_addr;
456-
457-
return res;
458-
459-
460-
} else
461-
{
462-
return super_recvmsg(sockfd, msg, flags);
512+
srv_mapping * mapping = srv_find_mapping_to(src_addr_in);
513+
if(!mapping)
514+
{
515+
fprintf(stderr, "AFTER: No mapping\n");
516+
return res;
517+
} else
518+
{
519+
fprintf(stderr, "AFTER: Found mapping\n");
520+
if(mapping->port_from != 0)
521+
{
522+
fprintf(stderr, "AFTER: Setting port\n");
523+
src_addr_in->sin_port = mapping->port_from;
524+
}
525+
if(mapping->addr_from != NULL)
526+
{
527+
fprintf(stderr, "AFTER: Setting addr\n");
528+
src_addr_in->sin_addr = *mapping->addr_from;
529+
}
530+
return res;
531+
}
532+
}
463533
}
464-
465534
}

0 commit comments

Comments
 (0)