diff options
author | Christian Hopps <chopps@labn.net> | 2023-02-01 17:13:46 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-01 17:13:46 +0100 |
commit | b54ec1733b4cbf52911a3922026bc5112e2810be (patch) | |
tree | 523be3a4c2a94573b784b70abf0e4f62d981e095 | |
parent | Merge pull request #12667 from donaldsharp/zebra_rib_fixup (diff) | |
parent | tests: add missing printf attribute (diff) | |
download | frr-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.h | 3 | ||||
-rw-r--r-- | lib/db.h | 7 | ||||
-rw-r--r-- | lib/libfrr.c | 2 | ||||
-rw-r--r-- | lib/zlog.h | 4 | ||||
-rw-r--r-- | tests/bgpd/test_peer_attr.c | 108 | ||||
-rw-r--r-- | tests/lib/test_nexthop_iter.c | 1 |
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 */ @@ -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; |