Commit de82d63
committed
src: fix two encodeInto() bugs that reject input that fits
TextEncoder.encodeInto() could report that a code point does not fit
in the destination Uint8Array even when it does.
1. simpleUtfEncodingLength() used 0x400 as the boundary between 2-byte
and 3-byte UTF-8 encodings, but the correct boundary is 0x800: code
points in [0x80, 0x800) need 2 bytes in UTF-8, and only code points
>= 0x800 need 3.
2. The same function is called with a raw `char` from the Latin1
(one-byte string) code path. `char` is signed on some platforms, so
a byte >= 0x80 gets sign-extended to a large uint16_t value instead
of the intended code point, which also made encodeInto() behave
differently for the same prefix depending on whether the rest of
the source string forced V8 to represent it as one-byte (Latin1) or
two-byte (UTF-16) internally.
Also make the character-by-character fallback in findBestFit() consume
a UTF-16 surrogate pair as one atomic 4-byte unit instead of scoring
each half separately and patching up the boundary afterwards, which is
more straightforward to reason about than the previous post-hoc
adjustment.
Fixes: #65994
Signed-off-by: agape1225 <49804691+agape1225@users.noreply.github.com>1 parent 7203d9b commit de82d63
2 files changed
Lines changed: 76 additions & 12 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| 13 | + | |
13 | 14 | | |
14 | 15 | | |
15 | 16 | | |
| |||
88 | 89 | | |
89 | 90 | | |
90 | 91 | | |
91 | | - | |
| 92 | + | |
92 | 93 | | |
93 | 94 | | |
94 | 95 | | |
| |||
162 | 163 | | |
163 | 164 | | |
164 | 165 | | |
165 | | - | |
166 | | - | |
167 | | - | |
168 | | - | |
169 | | - | |
170 | | - | |
171 | | - | |
172 | | - | |
173 | | - | |
174 | | - | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
175 | 178 | | |
176 | | - | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
177 | 186 | | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
178 | 190 | | |
179 | 191 | | |
180 | 192 | | |
| |||
Lines changed: 52 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
0 commit comments