From 7b932543265a2e0abd6b2a5428fe1ad40ea035ec Mon Sep 17 00:00:00 2001 Message-Id: <7b932543265a2e0abd6b2a5428fe1ad40ea035ec.1381871412.git.jdenemar@redhat.com> From: "Daniel P. Berrange" Date: Mon, 14 Oct 2013 16:45:20 +0100 Subject: [PATCH] Fix flaw in detecting log format For https://bugzilla.redhat.com/show_bug.cgi?id=927072 The log message regex has been [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}\+[0-9]{4}: [0-9]+: debug|info|warning|error : The precedence of '|' is high though, so this is equivalent to matching [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}\+[0-9]{4}: [0-9]+: debug Or info Or warning Or error : Which is clearly not what it should have done. This caused the code to skip over things which are not log messages. The solution is to simply add brackets. A test case is also added to validate correctness. Signed-off-by: Daniel P. Berrange (cherry picked from commit 5787f0b95ed5a58be020836bda4b27fa3538086c) Signed-off-by: Jiri Denemark --- .gitignore | 1 + src/util/virlog.c | 5 +++- tests/Makefile.am | 5 ++++ tests/virlogtest.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 tests/virlogtest.c diff --git a/src/util/virlog.c b/src/util/virlog.c index 047a131..daf964b 100644 --- a/src/util/virlog.c +++ b/src/util/virlog.c @@ -83,7 +83,7 @@ static regex_t *virLogRegex = NULL; #define VIR_LOG_DATE_REGEX "[0-9]{4}-[0-9]{2}-[0-9]{2}" #define VIR_LOG_TIME_REGEX "[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}\\+[0-9]{4}" #define VIR_LOG_PID_REGEX "[0-9]+" -#define VIR_LOG_LEVEL_REGEX "debug|info|warning|error" +#define VIR_LOG_LEVEL_REGEX "(debug|info|warning|error)" #define VIR_LOG_REGEX \ VIR_LOG_DATE_REGEX " " VIR_LOG_TIME_REGEX ": " \ @@ -1623,6 +1623,9 @@ virLogSetFromEnv(void) { char *debugEnv; + if (virLogInitialize() < 0) + return; + debugEnv = getenv("LIBVIRT_DEBUG"); if (debugEnv && *debugEnv) virLogParseDefaultPriority(debugEnv); diff --git a/tests/Makefile.am b/tests/Makefile.am index 4787752..b794005 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -122,6 +122,7 @@ test_programs = virshtest sockettest \ viridentitytest \ virkeycodetest \ virlockspacetest \ + virlogtest \ virstringtest \ virportallocatortest \ sysinfotest \ @@ -643,6 +644,10 @@ virlockspacetest_SOURCES = \ virlockspacetest.c testutils.h testutils.c virlockspacetest_LDADD = $(LDADDS) +virlogtest_SOURCES = \ + virlogtest.c testutils.h testutils.c +virlogtest_LDADD = $(LDADDS) + virportallocatortest_SOURCES = \ virportallocatortest.c testutils.h testutils.c virportallocatortest_LDADD = $(LDADDS) diff --git a/tests/virlogtest.c b/tests/virlogtest.c new file mode 100644 index 0000000..ab4c2e8 --- /dev/null +++ b/tests/virlogtest.c @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2013 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + * + */ + +#include + +#include "testutils.h" + +#include "virlog.h" + +struct testLogMatchData { + const char *str; + bool res; +}; + +static int +testLogMatch(const void *opaque) +{ + const struct testLogMatchData *data = opaque; + + bool got = virLogProbablyLogMessage(data->str); + if (got != data->res) { + fprintf(stderr, "Expected '%d' but got '%d' for '%s'\n", + data->res, got, data->str); + return -1; + } + return 0; +} + + +static int +mymain(void) +{ + int ret = 0; + +#define TEST_LOG_MATCH(str, res) \ + do { \ + struct testLogMatchData data = { \ + str, res \ + }; \ + if (virtTestRun("testLogMatch " # str, 1, testLogMatch, &data) < 0) \ + ret = -1; \ + } while (0) + + TEST_LOG_MATCH("2013-10-11 15:43:43.866+0000: 28302: info : libvirt version: 1.1.3", true); + + TEST_LOG_MATCH("libvirt: error : cannot execute binary /usr/libexec/libvirt_lxc: No such file or directory", false); + + return ret; +} + +VIRT_TEST_MAIN(mymain) -- 1.8.3.2