From f843b23365721e27d06dd4f29440103b08ce9106 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Gallou=C3=ABt?= Date: Fri, 26 Jan 2018 14:42:48 +0000 Subject: [PATCH] Add some useless checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Adrien Gallouët --- src/ctl.c | 16 ++++++---- src/iface.c | 13 ++++++-- src/main.c | 6 ++-- src/str.h | 6 ++-- src/tun.c | 89 ++++++++++++++++++++++++++++++++++------------------- src/tun.h | 2 +- 6 files changed, 84 insertions(+), 48 deletions(-) diff --git a/src/ctl.c b/src/ctl.c index 83dcbca..44a2388 100644 --- a/src/ctl.c +++ b/src/ctl.c @@ -25,9 +25,11 @@ ctl_init(const char *dir, const char *file) const char *path[] = {dir, "/", file}; const size_t len = sizeof(sun.sun_path) - 1; - if (str_cat(sun.sun_path, path, COUNT(path), len) > len) { - errno = EINVAL; - return -1; + if (str_cat(sun.sun_path, len, path, COUNT(path)) == len) { + if (str_cat(NULL, len + 1, path, COUNT(path)) > len) { + errno = EINVAL; + return -1; + } } int fd = socket(AF_UNIX, SOCK_DGRAM, 0); @@ -62,9 +64,11 @@ ctl_connect(int fd, const char *dir, const char *file) const char *path[] = {dir, "/", file}; const size_t len = sizeof(sun.sun_path) - 1; - if (str_cat(sun.sun_path, path, COUNT(path), len) > len) { - errno = EINVAL; - return -1; + if (str_cat(sun.sun_path, len, path, COUNT(path)) == len) { + if (str_cat(NULL, len + 1, path, COUNT(path)) > len) { + errno = EINVAL; + return -1; + } } return connect(fd, (struct sockaddr *)&sun, sizeof(sun)); diff --git a/src/iface.c b/src/iface.c index 26a8f5d..d94e2db 100644 --- a/src/iface.c +++ b/src/iface.c @@ -1,10 +1,10 @@ #include "common.h" -#include "str.h" #include "iface.h" +#include "str.h" -#include #include +#include int iface_set_mtu(char *dev_name, int mtu) @@ -13,7 +13,14 @@ iface_set_mtu(char *dev_name, int mtu) .ifr_mtu = mtu, }; - str_cpy(ifr.ifr_name, dev_name, IFNAMSIZ - 1); + const size_t len = sizeof(ifr.ifr_name) - 1; + + if (str_cpy(ifr.ifr_name, len, dev_name) == len) { + if (str_len(dev_name, len + 1) > len) { + errno = EINTR; + return -1; + } + } int fd = socket(AF_INET, SOCK_DGRAM, 0); diff --git a/src/main.c b/src/main.c index 747c3b9..c84b320 100644 --- a/src/main.c +++ b/src/main.c @@ -314,9 +314,9 @@ main(int argc, char **argv) mud_set_mtu(mud, GT_MTU(gt.mtu)); - char *tun_name = NULL; + char tun_name[64]; - int tun_fd = tun_create(gt.dev, &tun_name); + int tun_fd = tun_create(tun_name, sizeof(tun_name) - 1, gt.dev); if (tun_fd == -1) { gt_log("couldn't create tun device\n"); @@ -351,7 +351,7 @@ main(int argc, char **argv) char tmp[1024]; char *name = &tmp[0]; - str_cpy(tmp, gt.bind.list, sizeof(tmp) - 1); + str_cpy(tmp, sizeof(tmp) - 1, gt.bind.list); while (*name) { char *p = name; diff --git a/src/str.h b/src/str.h index fb38837..b547c6a 100644 --- a/src/str.h +++ b/src/str.h @@ -33,7 +33,7 @@ str_len(const char *restrict str, size_t len) } static inline size_t -str_cat(char *dst, const char **src, size_t count, size_t dst_len) +str_cat(char *dst, size_t dst_len, const char **src, size_t count) { if (count && !src) return 0; @@ -56,7 +56,7 @@ str_cat(char *dst, const char **src, size_t count, size_t dst_len) } static inline size_t -str_cpy(char *dst, const char *src, size_t dst_len) +str_cpy(char *dst, size_t dst_len, const char *src) { - return str_cat(dst, &src, 1, dst_len); + return str_cat(dst, dst_len, &src, 1); } diff --git a/src/tun.c b/src/tun.c index 6afd6d1..268c8d5 100644 --- a/src/tun.c +++ b/src/tun.c @@ -33,17 +33,22 @@ #ifdef __APPLE__ static int -tun_create_by_id(char *name, size_t size, unsigned id) +tun_create_by_id(char *name, size_t len, unsigned id) { + int ret = snprintf(name, len + 1, "utun%u", id); + + if (ret <= 0 || ret > len) { + errno = EINVAL; + return -1; + } + int fd = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL); if (fd == -1) return -1; - struct ctl_info ci; - - memset(&ci, 0, sizeof(ci)); - str_cpy(ci.ctl_name, UTUN_CONTROL_NAME, sizeof(ci.ctl_name) - 1); + struct ctl_info ci = {0}; + str_cpy(ci.ctl_name, sizeof(ci.ctl_name) - 1, UTUN_CONTROL_NAME); if (ioctl(fd, CTLIOCGINFO, &ci)) { int err = errno; @@ -67,13 +72,11 @@ tun_create_by_id(char *name, size_t size, unsigned id) return -1; } - snprintf(name, size, "utun%u", id); - return fd; } static int -tun_create_by_name(char *name, size_t size, char *dev_name) +tun_create_by_name(char *name, size_t len, char *dev_name) { unsigned id = 0; @@ -82,7 +85,7 @@ tun_create_by_name(char *name, size_t size, char *dev_name) return -1; } - return tun_create_by_id(name, size, id); + return tun_create_by_id(name, len, id); } #else /* not __APPLE__ */ @@ -90,25 +93,35 @@ tun_create_by_name(char *name, size_t size, char *dev_name) #ifdef __linux__ static int -tun_create_by_name(char *name, size_t size, char *dev_name) +tun_create_by_name(char *name, size_t len, char *dev_name) { + struct ifreq ifr = { + .ifr_flags = IFF_TUN | IFF_NO_PI, + }; + + const size_t ifr_len = sizeof(ifr.ifr_name) - 1; + + if ((len < ifr_len) || + (str_len(dev_name, ifr_len + 1) > ifr_len)) { + errno = EINVAL; + return -1; + } + int fd = open("/dev/net/tun", O_RDWR); if (fd == -1) return -1; - struct ifreq ifr = { - .ifr_flags = IFF_TUN | IFF_NO_PI, - }; - - str_cpy(ifr.ifr_name, dev_name, IFNAMSIZ - 1); + str_cpy(ifr.ifr_name, ifr_len, dev_name); if (ioctl(fd, TUNSETIFF, &ifr)) { + int err = errno; close(fd); + errno = err; return -1; } - str_cpy(name, ifr.ifr_name, size - 1); + str_cpy(name, len, ifr.ifr_name); return fd; } @@ -116,46 +129,58 @@ tun_create_by_name(char *name, size_t size, char *dev_name) #else /* not __linux__ not __APPLE__ */ static int -tun_create_by_name(char *name, size_t size, char *dev_name) +tun_create_by_name(char *name, size_t len, char *dev_name) { - char path[64]; + char tmp[128]; - snprintf(path, sizeof(path), "/dev/%s", dev_name); - str_cpy(name, dev_name, size - 1); + int ret = snprintf(tmp, sizeof(tmp), "/dev/%s", dev_name); - return open(path, O_RDWR); + if (ret <= 0 || ret >= sizeof(tmp)) { + errno = EINVAL; + return -1; + } + + if (str_cpy(name, len, dev_name) == len) { + if (str_len(dev_name, len + 1) > len) { + errno = EINVAL; + return -1; + } + } + + return open(tmp, O_RDWR); } #endif /* not __APPLE__ */ static int -tun_create_by_id(char *name, size_t size, unsigned id) +tun_create_by_id(char *name, size_t len, unsigned id) { - char dev_name[64]; + char tmp[64]; - snprintf(dev_name, sizeof(dev_name), "tun%u", id); + int ret = snprintf(tmp, sizeof(tmp), "tun%u", id); - return tun_create_by_name(name, size, dev_name); + if (ret <= 0 || ret >= sizeof(tmp)) { + errno = EINVAL; + return -1; + } + + return tun_create_by_name(name, len, tmp); } #endif int -tun_create(char *dev_name, char **ret_name) +tun_create(char *name, size_t len, char *dev_name) { - char name[64] = {0}; int fd = -1; if (str_empty(dev_name)) { for (unsigned id = 0; id < 32 && fd == -1; id++) - fd = tun_create_by_id(name, sizeof(name), id); + fd = tun_create_by_id(name, len, id); } else { - fd = tun_create_by_name(name, sizeof(name), dev_name); + fd = tun_create_by_name(name, len, dev_name); } - if (fd != -1 && ret_name) - *ret_name = strdup(name); - return fd; } diff --git a/src/tun.h b/src/tun.h index 86bb252..7340cd2 100644 --- a/src/tun.h +++ b/src/tun.h @@ -1,6 +1,6 @@ #pragma once -int tun_create (char *, char **); +int tun_create (char *, size_t, char *); int tun_read (int, void *, size_t); int tun_write (int, const void *, size_t); int tun_set_persist (int, int);