X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fuml_device.c;h=a8bedc096a584a473104f4b3bedd0f59a6bd6532;hb=2c6b2d70e6640f39563ad7bb0aa0ba87f883848c;hp=406c81d0bb13371d27e1e1c360d669699069f7a8;hpb=f6e87ab476a0faf8b124ecaaa27f967d825e6457;p=tinc diff --git a/src/uml_device.c b/src/uml_device.c index 406c81d0..a8bedc09 100644 --- a/src/uml_device.c +++ b/src/uml_device.c @@ -36,7 +36,7 @@ static int request_fd = -1; static int data_fd = -1; static int write_fd = -1; static int state = 0; -static char *device_info; +static const char *device_info = "UML network socket"; enum request_type { REQ_NEW_CONTROL }; @@ -47,10 +47,14 @@ static struct request { struct sockaddr_un sock; } request; -static struct sockaddr_un data_sun; +static struct sockaddr_un data_sun = { + .sun_family = AF_UNIX, +}; static bool setup_device(void) { - struct sockaddr_un listen_sun; + struct sockaddr_un listen_sun = { + .sun_family = AF_UNIX, + }; static const int one = 1; struct { char zero; @@ -60,13 +64,11 @@ static bool setup_device(void) { struct timeval tv; if(!get_config_string(lookup_config(config_tree, "Device"), &device)) { - xasprintf(&device, LOCALSTATEDIR "/run/%s.umlsocket", identname); + xasprintf(&device, RUNSTATEDIR "/%s.umlsocket", identname); } get_config_string(lookup_config(config_tree, "Interface"), &iface); - device_info = "UML network socket"; - if((write_fd = socket(PF_UNIX, SOCK_DGRAM, 0)) < 0) { logger(DEBUG_ALWAYS, LOG_ERR, "Could not open write %s: %s", device_info, strerror(errno)); event_exit(); @@ -106,8 +108,7 @@ static bool setup_device(void) { name.zero = 0; name.pid = getpid(); gettimeofday(&tv, NULL); - name.usecs = tv.tv_usec; - data_sun.sun_family = AF_UNIX; + name.usecs = (int) tv.tv_usec; memcpy(&data_sun.sun_path, &name, sizeof(name)); if(bind(data_fd, (struct sockaddr *)&data_sun, sizeof(data_sun)) < 0) { @@ -133,7 +134,11 @@ static bool setup_device(void) { return false; } - listen_sun.sun_family = AF_UNIX; + if(strlen(device) >= sizeof(listen_sun.sun_path)) { + logger(DEBUG_ALWAYS, LOG_ERR, "UML socket filename %s is too long!", device); + return false; + } + strncpy(listen_sun.sun_path, device, sizeof(listen_sun.sun_path)); if(bind(listen_fd, (struct sockaddr *)&listen_sun, sizeof(listen_sun)) < 0) { @@ -184,16 +189,14 @@ void close_device(void) { free(device); device = NULL; - if(iface) { - free(iface); - iface = NULL; - } + free(iface); + iface = NULL; device_info = NULL; } static bool read_packet(vpn_packet_t *packet) { - int inlen; + ssize_t inlen; switch(state) { case 0: { @@ -226,7 +229,7 @@ static bool read_packet(vpn_packet_t *packet) { } case 1: { - if((inlen = read(request_fd, &request, sizeof(request))) != sizeof request) { + if((inlen = read(request_fd, &request, sizeof(request))) != sizeof(request)) { logger(DEBUG_ALWAYS, LOG_ERR, "Error while reading request from %s %s: %s", device_info, device, strerror(errno)); event_exit(); @@ -240,7 +243,7 @@ static bool read_packet(vpn_packet_t *packet) { return false; } - if(connect(write_fd, (struct sockkadr *)&request.sock, sizeof(request.sock)) < 0) { + if(connect(write_fd, (const struct sockaddr *)&request.sock, sizeof(request.sock)) < 0) { logger(DEBUG_ALWAYS, LOG_ERR, "Could not bind write %s: %s", device_info, strerror(errno)); event_exit(); return false;