From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753416AbbIPJIv (ORCPT ); Wed, 16 Sep 2015 05:08:51 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59934 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752547AbbIPJIt (ORCPT ); Wed, 16 Sep 2015 05:08:49 -0400 From: Maurizio Lombardi To: tj@kernel.org Cc: joe@perches.com, linux@rasmusvillemoes.dk, linux-kernel@vger.kernel.org Subject: [RFC PATCH 2/3] lib/vsprintf.c: append "..." if the *pb[l] output has been truncated. Date: Wed, 16 Sep 2015 11:08:42 +0200 Message-Id: <1442394523-19176-3-git-send-email-mlombard@redhat.com> In-Reply-To: <1442394523-19176-1-git-send-email-mlombard@redhat.com> References: <1442394523-19176-1-git-send-email-mlombard@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The *pb[l] format may generate a very long string that could exaust the output buffer capacity; when such event happens the output could be misleading, it may appear valid but part of it has been truncated. This patch modifies the bitmap_*_string() functions so they will append "..." to the output to inform the user that a truncation happened. Signed-off-by: Maurizio Lombardi --- lib/vsprintf.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 8707d91..f49bf54 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -816,6 +816,7 @@ char *bitmap_string(char *buf, char *end, unsigned long *bitmap, int i, chunksz; bool first = true; struct printf_spec spec = *specp; + const char *buf_start = buf; /* reused to print numbers */ spec = (struct printf_spec){ .flags = SMALL | ZEROPAD, .base = 16 }; @@ -846,6 +847,29 @@ char *bitmap_string(char *buf, char *end, unsigned long *bitmap, chunksz = CHUNKSZ; } + + if (buf >= end && buf_start != end) { + int spc = 0; + char *trunc = end - 1; + + while (trunc > buf_start) { + if (*trunc == ',' && spc > 3) { + trunc++; + break; + } + trunc--; + spc++; + } + + if (spc > 3) { + trunc[0] = '.'; + trunc[1] = '.'; + trunc[2] = '.'; + trunc[3] = '\0'; + } else + trunc[0] = '\0'; + } + return buf; } @@ -858,6 +882,7 @@ char *bitmap_list_string(char *buf, char *end, unsigned long *bitmap, int cur, rbot, rtop; bool first = true; struct printf_spec spec = *specp; + const char *buf_start = buf; /* reused to print numbers */ spec = (struct printf_spec){ .base = 10 }; @@ -887,6 +912,29 @@ char *bitmap_list_string(char *buf, char *end, unsigned long *bitmap, rbot = cur; } + + if (buf >= end && buf_start != end) { + int spc = 0; + char *trunc = end - 1; + + while (trunc > buf_start) { + if (*trunc == ',' && spc > 3) { + trunc++; + break; + } + trunc--; + spc++; + } + + if (spc > 3) { + trunc[0] = '.'; + trunc[1] = '.'; + trunc[2] = '.'; + trunc[3] = '\0'; + } else + trunc[0] = '\0'; + } + return buf; } -- Maurizio Lombardi