summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Baptiste Queru <jbq@google.com>2012-08-09 10:51:40 -0700
committerandroid code review <noreply-gerritcodereview@google.com>2012-08-09 10:51:40 -0700
commit8076b212574afe39ed6152ddf88a3c8c63b0c87c (patch)
tree7b64e7e32e51a8712580cc2b40327d39a7fa79f1
parentd25b8502ea2c1294c0afab97bf7f14fbd2087efd (diff)
parentbf3a5b222ec2de0d6a26b8beb54ef7744d2dbd7f (diff)
downloadsystem_core-8076b212574afe39ed6152ddf88a3c8c63b0c87c.zip
system_core-8076b212574afe39ed6152ddf88a3c8c63b0c87c.tar.gz
system_core-8076b212574afe39ed6152ddf88a3c8c63b0c87c.tar.bz2
Merge "Decode DHCP netmask option correctly"
-rw-r--r--libnetutils/dhcpclient.c6
-rw-r--r--libnetutils/ifc_utils.c5
2 files changed, 7 insertions, 4 deletions
diff --git a/libnetutils/dhcpclient.c b/libnetutils/dhcpclient.c
index b38e258..34500e7 100644
--- a/libnetutils/dhcpclient.c
+++ b/libnetutils/dhcpclient.c
@@ -197,7 +197,11 @@ int decode_dhcp_msg(dhcp_msg *msg, int len, dhcp_info *info)
}
switch(opt) {
case OPT_SUBNET_MASK:
- if (optlen >= 4) info->prefixLength = ipv4NetmaskToPrefixLength(*((uint32_t*)x));
+ if (optlen >= 4) {
+ in_addr_t mask;
+ memcpy(&mask, x, 4);
+ info->prefixLength = ipv4NetmaskToPrefixLength(mask);
+ }
break;
case OPT_GATEWAY:
if (optlen >= 4) memcpy(&info->gateway, x, 4);
diff --git a/libnetutils/ifc_utils.c b/libnetutils/ifc_utils.c
index 186b98c..f19cb41 100644
--- a/libnetutils/ifc_utils.c
+++ b/libnetutils/ifc_utils.c
@@ -75,9 +75,8 @@ in_addr_t prefixLengthToIpv4Netmask(int prefix_length)
int ipv4NetmaskToPrefixLength(in_addr_t mask)
{
- mask = ntohl(mask);
int prefixLength = 0;
- uint32_t m = (uint32_t)mask;
+ uint32_t m = (uint32_t)ntohl(mask);
while (m & 0x80000000) {
prefixLength++;
m = m << 1;
@@ -486,7 +485,7 @@ int ifc_get_info(const char *name, in_addr_t *addr, int *prefixLength, unsigned
if(ioctl(ifc_ctl_sock, SIOCGIFNETMASK, &ifr) < 0) {
*prefixLength = 0;
} else {
- *prefixLength = ipv4NetmaskToPrefixLength((int)
+ *prefixLength = ipv4NetmaskToPrefixLength(
((struct sockaddr_in*) &ifr.ifr_addr)->sin_addr.s_addr);
}
}