Project

General

Profile

Bug #11386 » 0001-string.c-keep-taintedness.patch

nobu (Nobuyoshi Nakada), 07/22/2015 11:23 PM

View differences:

string.c
}
static int fstring_cmp(VALUE a, VALUE b);
static st_index_t fstring_hash(VALUE str);
/* in case we restart MVM development, this needs to be per-VM */
static st_table* frozen_strings;
......
static const struct st_hash_type fstring_hash_type = {
fstring_cmp,
rb_str_hash,
fstring_hash,
};
static int
......
}
else {
if (STR_SHARED_P(str)) { /* str should not be shared */
const int taint = RBASIC(str)->flags & FL_TAINT;
str = rb_enc_str_new(RSTRING_PTR(str), RSTRING_LEN(str), STR_ENC_GET(str));
OBJ_FREEZE(str);
RBASIC(str)->flags |= FL_FREEZE | taint;
}
else {
str = rb_str_new_frozen(str);
......
static int
fstring_cmp(VALUE a, VALUE b)
{
int cmp = rb_str_hash_cmp(a, b);
int cmp;
cmp = FL_TEST_RAW(b, FL_TAINT) - FL_TEST_RAW(a, FL_TAINT);
if (cmp != 0) {
return cmp;
}
cmp = rb_str_hash_cmp(a, b);
if (cmp != 0) {
return cmp;
}
return ENCODING_GET(b) - ENCODING_GET(a);
}
static st_index_t
fstring_hash(VALUE str)
{
int e = ENCODING_GET(str);
if (e && rb_enc_str_coderange(str) == ENC_CODERANGE_7BIT) {
e = 0;
}
e ^= FL_TEST_RAW(str, FL_TAINT);
return rb_memhash((const void *)RSTRING_PTR(str), RSTRING_LEN(str)) ^ e;
}
static inline int
single_byte_optimizable(VALUE str)
{
(1-1/3)