From 9902cbeb9cb9d9c177a453592560bfa78ce9bbda Mon Sep 17 00:00:00 2001 From: Pavel Rochnyack Date: Tue, 17 Mar 2020 19:28:23 +0700 Subject: [PATCH] openvpn plugin: Fix parsing empty fields Closes: #3424 --- src/openvpn.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/openvpn.c b/src/openvpn.c index b0e4bf40b..2c76a9c5e 100644 --- a/src/openvpn.c +++ b/src/openvpn.c @@ -4,6 +4,7 @@ * Copyright (C) 2009,2010 Florian octo Forster * Copyright (C) 2009 Marco Chiappero * Copyright (C) 2009 Fabian Schuh + * Copyright (C) 2017-2020 Pavel Rochnyak * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -69,7 +70,8 @@ #define TITLE_SINGLE "OpenVPN STATISTICS\n" #define TITLE_V1 "OpenVPN CLIENT LIST\n" -#define TITLE_V2 "TITLE" +#define TITLE_V2 "TITLE," +#define TITLE_V3 "TITLE\t" #define V1HEADER \ "Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since\n" @@ -313,7 +315,7 @@ static int multi1_read(const char *name, FILE *fh) { * status file is generated by openvpn/multi.c:multi_print_status() * http://svn.openvpn.net/projects/openvpn/trunk/openvpn/multi.c */ -static int multi2_read(const char *name, FILE *fh) { +static int multi2_read(const char *name, FILE *fh, const char *delim) { char buffer[1024]; /* OpenVPN-2.4 has 11 fields of data + 2 fields for "HEADER" and "CLIENT_LIST" * So, set array size to 20 elements, to support future extensions. @@ -329,7 +331,16 @@ static int multi2_read(const char *name, FILE *fh) { int columns = 0; while (fgets(buffer, sizeof(buffer), fh) != NULL) { - int fields_num = openvpn_strsplit(buffer, fields, max_fields); + int fields_num = 0; + + char *field = fields[fields_num++] = buffer; + + while ((field = strstr(field, delim)) != NULL) { + *field = '\0'; + fields[fields_num++] = ++field; + if (fields_num >= max_fields) + break; + } /* Try to find section header */ if (found_header == false) { @@ -449,9 +460,12 @@ static int openvpn_read(user_data_t *user_data) { } else if (strcmp(buffer, TITLE_V1) == 0) { // OpenVPN CLIENT LIST DEBUG("openvpn plugin: found status file MULTI version 1"); read = multi1_read(st->name, fh); - } else if (strncmp(buffer, TITLE_V2, strlen(TITLE_V2)) == 0) { // TITLE - DEBUG("openvpn plugin: found status file MULTI version 2/3"); - read = multi2_read(st->name, fh); + } else if (strncmp(buffer, TITLE_V2, strlen(TITLE_V2)) == 0) { // TITLE, + DEBUG("openvpn plugin: found status file MULTI version 2"); + read = multi2_read(st->name, fh, ","); + } else if (strncmp(buffer, TITLE_V3, strlen(TITLE_V3)) == 0) { // TITLE\t + DEBUG("openvpn plugin: found status file MULTI version 3"); + read = multi2_read(st->name, fh, "\t"); } else { NOTICE("openvpn plugin: %s: Unknown file format, please " "report this as bug. Make sure to include " -- 2.39.5