From 9e2197d5d7ce759f77717d51063d7bfdb340254c Mon Sep 17 00:00:00 2001 From: Martin Galvan Date: Wed, 2 Sep 2015 16:54:24 -0500 Subject: cpukit/libmisc/dumpbuf/dumpbuf.c: Fix undefined behavior for sprintf() I also used the 'n' versions of the string functions, #define'd magic numbers and added a few comments. Updates #2405. --- cpukit/libmisc/dumpbuf/dumpbuf.c | 121 ++++++++++++++++++++++++--------------- 1 file changed, 75 insertions(+), 46 deletions(-) (limited to 'cpukit') diff --git a/cpukit/libmisc/dumpbuf/dumpbuf.c b/cpukit/libmisc/dumpbuf/dumpbuf.c index 9d34d42faf..bb63997a84 100644 --- a/cpukit/libmisc/dumpbuf/dumpbuf.c +++ b/cpukit/libmisc/dumpbuf/dumpbuf.c @@ -6,7 +6,7 @@ */ /* - * COPYRIGHT (c) 1997-2007. + * COPYRIGHT (c) 1997-2015. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may in @@ -24,62 +24,91 @@ #include #include +#define HEX_FMT_LENGTH 3 /* Length of the formatted hex string. */ +#define ASCII_FMT_LENGTH 1 /* Length of the formatted ASCII string. */ +#define BYTES_PER_ROW 16 /* Amount of bytes from buffer shown in each row. */ +#define BARS 2 /* Amount of bars in each row. */ +/* Max length of each row string. */ +#define ROW_LENGTH (BYTES_PER_ROW * (HEX_FMT_LENGTH + ASCII_FMT_LENGTH) + BARS) + /* * Put the body below rtems_print_buffer so it won't get inlined. */ -static inline void Dump_Line( - const unsigned char *buffer, - int length -); +static void Dump_Line(const unsigned char *buffer, const unsigned int length); -void rtems_print_buffer( - const unsigned char *buffer, - int length -) +/** + * @brief Print \p length bytes from \p buffer, both in hex and ASCII. + * Printing will be done in rows, each showing BYTES_PER_ROW bytes. + * @details Non-printable chars will appear as dots. + * + * @param buffer The buffer we'll print. + * @param length Amount of bytes from \p buffer we'll print. This can't be + * unsigned because we don't have a way to check if we're erroneously getting + * a negative \p length. + */ +void rtems_print_buffer(const unsigned char *buffer, const int length) { + unsigned int i, mod, max; - int i, mod, max; - - if ( !length ) return; + if (length > 0) { + mod = length % BYTES_PER_ROW; - mod = length % 16; + max = length - mod; - max = length - mod; + /* Print length / BYTES_PER_ROW rows. */ + for (i = 0; i < max; i += BYTES_PER_ROW) { + Dump_Line(&buffer[i], BYTES_PER_ROW); + } - for ( i=0 ; i 0) { + Dump_Line(&buffer[max], mod); + } + } else { + printk("Error: length must be greater than zero."); + } } -static inline void Dump_Line( - const unsigned char *buffer, - int length -) +/** + * @brief Print \p length bytes from \p buffer, both in hex and ASCII. + * @details Non-printable chars will appear as dots. + * + * @param buffer The buffer we'll print. + * @param length Amount of bytes from \p buffer we'll print. + */ +static void Dump_Line(const unsigned char *buffer, const unsigned int length) { - - int i; - char line_buffer[120]; - - line_buffer[0] = '\0'; - - for( i=0 ; i