diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-06-21 09:46:43 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-06-22 08:59:43 +0300 |
commit | feecde8c46cdb597a76df5e6ef02b854843a8a5c (patch) | |
tree | 6d4aa9ab0e3345f3312d5dc4f070bd8a09fe8d04 | |
parent | f90b6805119ea3561e7852a21993742c5b160115 (diff) | |
download | mailutils-feecde8c46cdb597a76df5e6ef02b854843a8a5c.tar.gz mailutils-feecde8c46cdb597a76df5e6ef02b854843a8a5c.tar.bz2 |
Fix endianness bug in string to IP conversion
* libmailutils/cidr/fromsa.c (_mu_inaddr_to_bytes)
(_mu_sockaddr_to_bytes): Fix improper endianness conversion.
* libmailutils/cidr/tosa.c (mu_cidr_to_sockaddr): Simplify conversion.
-rw-r--r-- | libmailutils/cidr/fromsa.c | 45 | ||||
-rw-r--r-- | libmailutils/cidr/tosa.c | 9 |
2 files changed, 22 insertions, 32 deletions
diff --git a/libmailutils/cidr/fromsa.c b/libmailutils/cidr/fromsa.c index f57aadc17..39d24fd2f 100644 --- a/libmailutils/cidr/fromsa.c +++ b/libmailutils/cidr/fromsa.c @@ -29,55 +29,50 @@ #include <mailutils/cidr.h> #include <mailutils/errno.h> -static void -uint32_to_bytes (unsigned char *bytes, uint32_t u) -{ - int i; - - for (i = 0; i < 4; i++) - { - bytes[i] = u & 0xff; - u >>= 8; - } -} - int _mu_inaddr_to_bytes (int af, void *buf, unsigned char *bytes) { - uint32_t u; + size_t len; switch (af) { case AF_INET: - memcpy (&u, buf, sizeof u); - uint32_to_bytes (bytes, u); - return 4; - + len = 4; + break; + #ifdef MAILUTILS_IPV6 case AF_INET6: - memcpy (bytes, buf, 16); - return 16; + len = 16; + break; #endif + + default: + len = 0; } - return 0; + memcpy (bytes, buf, len); + return len; } int _mu_sockaddr_to_bytes (unsigned char *bytes, struct sockaddr const *sa) { + void *buf; switch (sa->sa_family) { case AF_INET: - uint32_to_bytes (bytes, ((struct sockaddr_in*)sa)->sin_addr.s_addr); - return 4; + buf = &(((struct sockaddr_in*)sa)->sin_addr.s_addr); + break; #ifdef MAILUTILS_IPV6 case AF_INET6: - memcpy (bytes, &((struct sockaddr_in6*)sa)->sin6_addr, 16); - return 16; + buf = &(((struct sockaddr_in6*)sa)->sin6_addr); + break; #endif + + default: + return 0; } - return 0; + return _mu_inaddr_to_bytes (sa->sa_family, buf, bytes); } int diff --git a/libmailutils/cidr/tosa.c b/libmailutils/cidr/tosa.c index 33715e197..2b372b12b 100644 --- a/libmailutils/cidr/tosa.c +++ b/libmailutils/cidr/tosa.c @@ -42,19 +42,14 @@ mu_cidr_to_sockaddr (struct mu_cidr *cidr, struct sockaddr **psa) } addr; struct sockaddr *sa; int socklen; - int i; - + memset (&addr, 0, sizeof (addr)); addr.sa.sa_family = cidr->family; switch (cidr->family) { case AF_INET: socklen = sizeof (addr.s_in); - for (i = 0; i < cidr->len; i++) - { - addr.s_in.sin_addr.s_addr <<= 8; - addr.s_in.sin_addr.s_addr |= cidr->address[i]; - } + memcpy (&addr.s_in.sin_addr.s_addr, cidr->address, 4); break; #ifdef MAILUTILS_IPV6 |