Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 49666005 authored by Chris Dearman's avatar Chris Dearman Committed by Android Git Automerger
Browse files

am 6ee3ecc0: Decode DHCP netmask option correctly

* commit '6ee3ecc0':
  Decode DHCP netmask option correctly
parents bdf4fd7a 6ee3ecc0
Loading
Loading
Loading
Loading
+5 −1
Original line number Original line Diff line number Diff line
@@ -197,7 +197,11 @@ int decode_dhcp_msg(dhcp_msg *msg, int len, dhcp_info *info)
        }
        }
        switch(opt) {
        switch(opt) {
        case OPT_SUBNET_MASK:
        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;
            break;
        case OPT_GATEWAY:
        case OPT_GATEWAY:
            if (optlen >= 4) memcpy(&info->gateway, x, 4);
            if (optlen >= 4) memcpy(&info->gateway, x, 4);
+2 −3
Original line number Original line Diff line number Diff line
@@ -75,9 +75,8 @@ in_addr_t prefixLengthToIpv4Netmask(int prefix_length)


int ipv4NetmaskToPrefixLength(in_addr_t mask)
int ipv4NetmaskToPrefixLength(in_addr_t mask)
{
{
    mask = ntohl(mask);
    int prefixLength = 0;
    int prefixLength = 0;
    uint32_t m = (uint32_t)mask;
    uint32_t m = (uint32_t)ntohl(mask);
    while (m & 0x80000000) {
    while (m & 0x80000000) {
        prefixLength++;
        prefixLength++;
        m = m << 1;
        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) {
        if(ioctl(ifc_ctl_sock, SIOCGIFNETMASK, &ifr) < 0) {
            *prefixLength = 0;
            *prefixLength = 0;
        } else {
        } else {
            *prefixLength = ipv4NetmaskToPrefixLength((int)
            *prefixLength = ipv4NetmaskToPrefixLength(
                    ((struct sockaddr_in*) &ifr.ifr_addr)->sin_addr.s_addr);
                    ((struct sockaddr_in*) &ifr.ifr_addr)->sin_addr.s_addr);
        }
        }
    }
    }