diff options
author | Nicholas Clark <nick@ccl4.org> | 2009-10-18 21:55:52 +0100 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2009-10-18 22:10:36 +0100 |
commit | 01ea242be7d23d3bfac7a37c0cdfaec0a8eb7e33 (patch) | |
tree | e6fd4877d2901d78e1548663670f966a414c07e4 /utf8.c | |
parent | e0ea5e2d50a479e160d39f481e02abd7c0c9cf91 (diff) | |
download | perl-01ea242be7d23d3bfac7a37c0cdfaec0a8eb7e33.tar.gz |
utf16_to_utf8() should croak if the buffer ends without the second surrogate.
Diffstat (limited to 'utf8.c')
-rw-r--r-- | utf8.c | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -986,11 +986,15 @@ Perl_utf16_to_utf8(pTHX_ U8* p, U8* d, I32 bytelen, I32 *newlen) continue; } if (uv >= 0xd800 && uv < 0xdbff) { /* surrogates */ - UV low = (p[0] << 8) + p[1]; - p += 2; - if (low < 0xdc00 || low >= 0xdfff) + if (p >= pend) { Perl_croak(aTHX_ "Malformed UTF-16 surrogate"); - uv = ((uv - 0xd800) << 10) + (low - 0xdc00) + 0x10000; + } else { + UV low = (p[0] << 8) + p[1]; + p += 2; + if (low < 0xdc00 || low >= 0xdfff) + Perl_croak(aTHX_ "Malformed UTF-16 surrogate"); + uv = ((uv - 0xd800) << 10) + (low - 0xdc00) + 0x10000; + } } if (uv < 0x10000) { *d++ = (U8)(( uv >> 12) | 0xe0); |