summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Hopps <chopps@labn.net>2023-02-01 17:13:46 +0100
committerGitHub <noreply@github.com>2023-02-01 17:13:46 +0100
commitb54ec1733b4cbf52911a3922026bc5112e2810be (patch)
tree523be3a4c2a94573b784b70abf0e4f62d981e095
parentMerge pull request #12667 from donaldsharp/zebra_rib_fixup (diff)
parenttests: add missing printf attribute (diff)
downloadfrr-b54ec1733b4cbf52911a3922026bc5112e2810be.tar.xz
frr-b54ec1733b4cbf52911a3922026bc5112e2810be.zip
Merge pull request #12721 from opensourcerouting/format-warnings-redux
*: more format string fixing
-rw-r--r--bgpd/rfapi/rfapi_vty.h3
-rw-r--r--lib/db.h7
-rw-r--r--lib/libfrr.c2
-rw-r--r--lib/zlog.h4
-rw-r--r--tests/bgpd/test_peer_attr.c108
-rw-r--r--tests/lib/test_nexthop_iter.c1
6 files changed, 54 insertions, 71 deletions
diff --git a/bgpd/rfapi/rfapi_vty.h b/bgpd/rfapi/rfapi_vty.h
index 09e1b3c4c..c8b8613fe 100644
--- a/bgpd/rfapi/rfapi_vty.h
+++ b/bgpd/rfapi/rfapi_vty.h
@@ -62,7 +62,8 @@ extern int rfapiStr2EthAddr(const char *str, struct ethaddr *ea);
extern const char *rfapi_ntop(int af, const void *src, char *buf,
socklen_t size);
-extern int rfapiDebugPrintf(void *dummy, const char *format, ...);
+extern int rfapiDebugPrintf(void *dummy, const char *format, ...)
+ PRINTFRR(2, 3);
extern int rfapiStream2Vty(void *stream, /* input */
int (**fp)(void *, const char *, ...), /* output */
diff --git a/lib/db.h b/lib/db.h
index 884c7377f..c8ce7fe57 100644
--- a/lib/db.h
+++ b/lib/db.h
@@ -36,21 +36,24 @@
#define _FRR_DB_H_
#ifdef HAVE_SQLITE3
+#include "compiler.h"
#include <sqlite3.h>
#ifdef __cplusplus
extern "C" {
#endif
-extern int db_init(const char *path_fmt, ...);
+extern int db_init(const char *path_fmt, ...) PRINTFRR(1, 2);
extern int db_close(void);
+/* WARNING: sqlite format string! not printf compatible! */
extern int db_bindf(struct sqlite3_stmt *ss, const char *fmt, ...);
extern struct sqlite3_stmt *db_prepare_len(const char *stmt, int stmtlen);
extern struct sqlite3_stmt *db_prepare(const char *stmt);
extern int db_run(struct sqlite3_stmt *ss);
+/* WARNING: sqlite format string! not scanf compatible! */
extern int db_loadf(struct sqlite3_stmt *ss, const char *fmt, ...);
extern void db_finalize(struct sqlite3_stmt **ss);
-extern int db_execute(const char *stmt_fmt, ...);
+extern int db_execute(const char *stmt_fmt, ...) PRINTFRR(1, 2);
#ifdef __cplusplus
}
diff --git a/lib/libfrr.c b/lib/libfrr.c
index aee698185..2cab6d982 100644
--- a/lib/libfrr.c
+++ b/lib/libfrr.c
@@ -789,7 +789,7 @@ struct thread_master *frr_init(void)
#ifdef HAVE_SQLITE3
if (!di->db_file)
di->db_file = dbfile_default;
- db_init(di->db_file);
+ db_init("%s", di->db_file);
#endif
if (di->flags & FRR_LIMITED_CLI)
diff --git a/lib/zlog.h b/lib/zlog.h
index dcc0bf14e..6316a2ad4 100644
--- a/lib/zlog.h
+++ b/lib/zlog.h
@@ -71,8 +71,8 @@ struct xrefdata_logmsg {
* determine whether something is a log message or something else.
*/
-extern void vzlogx(const struct xref_logmsg *xref, int prio,
- const char *fmt, va_list ap);
+extern void vzlogx(const struct xref_logmsg *xref, int prio, const char *fmt,
+ va_list ap) PRINTFRR(3, 0);
#define vzlog(prio, ...) vzlogx(NULL, prio, __VA_ARGS__)
PRINTFRR(2, 3)
diff --git a/tests/bgpd/test_peer_attr.c b/tests/bgpd/test_peer_attr.c
index c2e86f233..cc4f71e68 100644
--- a/tests/bgpd/test_peer_attr.c
+++ b/tests/bgpd/test_peer_attr.c
@@ -20,6 +20,7 @@
#include "memory.h"
#include "plist.h"
+#include "printfrr.h"
#include "bgpd/bgpd.h"
#include "bgpd/bgp_attr.h"
#include "bgpd/bgp_regex.h"
@@ -44,8 +45,9 @@
if ((T)->state != TEST_SUCCESS || (C)) \
break; \
(T)->state = TEST_ASSERT_ERROR; \
- (T)->error = str_printf("assertion failed: %s (%s:%d)", (#C), \
- __FILE__, __LINE__); \
+ (T)->error = \
+ asprintfrr(MTYPE_TMP, "assertion failed: %s (%s:%d)", \
+ (#C), __FILE__, __LINE__); \
} while (0)
#define TEST_ASSERT_EQ(T, A, B) \
@@ -53,9 +55,11 @@
if ((T)->state != TEST_SUCCESS || ((A) == (B))) \
break; \
(T)->state = TEST_ASSERT_ERROR; \
- (T)->error = str_printf( \
- "assertion failed: %s[%d] == [%d]%s (%s:%d)", (#A), \
- (A), (B), (#B), __FILE__, __LINE__); \
+ (T)->error = asprintfrr( \
+ MTYPE_TMP, \
+ "assertion failed: %s[%lld] == [%lld]%s (%s:%d)", \
+ (#A), (long long)(A), (long long)(B), (#B), __FILE__, \
+ __LINE__); \
} while (0)
#define TEST_HANDLER_MAX 5
@@ -212,44 +216,6 @@ static struct test_peer_family test_default_families[] = {
{.afi = AFI_IP6, .safi = SAFI_MULTICAST},
};
-static char *str_vprintf(const char *fmt, va_list ap)
-{
- int ret;
- int buf_size = 0;
- char *buf = NULL;
- va_list apc;
-
- while (1) {
- va_copy(apc, ap);
- ret = vsnprintf(buf, buf_size, fmt, apc);
- va_end(apc);
-
- if (ret >= 0 && ret < buf_size)
- break;
-
- if (ret >= 0)
- buf_size = ret + 1;
- else
- buf_size *= 2;
-
- buf = XREALLOC(MTYPE_TMP, buf, buf_size);
- }
-
- return buf;
-}
-
-static char *str_printf(const char *fmt, ...)
-{
- char *buf;
- va_list ap;
-
- va_start(ap, fmt);
- buf = str_vprintf(fmt, ap);
- va_end(ap);
-
- return buf;
-}
-
TEST_ATTR_HANDLER_DECL(advertisement_interval, v_routeadv, 10, 20);
TEST_STR_ATTR_HANDLER_DECL(password, password, "FRR-Peer", "FRR-Group");
TEST_ATTR_HANDLER_DECL(local_as, change_local_as, 1, 2);
@@ -724,6 +690,7 @@ static bool is_attr_type_global(enum test_peer_attr_type at)
return at == PEER_AT_GLOBAL_FLAG || at == PEER_AT_GLOBAL_CUSTOM;
}
+PRINTFRR(2, 3)
static void test_log(struct test *test, const char *fmt, ...)
{
va_list ap;
@@ -734,10 +701,11 @@ static void test_log(struct test *test, const char *fmt, ...)
/* Store formatted log message. */
va_start(ap, fmt);
- listnode_add(test->log, str_vprintf(fmt, ap));
+ listnode_add(test->log, vasprintfrr(MTYPE_TMP, fmt, ap));
va_end(ap);
}
+PRINTFRR(2, 3)
static void test_execute(struct test *test, const char *fmt, ...)
{
int ret;
@@ -751,12 +719,12 @@ static void test_execute(struct test *test, const char *fmt, ...)
/* Format command string with variadic arguments. */
va_start(ap, fmt);
- cmd = str_vprintf(fmt, ap);
+ cmd = vasprintfrr(MTYPE_TMP, fmt, ap);
va_end(ap);
if (!cmd) {
test->state = TEST_INTERNAL_ERROR;
- test->error =
- str_printf("could not format command string [%s]", fmt);
+ test->error = asprintfrr(
+ MTYPE_TMP, "could not format command string [%s]", fmt);
return;
}
@@ -764,7 +732,8 @@ static void test_execute(struct test *test, const char *fmt, ...)
vline = cmd_make_strvec(cmd);
if (vline == NULL) {
test->state = TEST_INTERNAL_ERROR;
- test->error = str_printf(
+ test->error = asprintfrr(
+ MTYPE_TMP,
"tokenizing command string [%s] returned empty result",
cmd);
XFREE(MTYPE_TMP, cmd);
@@ -776,7 +745,8 @@ static void test_execute(struct test *test, const char *fmt, ...)
ret = cmd_execute_command(vline, test->vty, NULL, 0);
if (ret != CMD_SUCCESS) {
test->state = TEST_COMMAND_ERROR;
- test->error = str_printf(
+ test->error = asprintfrr(
+ MTYPE_TMP,
"execution of command [%s] has failed with code [%d]",
cmd, ret);
}
@@ -786,6 +756,7 @@ static void test_execute(struct test *test, const char *fmt, ...)
XFREE(MTYPE_TMP, cmd);
}
+PRINTFRR(2, 0)
static void test_config(struct test *test, const char *fmt, bool invert,
va_list ap)
{
@@ -800,12 +771,12 @@ static void test_config(struct test *test, const char *fmt, bool invert,
/* Format matcher string with variadic arguments. */
va_copy(apc, ap);
- matcher = str_vprintf(fmt, apc);
+ matcher = vasprintfrr(MTYPE_TMP, fmt, apc);
va_end(apc);
if (!matcher) {
test->state = TEST_INTERNAL_ERROR;
- test->error =
- str_printf("could not format matcher string [%s]", fmt);
+ test->error = asprintfrr(
+ MTYPE_TMP, "could not format matcher string [%s]", fmt);
return;
}
@@ -818,11 +789,13 @@ static void test_config(struct test *test, const char *fmt, bool invert,
matched = !!strstr(config, matcher);
if (!matched && !invert) {
test->state = TEST_CONFIG_ERROR;
- test->error = str_printf("expected config [%s] to be present",
+ test->error = asprintfrr(MTYPE_TMP,
+ "expected config [%s] to be present",
matcher);
} else if (matched && invert) {
test->state = TEST_CONFIG_ERROR;
- test->error = str_printf("expected config [%s] to be absent",
+ test->error = asprintfrr(MTYPE_TMP,
+ "expected config [%s] to be absent",
matcher);
}
@@ -831,6 +804,7 @@ static void test_config(struct test *test, const char *fmt, bool invert,
XFREE(MTYPE_TMP, config);
}
+PRINTFRR(2, 3)
static void test_config_present(struct test *test, const char *fmt, ...)
{
va_list ap;
@@ -840,6 +814,7 @@ static void test_config_present(struct test *test, const char *fmt, ...)
va_end(ap);
}
+PRINTFRR(2, 3)
static void test_config_absent(struct test *test, const char *fmt, ...)
{
va_list ap;
@@ -886,8 +861,8 @@ static void test_initialize(struct test *test)
test->bgp = bgp_get_default();
if (!test->bgp) {
test->state = TEST_INTERNAL_ERROR;
- test->error =
- str_printf("could not retrieve default bgp instance");
+ test->error = asprintfrr(
+ MTYPE_TMP, "could not retrieve default bgp instance");
return;
}
@@ -901,7 +876,8 @@ static void test_initialize(struct test *test)
}
if (!test->peer) {
test->state = TEST_INTERNAL_ERROR;
- test->error = str_printf(
+ test->error = asprintfrr(
+ MTYPE_TMP,
"could not retrieve instance of bgp peer [%s]",
cfg.peer_address);
return;
@@ -911,7 +887,8 @@ static void test_initialize(struct test *test)
test->group = peer_group_lookup(test->bgp, cfg.peer_group);
if (!test->group) {
test->state = TEST_INTERNAL_ERROR;
- test->error = str_printf(
+ test->error = asprintfrr(
+ MTYPE_TMP,
"could not retrieve instance of bgp peer-group [%s]",
cfg.peer_group);
return;
@@ -1081,7 +1058,8 @@ static void test_custom(struct test *test, struct test_peer_attr *pa,
if (test->state != TEST_SUCCESS) {
test->state = TEST_CUSTOM_ERROR;
handler_error = test->error;
- test->error = str_printf("custom handler failed: %s",
+ test->error = asprintfrr(MTYPE_TMP,
+ "custom handler failed: %s",
handler_error);
XFREE(MTYPE_TMP, handler_error);
}
@@ -1123,8 +1101,8 @@ static void test_process(struct test *test, struct test_peer_attr *pa,
default:
test->state = TEST_INTERNAL_ERROR;
- test->error =
- str_printf("invalid attribute type: %d", pa->type);
+ test->error = asprintfrr(
+ MTYPE_TMP, "invalid attribute type: %d", pa->type);
break;
}
@@ -1149,8 +1127,8 @@ static void test_peer_attr(struct test *test, struct test_peer_attr *pa)
type = str_from_attr_type(pa->type);
if (!type) {
test->state = TEST_INTERNAL_ERROR;
- test->error =
- str_printf("invalid attribute type: %d", pa->type);
+ test->error = asprintfrr(
+ MTYPE_TMP, "invalid attribute type: %d", pa->type);
return;
}
@@ -1485,11 +1463,11 @@ int main(void)
/* Build test description string. */
if (pa->afi && pa->safi)
- desc = str_printf("peer\\%s-%s\\%s",
+ desc = asprintfrr(MTYPE_TMP, "peer\\%s-%s\\%s",
str_from_afi(pa->afi),
str_from_safi(pa->safi), pa->cmd);
else
- desc = str_printf("peer\\%s", pa->cmd);
+ desc = asprintfrr(MTYPE_TMP, "peer\\%s", pa->cmd);
/* Initialize new test instance. */
test = test_new(desc, pa->o.use_ibgp, pa->o.use_iface_peer);
diff --git a/tests/lib/test_nexthop_iter.c b/tests/lib/test_nexthop_iter.c
index f21f3bbb3..a6995d13e 100644
--- a/tests/lib/test_nexthop_iter.c
+++ b/tests/lib/test_nexthop_iter.c
@@ -41,6 +41,7 @@ static void str_append(char **buf, const char *repr)
}
}
+PRINTFRR(2, 3)
static void str_appendf(char **buf, const char *format, ...)
{
va_list ap;