aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2009-02-09 03:12:02 +0000
committerNick Mathewson <nickm@torproject.org>2009-02-09 03:12:02 +0000
commit4c7a8841298cc2633fefa63730f591d4ddb4e015 (patch)
tree19c1ab88abc484a66472a80693ce6f2044b01cd9
parent248805262d5634109a86a65e0465c5c299aa6b21 (diff)
downloadtor-4c7a8841298cc2633fefa63730f591d4ddb4e015.tar.gz
tor-4c7a8841298cc2633fefa63730f591d4ddb4e015.zip
Backport r17887: stop accepting 1.2.3 as a valid IPv4 address. This has security implications.
svn:r18419
-rw-r--r--ChangeLog2
-rw-r--r--src/common/compat.c30
-rw-r--r--src/or/eventdns.c15
3 files changed, 12 insertions, 35 deletions
diff --git a/ChangeLog b/ChangeLog
index dfd70d4eb5..79c0ed944b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -10,6 +10,8 @@ Changes in version 0.2.0.34 - 2009-02-08
Patch from Matthias Drochner.
- Don't consider expiring already-closed client connections. Fixes
bug 893. Bugfix on 0.0.2pre20.
+ - Do not accept incomplete ipv4 addresses (like 192.168.0) as valid.
+ Spec conformance issue. Bugfix on Tor 0.0.2pre27.
Changes in version 0.2.0.33 - 2009-01-21
diff --git a/src/common/compat.c b/src/common/compat.c
index f903d1ffb6..d56815c571 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -115,12 +115,6 @@ const char compat_c_id[] =
#include "strlcat.c"
#endif
-#ifndef INADDR_NONE
-/* This is used by inet_addr, but apparently Solaris doesn't define it
- * anyplace. */
-#define INADDR_NONE ((unsigned long) -1)
-#endif
-
#ifdef HAVE_SYS_MMAN_H
/** Implementation for tor_mmap_t: holds the regular tor_mmap_t, along
* with extra fields needed for mmap()-based memory mapping. */
@@ -1169,24 +1163,18 @@ get_user_homedir(const char *username)
* but works on Windows and Solaris.)
*/
int
-tor_inet_aton(const char *c, struct in_addr* addr)
+tor_inet_aton(const char *str, struct in_addr* addr)
{
-#ifdef HAVE_INET_ATON
- return inet_aton(c, addr);
-#else
- uint32_t r;
- tor_assert(c);
- tor_assert(addr);
- if (strcmp(c, "255.255.255.255") == 0) {
- addr->s_addr = 0xFFFFFFFFu;
- return 1;
- }
- r = inet_addr(c);
- if (r == INADDR_NONE)
+ int a,b,c,d;
+ char more;
+ if (sscanf(str, "%d.%d.%d.%d%c", &a,&b,&c,&d,&more) != 4)
return 0;
- addr->s_addr = r;
+ if (a < 0 || a > 255) return 0;
+ if (b < 0 || b > 255) return 0;
+ if (c < 0 || c > 255) return 0;
+ if (d < 0 || d > 255) return 0;
+ addr->s_addr = htonl((a<<24) | (b<<16) | (c<<8) | d);
return 1;
-#endif
}
/** Given <b>af</b>==AF_INET and <b>src</b> a struct in_addr, or
diff --git a/src/or/eventdns.c b/src/or/eventdns.c
index 011ce4917c..55302c840f 100644
--- a/src/or/eventdns.c
+++ b/src/or/eventdns.c
@@ -357,20 +357,7 @@ error_is_eagain(int err)
{
return err == EAGAIN || err == WSAEWOULDBLOCK;
}
-static int
-inet_aton(const char *c, struct in_addr *addr)
-{
- uint32_t r;
- if (strcmp(c, "255.255.255.255") == 0) {
- addr->s_addr = 0xffffffffu;
- } else {
- r = inet_addr(c);
- if (r == INADDR_NONE)
- return 0;
- addr->s_addr = r;
- }
- return 1;
-}
+#define inet_aton(c, addr) tor_inet_aton((c), (addr))
#define CLOSE_SOCKET(x) closesocket(x)
#else
#define last_error(sock) (errno)