string.c: STR_EMBEDABLE_P
* string.c (STR_EMBEDABLE_P): extract the predicate macro to tell if the given length is capable in an embedded string, and fix possible integer overflow. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56151 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
d4faa1013e
commit
2608f7d9c5
@ -1,3 +1,9 @@
|
|||||||
|
Tue Sep 13 21:11:56 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* string.c (STR_EMBEDABLE_P): extract the predicate macro to tell
|
||||||
|
if the given length is capable in an embedded string, and fix
|
||||||
|
possible integer overflow.
|
||||||
|
|
||||||
Tue Sep 13 18:37:08 2016 Koichi Sasada <ko1@atdot.net>
|
Tue Sep 13 18:37:08 2016 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
* test/ruby/test_exception.rb: fix thread issues.
|
* test/ruby/test_exception.rb: fix thread issues.
|
||||||
|
9
string.c
9
string.c
@ -165,6 +165,9 @@ VALUE rb_cSymbol;
|
|||||||
#define SHARABLE_SUBSTRING_P(beg, len, end) 1
|
#define SHARABLE_SUBSTRING_P(beg, len, end) 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define STR_EMBEDABLE_P(len, termlen) \
|
||||||
|
((len) <= RSTRING_EMBED_LEN_MAX + 1 - (termlen))
|
||||||
|
|
||||||
static VALUE str_replace_shared_without_enc(VALUE str2, VALUE str);
|
static VALUE str_replace_shared_without_enc(VALUE str2, VALUE str);
|
||||||
static VALUE str_new_shared(VALUE klass, VALUE str);
|
static VALUE str_new_shared(VALUE klass, VALUE str);
|
||||||
static VALUE str_new_frozen(VALUE klass, VALUE orig);
|
static VALUE str_new_frozen(VALUE klass, VALUE orig);
|
||||||
@ -1068,7 +1071,7 @@ str_replace_shared_without_enc(VALUE str2, VALUE str)
|
|||||||
long len;
|
long len;
|
||||||
|
|
||||||
RSTRING_GETMEM(str, ptr, len);
|
RSTRING_GETMEM(str, ptr, len);
|
||||||
if (len+termlen <= RSTRING_EMBED_LEN_MAX+1) {
|
if (STR_EMBEDABLE_P(len, termlen)) {
|
||||||
char *ptr2 = RSTRING(str2)->as.ary;
|
char *ptr2 = RSTRING(str2)->as.ary;
|
||||||
STR_SET_EMBED(str2);
|
STR_SET_EMBED(str2);
|
||||||
memcpy(ptr2, RSTRING_PTR(str), len);
|
memcpy(ptr2, RSTRING_PTR(str), len);
|
||||||
@ -2524,14 +2527,14 @@ rb_str_resize(VALUE str, long len)
|
|||||||
const int termlen = TERM_LEN(str);
|
const int termlen = TERM_LEN(str);
|
||||||
if (STR_EMBED_P(str)) {
|
if (STR_EMBED_P(str)) {
|
||||||
if (len == slen) return str;
|
if (len == slen) return str;
|
||||||
if (len + termlen <= RSTRING_EMBED_LEN_MAX + 1) {
|
if (STR_EMBEDABLE_P(len, termlen)) {
|
||||||
STR_SET_EMBED_LEN(str, len);
|
STR_SET_EMBED_LEN(str, len);
|
||||||
TERM_FILL(RSTRING(str)->as.ary + len, termlen);
|
TERM_FILL(RSTRING(str)->as.ary + len, termlen);
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
str_make_independent_expand(str, slen, len - slen, termlen);
|
str_make_independent_expand(str, slen, len - slen, termlen);
|
||||||
}
|
}
|
||||||
else if (len + termlen <= RSTRING_EMBED_LEN_MAX + 1) {
|
else if (STR_EMBEDABLE_P(len, termlen)) {
|
||||||
char *ptr = STR_HEAP_PTR(str);
|
char *ptr = STR_HEAP_PTR(str);
|
||||||
STR_SET_EMBED(str);
|
STR_SET_EMBED(str);
|
||||||
if (slen > len) slen = len;
|
if (slen > len) slen = len;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user