From: Phil Sutter Date: Fri, 13 Nov 2015 17:08:58 +0000 (+0100) Subject: ip{,6}tunnel: align do_tunnels_list() a bit X-Git-Tag: v4.4.0~59 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c4527d7ba36edd214d5e1a700affd5bf89c5cecc;p=thirdparty%2Fiproute2.git ip{,6}tunnel: align do_tunnels_list() a bit In iptunnel, declare loop variables inside the loop as done in ip6tunnel. Fix and simplify goto logic in ip6tunnel: - Failure to read over header lines would have left fp opened. - By returning directly upon fopen() failure, fp can be closed unconditionally in the end. Use the same goto logic in iptunnel, as well. Signed-off-by: Phil Sutter --- diff --git a/ip/ip6tunnel.c b/ip/ip6tunnel.c index 410276f16..ba92518a9 100644 --- a/ip/ip6tunnel.c +++ b/ip/ip6tunnel.c @@ -326,14 +326,14 @@ static int do_tunnels_list(struct ip6_tnl_parm2 *p) FILE *fp = fopen("/proc/net/dev", "r"); if (fp == NULL) { perror("fopen"); - goto end; + return -1; } /* skip two lines at the begenning of the file */ if (!fgets(buf, sizeof(buf), fp) || !fgets(buf, sizeof(buf), fp)) { fprintf(stderr, "/proc/net/dev read error\n"); - return -1; + goto end; } while (fgets(buf, sizeof(buf), fp) != NULL) { @@ -395,10 +395,8 @@ static int do_tunnels_list(struct ip6_tnl_parm2 *p) printf("\n"); } err = 0; - end: - if (fp) - fclose(fp); + fclose(fp); return err; } diff --git a/ip/iptunnel.c b/ip/iptunnel.c index a5478529a..e323c1f72 100644 --- a/ip/iptunnel.c +++ b/ip/iptunnel.c @@ -396,14 +396,8 @@ static void print_tunnel(struct ip_tunnel_parm *p) static int do_tunnels_list(struct ip_tunnel_parm *p) { - char name[IFNAMSIZ]; - unsigned long rx_bytes, rx_packets, rx_errs, rx_drops, - rx_fifo, rx_frame, - tx_bytes, tx_packets, tx_errs, tx_drops, - tx_fifo, tx_colls, tx_carrier, rx_multi; - struct ip_tunnel_parm p1; - char buf[512]; + int err = -1; FILE *fp = fopen("/proc/net/dev", "r"); if (fp == NULL) { perror("fopen"); @@ -414,19 +408,24 @@ static int do_tunnels_list(struct ip_tunnel_parm *p) if (!fgets(buf, sizeof(buf), fp) || !fgets(buf, sizeof(buf), fp)) { fprintf(stderr, "/proc/net/dev read error\n"); - fclose(fp); - return -1; + goto end; } while (fgets(buf, sizeof(buf), fp) != NULL) { + char name[IFNAMSIZ]; int index, type; + unsigned long rx_bytes, rx_packets, rx_errs, rx_drops, + rx_fifo, rx_frame, + tx_bytes, tx_packets, tx_errs, tx_drops, + tx_fifo, tx_colls, tx_carrier, rx_multi; + struct ip_tunnel_parm p1; char *ptr; + buf[sizeof(buf) - 1] = 0; if ((ptr = strchr(buf, ':')) == NULL || (*ptr++ = 0, sscanf(buf, "%s", name) != 1)) { fprintf(stderr, "Wrong format for /proc/net/dev. Giving up.\n"); - fclose(fp); - return -1; + goto end; } if (sscanf(ptr, "%ld%ld%ld%ld%ld%ld%ld%*d%ld%ld%ld%ld%ld%ld%ld", &rx_bytes, &rx_packets, &rx_errs, &rx_drops, @@ -467,8 +466,10 @@ static int do_tunnels_list(struct ip_tunnel_parm *p) } printf("\n"); } + err = 0; + end: fclose(fp); - return 0; + return err; } static int do_show(int argc, char **argv)