mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-25 15:15:25 +00:00
44d0db011d
Add guards to avoid calling strchr when @err_noinfo == NULL or calling virErrorTestMsgFormatInfoOne when @err_info == NULL as both would fail with a NULL deref. Signed-off-by: John Ferlan <jferlan@redhat.com> ACKed-by: Peter Krempa <pkrempa@redhat.com>
103 lines
2.6 KiB
C
103 lines
2.6 KiB
C
/*
|
|
* 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
|
|
* <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
#include "testutils.h"
|
|
|
|
#define LIBVIRT_VIRERRORPRIV_H_ALLOW
|
|
#include "virerrorpriv.h"
|
|
#undef LIBVIRT_VIRERRORPRIV_H_ALLOW
|
|
|
|
static int
|
|
virErrorTestMsgFormatInfoOne(const char *msg)
|
|
{
|
|
bool found = false;
|
|
char *next;
|
|
int ret = 0;
|
|
|
|
for (next = (char *)msg; (next = strchr(next, '%')); next++) {
|
|
if (next[1] != 's') {
|
|
VIR_TEST_VERBOSE("\nerror message '%s' contains disallowed printf modifiers\n", msg);
|
|
ret = -1;
|
|
} else {
|
|
if (found) {
|
|
VIR_TEST_VERBOSE("\nerror message '%s' contains multiple %%s modifiers\n", msg);
|
|
ret = -1;
|
|
} else {
|
|
found = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!found) {
|
|
VIR_TEST_VERBOSE("\nerror message '%s' does not contain any %%s modifiers\n", msg);
|
|
ret = -1;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
static int
|
|
virErrorTestMsgs(const void *opaque ATTRIBUTE_UNUSED)
|
|
{
|
|
const char *err_noinfo;
|
|
const char *err_info;
|
|
size_t i;
|
|
int ret = 0;
|
|
|
|
for (i = 1; i < VIR_ERR_NUMBER_LAST; i++) {
|
|
err_noinfo = virErrorMsg(i, NULL);
|
|
err_info = virErrorMsg(i, "");
|
|
|
|
if (!err_noinfo) {
|
|
VIR_TEST_VERBOSE("\nmissing string without info for error id %zu\n", i);
|
|
ret = -1;
|
|
}
|
|
|
|
if (!err_info) {
|
|
VIR_TEST_VERBOSE("\nmissing string with info for error id %zu\n", i);
|
|
ret = -1;
|
|
}
|
|
|
|
if (err_noinfo && strchr(err_noinfo, '%')) {
|
|
VIR_TEST_VERBOSE("\nerror message id %zu contains formatting characters: '%s'\n",
|
|
i, err_noinfo);
|
|
ret = -1;
|
|
}
|
|
|
|
if (err_info && virErrorTestMsgFormatInfoOne(err_info) < 0)
|
|
ret = -1;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
static int
|
|
mymain(void)
|
|
{
|
|
int ret = 0;
|
|
|
|
if (virTestRun("error message strings ", virErrorTestMsgs, NULL) < 0)
|
|
ret = -1;
|
|
|
|
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
}
|
|
|
|
VIR_TEST_MAIN(mymain)
|