From 24110ddab59dd5542e33e3e476cc271969324063 Mon Sep 17 00:00:00 2001 From: Alexander von Gluck IV Date: Sat, 15 Jun 2013 01:24:15 -0500 Subject: [PATCH] Route: Don't call null function pointers * Regression from hrev38233 (2010 baby!) * If no netmask, don't print anything vs showing uninitialized data. * Introduce "worst case address length" information per network family. * Fixes #9821 --- src/bin/network/route/route.cpp | 56 +++++++++++++-------------------- 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/src/bin/network/route/route.cpp b/src/bin/network/route/route.cpp index 9989d0380a..7e37bcd8e7 100644 --- a/src/bin/network/route/route.cpp +++ b/src/bin/network/route/route.cpp @@ -1,9 +1,10 @@ /* - * Copyright 2006-2010, Haiku, Inc. All Rights Reserved. + * Copyright 2006-2013, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: * Axel Dörfler, axeld@pinc-software.de + * Alexander von Gluck */ @@ -48,11 +49,7 @@ struct address_family { int family; const char* name; const char* identifiers[4]; - preferred_output_format preferred_format; - bool (*parse_address)(const char* string, sockaddr* _address); - bool (*prefix_length_to_mask)(uint8 prefixLength, sockaddr* mask); - uint8 (*mask_to_prefix_length)(sockaddr* mask); - const char* (*address_to_string)(sockaddr* address); + uint32 maxLength; }; @@ -61,15 +58,15 @@ static const address_family kFamilies[] = { AF_INET, "inet", {"AF_INET", "inet", "ipv4", NULL}, - PREFER_OUTPUT_MASK, + 15, }, { AF_INET6, "inet6", {"AF_INET6", "inet6", "ipv6", NULL}, - PREFER_OUTPUT_PREFIX_LENGTH, + 39, }, - { -1, NULL, {NULL}, PREFER_OUTPUT_MASK, NULL, NULL, NULL, NULL } + { -1, NULL, {NULL} } }; @@ -204,20 +201,16 @@ list_routes(int socket, const char *interfaceName, route_entry &route) if (family != NULL) { BNetworkAddress destination(*route.destination); - BNetworkAddress mask; - if (route.mask != NULL) - mask.SetTo(*route.mask); - // TODO: is the %15s format OK for IPv6? printf("%15s", destination.ToString().String()); - switch (family->preferred_format) { - case PREFER_OUTPUT_MASK: - printf(" mask %-15s ", mask.ToString().String()); - break; - case PREFER_OUTPUT_PREFIX_LENGTH: - printf("/%zd ", mask.PrefixLength()); - break; - } + + if (route.mask != NULL) { + BNetworkAddress mask; + mask.SetTo(*route.mask); + printf("/%zd\t", mask.PrefixLength()); + } else + printf(" \t"); + if ((route.flags & RTF_GATEWAY) != 0) { BNetworkAddress gateway; if (route.gateway != NULL) @@ -334,22 +327,17 @@ get_route(int socket, route_entry &route) } if (family != NULL) { - printf("%s", family->address_to_string(request.destination)); - switch (family->preferred_format) { - case PREFER_OUTPUT_MASK: - printf(" mask %s ", - family->address_to_string(request.mask)); - break; - case PREFER_OUTPUT_PREFIX_LENGTH: - printf("/%u ", - family->mask_to_prefix_length(request.mask)); - break; - } + BNetworkAddress destination(*request.destination); + BNetworkAddress mask(*request.mask); + printf("%s", destination.ToString().String()); + printf("/%zd ", mask.PrefixLength()); + BNetworkAddress gateway(*request.gateway); if (request.flags & RTF_GATEWAY) - printf("gateway %s ", family->address_to_string(request.gateway)); + printf("gateway %s ", gateway.ToString().String()); - printf("source %s\n", family->address_to_string(request.source)); + BNetworkAddress source(*request.source); + printf("source %s\n", source.ToString().String()); } else { printf("unknown family "); }