diff options
author | Dylan Reid <dgreid@chromium.org> | 2020-10-02 18:56:11 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-10-14 05:37:56 +0000 |
commit | 38d8e2a08d0de3cf45141a1c488e26eb19f4cf5d (patch) | |
tree | 388a3e3498d147d2ff6441450293b15d8ee7c576 /cras/src/server/cras_server_metrics.c | |
parent | 9cbe487beeffb887477d953110d3edff79a16c89 (diff) | |
download | adhd-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.c | 9 |
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); } |