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 <p...@nwl.cc> --- ip/ip6tunnel.c | 8 +++----- ip/iptunnel.c | 25 +++++++++++++------------ 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/ip/ip6tunnel.c b/ip/ip6tunnel.c index 410276f..ba92518 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 a547852..e323c1f 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) -- 2.1.2 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html