lkml.org 
[lkml]   [2015]   [Sep]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[RFC PATCH 2/3] lib/vsprintf.c: append "..." if the *pb[l] output has been truncated.
Date
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 <mlombard@redhat.com>
---
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


\
 
 \ /
  Last update: 2015-09-16 11:21    [W:0.130 / U:1.696 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site