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;
}