summaryrefslogtreecommitdiff
path: root/cras/src/server/cras_server_metrics.c
diff options
context:
space:
mode:
authorDylan Reid <dgreid@chromium.org>2020-10-02 18:56:11 -0700
committerCommit Bot <commit-bot@chromium.org>2020-10-14 05:37:56 +0000
commit38d8e2a08d0de3cf45141a1c488e26eb19f4cf5d (patch)
tree388a3e3498d147d2ff6441450293b15d8ee7c576 /cras/src/server/cras_server_metrics.c
parent9cbe487beeffb887477d953110d3edff79a16c89 (diff)
downloadadhd-38d8e2a08d0de3cf45141a1c488e26eb19f4cf5d.tar.gz
CRAS: metrics - fix snprintf return handling
This fixes an issue where snprintf was using the return value incorrectly. It returns the length of the format string that would be printed, not the amount the snprintf limit caused to be printed. To fix that, ensure that the loop exits as soon as the buffer is consumed or an error is returned. Change-Id: I6c8af006f38ea4ce24f190eb4145674b9df34e0b Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/adhd/+/2447235 Reviewed-by: Chih-Yang Hsia <paulhsia@chromium.org> Reviewed-by: Yu-Hsuan Hsu <yuhsuan@chromium.org> Tested-by: Dylan Reid <dgreid@chromium.org> Commit-Queue: Yu-Hsuan Hsu <yuhsuan@chromium.org>
Diffstat (limited to 'cras/src/server/cras_server_metrics.c')
-rw-r--r--cras/src/server/cras_server_metrics.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/cras/src/server/cras_server_metrics.c b/cras/src/server/cras_server_metrics.c
index 762d5e6d..91556d86 100644
--- a/cras/src/server/cras_server_metrics.c
+++ b/cras/src/server/cras_server_metrics.c
@@ -1015,10 +1015,15 @@ static void log_sparse_histogram_each_level(int num, int sample, ...)
va_start(valist, sample);
- for (i = 0; i < num; i++) {
- len += snprintf(metrics_name + len,
+ for (i = 0; i < num && len < METRICS_NAME_BUFFER_SIZE; i++) {
+ int metric_len = snprintf(metrics_name + len,
METRICS_NAME_BUFFER_SIZE - len, "%s%s",
i ? "." : "", va_arg(valist, char *));
+ // Exit early on error or running out of bufferspace. Avoids
+ // logging partial or corrupted strings.
+ if (metric_len < 0 || metric_len > METRICS_NAME_BUFFER_SIZE - len)
+ break;
+ len += metric_len;
cras_metrics_log_sparse_histogram(metrics_name, sample);
}