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

Commit 57aa13eb authored by Chia-chi Yeh's avatar Chia-chi Yeh Committed by Android (Google) Code Review
Browse files

Merge "VPN: do not use gateway in routing rules."

parents b2e9cde8 8ea92894
Loading
Loading
Loading
Loading
+7 −26
Original line number Diff line number Diff line
@@ -46,14 +46,6 @@ static inline in_addr_t *as_in_addr(sockaddr *sa) {
    return &((sockaddr_in *)sa)->sin_addr.s_addr;
}

static inline in_addr_t *as_in_addr(sockaddr_storage *ss) {
    return &((sockaddr_in *)ss)->sin_addr.s_addr;
}

static inline in6_addr *as_in6_addr(sockaddr_storage *ss) {
    return &((sockaddr_in6 *)&ss)->sin6_addr;
}

//------------------------------------------------------------------------------

#define SYSTEM_ERROR -1
@@ -193,7 +185,6 @@ static int set_routes(const char *name, int index, const char *routes)
    rt4.rt_flags = RTF_UP;
    rt4.rt_dst.sa_family = AF_INET;
    rt4.rt_genmask.sa_family = AF_INET;
    rt4.rt_gateway.sa_family = AF_INET;

    in6_rtmsg rt6;
    memset(&rt6, 0, sizeof(rt6));
@@ -202,36 +193,29 @@ static int set_routes(const char *name, int index, const char *routes)

    char address[65];
    int prefix;
    char gateway[65];

    int chars;
    int count = 0;

    while (sscanf(routes, " %64[^/]/%d>%64[^ ] %n",
            address, &prefix, gateway, &chars) == 3) {
    while (sscanf(routes, " %64[^/]/%d %n", address, &prefix, &chars) == 2) {
        routes += chars;

        if (strchr(address, ':')) {
            // Add an IPv6 route.
            if (inet_pton(AF_INET6, gateway, &rt6.rtmsg_gateway) != 1 ||
                    inet_pton(AF_INET6, address, &rt6.rtmsg_dst) != 1 ||
            if (inet_pton(AF_INET6, address, &rt6.rtmsg_dst) != 1 ||
                    prefix < 0 || prefix > 128) {
                count = BAD_ARGUMENT;
                break;
            }

            rt6.rtmsg_dst_len = prefix;
            if (memcmp(&rt6.rtmsg_gateway, &in6addr_any, sizeof(in6addr_any))) {
                rt6.rtmsg_flags |= RTF_GATEWAY;
            }
            if (ioctl(inet6, SIOCADDRT, &rt6) && errno != EEXIST) {
                count = (errno == EINVAL) ? BAD_ARGUMENT : SYSTEM_ERROR;
                break;
            }
        } else {
            // Add an IPv4 route.
            if (inet_pton(AF_INET, gateway, as_in_addr(&rt4.rt_gateway)) != 1 ||
                    inet_pton(AF_INET, address, as_in_addr(&rt4.rt_dst)) != 1 ||
            if (inet_pton(AF_INET, address, as_in_addr(&rt4.rt_dst)) != 1 ||
                    prefix < 0 || prefix > 32) {
                count = BAD_ARGUMENT;
                break;
@@ -239,23 +223,20 @@ static int set_routes(const char *name, int index, const char *routes)

            in_addr_t mask = prefix ? (~0 << (32 - prefix)) : 0;
            *as_in_addr(&rt4.rt_genmask) = htonl(mask);
            if (*as_in_addr(&rt4.rt_gateway)) {
                rt4.rt_flags |= RTF_GATEWAY;
            }
            if (ioctl(inet4, SIOCADDRT, &rt4) && errno != EEXIST) {
                count = (errno == EINVAL) ? BAD_ARGUMENT : SYSTEM_ERROR;
                break;
            }
        }
        LOGV("Route added on %s: %s/%d -> %s", name, address, prefix, gateway);
        LOGV("Route added on %s: %s/%d", name, address, prefix);
        ++count;
    }

    if (count == BAD_ARGUMENT) {
        LOGE("Invalid route: %s/%d -> %s", address, prefix, gateway);
        LOGE("Invalid route: %s/%d", address, prefix);
    } else if (count == SYSTEM_ERROR) {
        LOGE("Cannot add route: %s/%d -> %s: %s",
                address, prefix, gateway, strerror(errno));
        LOGE("Cannot add route: %s/%d: %s",
                address, prefix, strerror(errno));
    } else if (*routes) {
        LOGE("Invalid route: %s", routes);
        count = BAD_ARGUMENT;