Changeset ff4185e6 in mainline


Ignore:
Timestamp:
2011-03-04T21:54:07Z (13 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
03f7952, f43c4d2
Parents:
019cff6
Message:

Safer and better usb_debug_str_buffer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usb/src/debug.c

    r019cff6 rff4185e6  
    253253
    254254
    255 #define BUFFER_DUMP_LEN 512
     255#define REMAINDER_STR_FMT " (%zu)..."
     256/* string + terminator + number width (enough for 4GB)*/
     257#define REMAINDER_STR_LEN (5 + 1 + 10)
     258#define BUFFER_DUMP_GROUP_SIZE 4
     259#define BUFFER_DUMP_LEN 240 /* Ought to be enough for everybody ;-). */
    256260static fibril_local char buffer_dump[BUFFER_DUMP_LEN];
    257261
     
    280284    size_t dumped_size)
    281285{
     286        /*
     287         * Remove previous string (that might also reveal double usage of
     288         * this function).
     289         */
     290        bzero(buffer_dump, BUFFER_DUMP_LEN);
     291
    282292        if (buffer == NULL) {
    283293                return "(null)";
     
    290300        }
    291301
     302        /* How many bytes are available in the output buffer. */
     303        size_t buffer_remaining_size = BUFFER_DUMP_LEN - 1 - REMAINDER_STR_LEN;
    292304        char *it = buffer_dump;
    293305
    294306        size_t index = 0;
    295307
    296         while (1) {
    297                 /* FIXME: add range checking of the buffer size. */
    298                 snprintf(it, 4, "%02X ", (int) buffer[index]);
    299                 it += 3;
     308        while (index < size) {
     309                /* Determine space before the number. */
     310                const char *space_before;
     311                if (index == 0) {
     312                        space_before = "";
     313                } else if ((index % BUFFER_DUMP_GROUP_SIZE) == 0) {
     314                        space_before = "  ";
     315                } else {
     316                        space_before = " ";
     317                }
     318
     319                /*
     320                 * Add the byte as a hexadecimal number plus the space.
     321                 * We do it into temporary buffer to ensure that always
     322                 * the whole byte is printed.
     323                 */
     324                int val = buffer[index];
     325                char current_byte[16];
     326                int printed = snprintf(current_byte, 16,
     327                    "%s%02x", space_before, val);
     328                if (printed < 0) {
     329                        break;
     330                }
     331
     332                if ((size_t) printed > buffer_remaining_size) {
     333                        break;
     334                }
     335
     336                /* We can safely add 1, because space for end 0 is reserved. */
     337                str_append(it, buffer_remaining_size + 1, current_byte);
     338
     339                buffer_remaining_size -= printed;
     340                /* Point at the terminator 0. */
     341                it += printed;
    300342                index++;
     343
    301344                if (index >= dumped_size) {
    302345                        break;
     
    304347        }
    305348
    306         /* Remove the last space */
    307         it--;
    308         *it = 0;
     349        /* Add how many bytes were not printed. */
     350        if (index < size) {
     351                snprintf(it, REMAINDER_STR_LEN,
     352                    REMAINDER_STR_FMT, size - index);
     353        }
    309354
    310355        return buffer_dump;
Note: See TracChangeset for help on using the changeset viewer.