зеркало из https://github.com/github/ruby.git
char is neither signed nor unsigned
read_escaped_byte() returns values of range -1...256. -1 indicates error. So the function basically expects char to be 0..255 range. There is no such guarantee. `char` is not always unsigned. We need to explicitly declare chbuf to be unsigned char. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65677 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
bc7976f2c6
Коммит
21e1260fb9
11
re.c
11
re.c
|
@ -2389,7 +2389,8 @@ unescape_escaped_nonascii(const char **pp, const char *end, rb_encoding *enc,
|
|||
{
|
||||
const char *p = *pp;
|
||||
int chmaxlen = rb_enc_mbmaxlen(enc);
|
||||
char *chbuf = ALLOCA_N(char, chmaxlen);
|
||||
unsigned char *area = ALLOCA_N(unsigned char, chmaxlen);
|
||||
char *chbuf = (char *)area;
|
||||
int chlen = 0;
|
||||
int byte;
|
||||
int l;
|
||||
|
@ -2401,14 +2402,14 @@ unescape_escaped_nonascii(const char **pp, const char *end, rb_encoding *enc,
|
|||
return -1;
|
||||
}
|
||||
|
||||
chbuf[chlen++] = byte;
|
||||
area[chlen++] = byte;
|
||||
while (chlen < chmaxlen &&
|
||||
MBCLEN_NEEDMORE_P(rb_enc_precise_mbclen(chbuf, chbuf+chlen, enc))) {
|
||||
byte = read_escaped_byte(&p, end, err);
|
||||
if (byte == -1) {
|
||||
return -1;
|
||||
}
|
||||
chbuf[chlen++] = byte;
|
||||
area[chlen++] = byte;
|
||||
}
|
||||
|
||||
l = rb_enc_precise_mbclen(chbuf, chbuf+chlen, enc);
|
||||
|
@ -2416,7 +2417,7 @@ unescape_escaped_nonascii(const char **pp, const char *end, rb_encoding *enc,
|
|||
errcpy(err, "invalid multibyte escape");
|
||||
return -1;
|
||||
}
|
||||
if (1 < chlen || (chbuf[0] & 0x80)) {
|
||||
if (1 < chlen || (area[0] & 0x80)) {
|
||||
rb_str_buf_cat(buf, chbuf, chlen);
|
||||
|
||||
if (*encp == 0)
|
||||
|
@ -2428,7 +2429,7 @@ unescape_escaped_nonascii(const char **pp, const char *end, rb_encoding *enc,
|
|||
}
|
||||
else {
|
||||
char escbuf[5];
|
||||
snprintf(escbuf, sizeof(escbuf), "\\x%02X", chbuf[0]&0xff);
|
||||
snprintf(escbuf, sizeof(escbuf), "\\x%02X", area[0]&0xff);
|
||||
rb_str_buf_cat(buf, escbuf, 4);
|
||||
}
|
||||
*pp = p;
|
||||
|
|
Загрузка…
Ссылка в новой задаче