{
uint16_t c;
char *dest;
- size_t i, j, len = count;
+ size_t i, j;
+ size_t len = count * 3 / 2;
- dest = calloc(1, count);
+ dest = calloc(1, len + 1);
if (!dest)
return NULL;
/* always little endian */
c = (src[i+1] << 8) | src[i];
if (c == 0) {
- dest[j] = '\0';
break;
} else if (c < 0x80) {
- if (j+1 >= len)
+ if (j+1 > len)
break;
dest[j++] = (uint8_t) c;
} else if (c < 0x800) {
- if (j+2 >= len)
+ if (j+2 > len)
break;
dest[j++] = (uint8_t) (0xc0 | (c >> 6));
dest[j++] = (uint8_t) (0x80 | (c & 0x3f));
} else {
- if (j+3 >= len)
+ if (j+3 > len)
break;
dest[j++] = (uint8_t) (0xe0 | (c >> 12));
dest[j++] = (uint8_t) (0x80 | ((c >> 6) & 0x3f));
dest[j++] = (uint8_t) (0x80 | (c & 0x3f));
}
}
- dest[j] = '\0';
return dest;
}