mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
eval_intern.h: jmpbuf must be accessible
* eval_intern.h (TH_PUSH_TAG): ensure jmpbuf to be accessible before pushing tag to get rid of unaccessible tag by stack overflow. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40791 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
de03518cc7
commit
f7624d984b
2 changed files with 16 additions and 0 deletions
|
@ -1,3 +1,8 @@
|
|||
Fri May 17 11:06:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* eval_intern.h (TH_PUSH_TAG): ensure jmpbuf to be accessible before
|
||||
pushing tag to get rid of unaccessible tag by stack overflow.
|
||||
|
||||
Thu May 16 17:15:32 2013 NARUSE, Yui <naruse@ruby-lang.org>
|
||||
|
||||
* vm_eval.c (rb_catch_obj): add volatile to tag to prevent crash
|
||||
|
|
|
@ -91,9 +91,20 @@ extern int select_large_fdset(int, fd_set *, fd_set *, fd_set *, struct timeval
|
|||
rb_fiber_start(); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
ensure tag to be accessible, `buf' is at the beginning.
|
||||
the end is `prev' which is written in TH_PUSH_TAG().
|
||||
*/
|
||||
#if defined(__GNUC__) && __GNUC__ >= 4
|
||||
/* suppress -Wstrict-aliasing, and should be inlined */
|
||||
# define ENSURE_TAG_WRITABLE(tag) MEMZERO((tag).buf, int, 1)
|
||||
#else
|
||||
# define ENSURE_TAG_WRITABLE(tag) (*(volatile int *)(tag).buf = 0)
|
||||
#endif
|
||||
#define TH_PUSH_TAG(th) do { \
|
||||
rb_thread_t * const _th = (th); \
|
||||
struct rb_vm_tag _tag; \
|
||||
ENSURE_TAG_WRITABLE(_tag); \
|
||||
_tag.tag = 0; \
|
||||
_tag.prev = _th->tag; \
|
||||
_th->tag = &_tag;
|
||||
|
|
Loading…
Reference in a new issue