* thread_pthread.c (ruby_init_stack): Avoid using uninitialized value.

stackaddr and size are not set if get_stack() fails.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40102 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
yugui 2013-04-04 08:01:23 +00:00
Родитель 112a3b1fca
Коммит 360edb1c04
2 изменённых файлов: 34 добавлений и 21 удалений

Просмотреть файл

@ -1,3 +1,8 @@
Wed Apr 3 17:25:31 2013 Yuki Yugui Sonoda <yugui@google.com>
* thread_pthread.c (ruby_init_stack): Avoid using uninitialized value.
stackaddr and size are not set if get_stack() fails.
Thu Apr 4 16:55:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org> Thu Apr 4 16:55:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* struct.c (make_struct): avoid inadvertent symbol creation. * struct.c (make_struct): avoid inadvertent symbol creation.

Просмотреть файл

@ -588,6 +588,23 @@ static struct {
extern void *STACK_END_ADDRESS; extern void *STACK_END_ADDRESS;
#endif #endif
enum {
RUBY_STACK_SPACE_LIMIT = 1024 * 1024, /* 1024KB */
RUBY_STACK_SPACE_RATIO = 5
};
static size_t
space_size(size_t stack_size)
{
size_t space_size = stack_size / RUBY_STACK_SPACE_RATIO;
if (space_size > RUBY_STACK_SPACE_LIMIT) {
return RUBY_STACK_SPACE_LIMIT;
}
else {
return space_size;
}
}
#undef ruby_init_stack #undef ruby_init_stack
/* Set stack bottom of Ruby implementation. /* Set stack bottom of Ruby implementation.
* *
@ -618,13 +635,21 @@ ruby_init_stack(volatile VALUE *addr
} }
#endif #endif
{ {
size_t size = 0; #if defined(PTHREAD_STACK_DEFAULT)
size_t space = 0; # if PTHREAD_STACK_DEFAULT < RUBY_STACK_SPACE*5
# error "PTHREAD_STACK_DEFAULT is too small"
# endif
size_t size = PTHREAD_STACK_DEFAULT;
#else
size_t size = RUBY_VM_THREAD_VM_STACK_SIZE;
#endif
size_t space = space_size(size);
#if MAINSTACKADDR_AVAILABLE #if MAINSTACKADDR_AVAILABLE
void* stackaddr; void* stackaddr;
STACK_GROW_DIR_DETECTION; STACK_GROW_DIR_DETECTION;
get_stack(&stackaddr, &size); if (get_stack(&stackaddr, &size) == 0) {
space = STACK_DIR_UPPER((char *)addr - (char *)stackaddr, (char *)stackaddr - (char *)addr); space = STACK_DIR_UPPER((char *)addr - (char *)stackaddr, (char *)stackaddr - (char *)addr);
}
native_main_thread.stack_maxsize = size - space; native_main_thread.stack_maxsize = size - space;
#elif defined(HAVE_GETRLIMIT) #elif defined(HAVE_GETRLIMIT)
int pagesize = getpagesize(); int pagesize = getpagesize();
@ -831,23 +856,6 @@ use_cached_thread(rb_thread_t *th)
return result; return result;
} }
enum {
RUBY_STACK_SPACE_LIMIT = 1024 * 1024, /* 1024KB */
RUBY_STACK_SPACE_RATIO = 5
};
static size_t
space_size(size_t stack_size)
{
size_t space_size = stack_size / RUBY_STACK_SPACE_RATIO;
if (space_size > RUBY_STACK_SPACE_LIMIT) {
return RUBY_STACK_SPACE_LIMIT;
}
else {
return space_size;
}
}
static int static int
native_thread_create(rb_thread_t *th) native_thread_create(rb_thread_t *th)
{ {