I have a matching pair of static functions in a utility class that I use to convert between binary data (unsigned characters) and it\'s string representation (a-f and 0-9). They
In this code,
for(unsigned int b = 0; b < effective_length; b++)
{
sscanf(source.data() + (b * 2), "%02x", (unsigned int*) &destination[b]);
}
you seem to be writing an unsigned int
at locations destination
, destination+1
, destination+2
, &c. As you approach the final bytes of your destination
buffer, you will write beyond its limit.
For the sake of example, let us assume that destination is a four-byte buffer, and that sizeof (unsigned int)
is 4 in your environment. Then each sscanf
is writing four bytes.
The first iteration writes bytes 0, 1, 2, 3
The second iteratino writes bytes 1, 2, 3, 4
The third iteration writes bytes 2, 3, 4, 5
The final iteration writes bytes 3, 4, 5, 6
Since the buffer was only four bytes to start with, you have written beyond the end of your buffer. Boom.
The minimum change required to avoid this particular bug follows:
for(unsigned int b = 0; b < effective_length; b++)
{
unsigned int ui;
sscanf(source.data() + (b * 2), "%02x", &ui);
destination[b] = ui;
}