From fdb29d94e33715c9aeeb15d37ffb70c0726bd28c Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 21 Jul 2019 20:54:43 +0200 Subject: [PATCH] track libulfius memory allocations using talloc Change-Id: I9be666e5fac0caf6f7d07c01f39e0f409c7465db --- configure.ac | 1 + src/Makefile.am | 6 ++++-- src/cbc_main.c | 4 ++++ src/internal.h | 2 +- src/rest_api.c | 35 ++++++++++++++++++++++++++++++++++- 5 files changed, 44 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index 713ddc0..566f8c4 100644 --- a/configure.ac +++ b/configure.ac @@ -35,6 +35,7 @@ PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.0.0) PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 0.4.0) PKG_CHECK_MODULES(ULFIUS, libulfius) PKG_CHECK_MODULES(JANSSON, jansson) +PKG_CHECK_MODULES(ORCANIA, liborcania) AC_ARG_ENABLE(sanitize, [AS_HELP_STRING( diff --git a/src/Makefile.am b/src/Makefile.am index 1e4f0a6..9747863 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,7 @@ AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src AM_CFLAGS=-Wall -g $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOVTY_CFLAGS) \ - $(LIBOSMONETIF_CFLAGS) $(ULFIUS_CFLAGS) $(JANSSON_CFLAGS) \ + $(LIBOSMONETIF_CFLAGS) \ + $(ULFIUS_CFLAGS) $(JANSSON_CFLAGS) $(ORCANIA_CFLAGS) \ $(COVERAGE_CFLAGS) AM_LDFLAGS=$(COVERAGE_LDFLAGS) @@ -11,5 +12,6 @@ bin_PROGRAMS = osmo-cbc osmo_cbc_SOURCES = cbc_main.c cbc_data.c cbc_vty.c cbsp_server.c cbsp_server_fsm.c \ rest_api.c charset.c osmo_cbc_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(LIBOSMOVTY_LIBS) \ - $(LIBOSMONETIF_LIBS) $(ULFIUS_LIBS) $(JANSSON_LIBS) + $(LIBOSMONETIF_LIBS) \ + $(ULFIUS_LIBS) $(JANSSON_LIBS) $(ORCANIA_LIBS) diff --git a/src/cbc_main.c b/src/cbc_main.c index f6ecc4f..d5d5296 100644 --- a/src/cbc_main.c +++ b/src/cbc_main.c @@ -154,9 +154,11 @@ extern int cbc_client_rx_cb(struct osmo_cbsp_cbc_client *client, struct osmo_cbs int main(int argc, char **argv) { + void *tall_rest_ctx; int rc; tall_cbc_ctx = talloc_named_const(NULL, 1, "osmo-cbc"); + tall_rest_ctx = talloc_named_const(tall_cbc_ctx, 0, "REST"); msgb_talloc_ctx_init(tall_cbc_ctx, 0); osmo_init_logging2(tall_cbc_ctx, &log_info); osmo_stats_init(tall_cbc_ctx); @@ -188,6 +190,8 @@ int main(int argc, char **argv) cbsp_cbc_create(tall_cbc_ctx, NULL, -1, &cbc_client_rx_cb); + rest_api_init(tall_rest_ctx, 12345); + signal(SIGUSR1, &signal_handler); signal(SIGUSR2, &signal_handler); osmo_init_ignore_signals(); diff --git a/src/internal.h b/src/internal.h index 0da1259..a0d50cb 100644 --- a/src/internal.h +++ b/src/internal.h @@ -20,7 +20,7 @@ enum cbsp_server_event { /* rest_api.c */ -int rest_api_init(uint16_t port); +int rest_api_init(void *ctx, uint16_t port); void rest_api_fin(void); /* cbc_vty.c */ diff --git a/src/rest_api.c b/src/rest_api.c index d16d7f1..459bcd4 100644 --- a/src/rest_api.c +++ b/src/rest_api.c @@ -23,9 +23,11 @@ #include #include #include +#include #include #include +#include #include #include @@ -371,13 +373,44 @@ static const struct _u_endpoint api_endpoints[] = { }; static struct _u_instance g_instance; +static void *g_tall_rest; +static pthread_mutex_t g_tall_rest_lock = PTHREAD_MUTEX_INITIALIZER; -int rest_api_init(uint16_t port) +static void *my_o_malloc(size_t sz) +{ + void *obj; + pthread_mutex_lock(&g_tall_rest_lock); + obj = talloc_size(g_tall_rest, sz); + pthread_mutex_unlock(&g_tall_rest_lock); + return obj; +} + +static void *my_o_realloc(void *obj, size_t sz) +{ + void *ret; + pthread_mutex_lock(&g_tall_rest_lock); + ret = talloc_realloc_size(g_tall_rest, obj, sz); + pthread_mutex_unlock(&g_tall_rest_lock); + return ret; +} + +static void my_o_free(void *obj) +{ + pthread_mutex_lock(&g_tall_rest_lock); + talloc_free(obj); + pthread_mutex_unlock(&g_tall_rest_lock); +} + +int rest_api_init(void *ctx, uint16_t port) { int i; + g_tall_rest = ctx; + o_set_alloc_funcs(my_o_malloc, my_o_realloc, my_o_free); + if (ulfius_init_instance(&g_instance, port, NULL, NULL) != U_OK) return -1; + g_instance.mhd_response_copy_data = 1; for (i = 0; i < ARRAY_SIZE(api_endpoints); i++) ulfius_add_endpoint(&g_instance, &api_endpoints[i]);