From 255d42d5b612e9a88beee1576ea5bb33f0a74f57 Mon Sep 17 00:00:00 2001 From: Remy Horton Date: Tue, 20 Feb 2018 16:05:59 +0000 Subject: [PATCH] metrics: fix potential missing string termination Fixes a potential memory overrun detected by Coverity. This overrun cannot currently happen in practice because rte_metrics_reg_names() explicitly forces the last name character to be a NULL terminator. This patches uses strlcpy instead of strncpy to copy name strings. Coverity issue: 143434 Fixes: 349950ddb9c5 ("metrics: add information metrics library") Fixes: 710cab6f675a ("metrics: fix out of bound access") Signed-off-by: Remy Horton Signed-off-by: Thomas Monjalon --- lib/librte_metrics/rte_metrics.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/librte_metrics/rte_metrics.c b/lib/librte_metrics/rte_metrics.c index 556ae1ba8b..258f0582c3 100644 --- a/lib/librte_metrics/rte_metrics.c +++ b/lib/librte_metrics/rte_metrics.c @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -113,10 +114,7 @@ rte_metrics_reg_names(const char * const *names, uint16_t cnt_names) for (idx_name = 0; idx_name < cnt_names; idx_name++) { entry = &stats->metadata[idx_name + stats->cnt_stats]; - strncpy(entry->name, names[idx_name], - RTE_METRICS_MAX_NAME_LEN); - /* Enforce NULL-termination */ - entry->name[RTE_METRICS_MAX_NAME_LEN - 1] = '\0'; + strlcpy(entry->name, names[idx_name], RTE_METRICS_MAX_NAME_LEN); memset(entry->value, 0, sizeof(entry->value)); entry->idx_next_stat = idx_name + stats->cnt_stats + 1; } @@ -215,7 +213,7 @@ rte_metrics_get_names(struct rte_metric_name *names, return return_value; } for (idx_name = 0; idx_name < stats->cnt_stats; idx_name++) - strncpy(names[idx_name].name, + strlcpy(names[idx_name].name, stats->metadata[idx_name].name, RTE_METRICS_MAX_NAME_LEN); } -- 2.20.1