summaryrefslogtreecommitdiff
path: root/socket.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>1998-05-20 00:20:12 +0000
committerAndrew Tridgell <tridge@samba.org>1998-05-20 00:20:12 +0000
commitde5fb3744da115dbdb66c7fbb894bf2ad9317fb7 (patch)
tree58b695f6b58bf6b374a70b9f5ed6fc9803587d15 /socket.c
parent6e47bda08e17783f3fc6800884006a5e343d75d5 (diff)
downloadrsync-de5fb3744da115dbdb66c7fbb894bf2ad9317fb7.tar.gz
added DNS spoofing test to host access control
Diffstat (limited to 'socket.c')
-rw-r--r--socket.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/socket.c b/socket.c
index 910c2dc0..acf7a1be 100644
--- a/socket.c
+++ b/socket.c
@@ -327,8 +327,10 @@ char *client_name(int fd)
int length = sizeof(sa);
static char name_buf[100];
struct hostent *hp;
+ char **p;
+ char *def = "UNKNOWN";
- strcpy(name_buf,"UNKNOWN");
+ strcpy(name_buf,def);
if (getpeername(fd, &sa, &length)) {
exit_cleanup(1);
@@ -341,5 +343,23 @@ char *client_name(int fd)
strlcpy(name_buf,(char *)hp->h_name,sizeof(name_buf) - 1);
}
+
+ /* do a forward lookup as well to prevent spoofing */
+ hp = gethostbyname(name_buf);
+ if (!hp) {
+ strcpy(name_buf,def);
+ rprintf(FERROR,"reverse name lookup failed\n");
+ } else {
+ for (p=hp->h_addr_list;*p;p++) {
+ if (memcmp(*p, &sockin->sin_addr, hp->h_length) == 0) {
+ break;
+ }
+ }
+ if (!*p) {
+ strcpy(name_buf,def);
+ rprintf(FERROR,"reverse name lookup mismatch - spoofed address?\n");
+ }
+ }
+
return name_buf;
}