diff options
author | Yuta Saito <kateinoigakukun@gmail.com> | 2025-04-01 11:01:49 +0000 |
---|---|---|
committer | Yuta Saito <kateinoigakukun@gmail.com> | 2025-04-02 01:11:01 +0900 |
commit | 30e5e7c005f4a0a2cd4b883ab8c2be48aa3bf6ed (patch) | |
tree | 8cd1698c24ae2485cdbdd8456dbf2c0afb1769ba | |
parent | a671b25525279706d1fa2ee3b25ef45e3ec0eb89 (diff) |
Revert "Fix jump buffer leak in setjmp handler in WASI builds"
This reverts the following commits as it's causing OOM in some cases in
ruby/ruby.wasm test suite.
* 372515f33c908b36b3f5fbd2edcb34c69b418500
* 3a730be8b464454878a42132f6fecb98ab4c1b5b
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/13026
-rw-r--r-- | eval_intern.h | 4 | ||||
-rw-r--r-- | vm_core.h | 77 |
2 files changed, 27 insertions, 54 deletions
diff --git a/eval_intern.h b/eval_intern.h index 49229fa82d..ab0577e8ed 100644 --- a/eval_intern.h +++ b/eval_intern.h @@ -102,11 +102,11 @@ extern int select_large_fdset(int, fd_set *, fd_set *, fd_set *, struct timeval _tag.tag = Qundef; \ _tag.prev = _ec->tag; \ _tag.lock_rec = rb_ec_vm_lock_rec(_ec); \ - rb_vm_tag_jmpbuf_init(&_tag); + rb_vm_tag_jmpbuf_init(&_tag.buf); \ #define EC_POP_TAG() \ _ec->tag = _tag.prev; \ - rb_vm_tag_jmpbuf_deinit(&_tag); \ + rb_vm_tag_jmpbuf_deinit(&_tag.buf); \ } while (0) #define EC_TMPPOP_TAG() \ @@ -946,79 +946,52 @@ typedef void *rb_jmpbuf_t[5]; Therefore, we allocates the buffer on the heap on such environments. */ -typedef struct _rb_vm_tag_jmpbuf { - struct _rb_vm_tag_jmpbuf *next; - rb_jmpbuf_t buf; -} *rb_vm_tag_jmpbuf_t; +typedef rb_jmpbuf_t *rb_vm_tag_jmpbuf_t; -#define RB_VM_TAG_JMPBUF_GET(jmpbuf) ((jmpbuf)->buf) -#else -typedef rb_jmpbuf_t rb_vm_tag_jmpbuf_t; - -#define RB_VM_TAG_JMPBUF_GET(jmpbuf) (jmpbuf) -#endif - -/* - the members which are written in EC_PUSH_TAG() should be placed at - the beginning and the end, so that entire region is accessible. -*/ -struct rb_vm_tag { - VALUE tag; - VALUE retval; - rb_vm_tag_jmpbuf_t buf; - struct rb_vm_tag *prev; - enum ruby_tag_type state; - unsigned int lock_rec; -}; - -#if defined(__wasm__) && !defined(__EMSCRIPTEN__) -static inline void -_rb_vm_tag_jmpbuf_deinit_internal(rb_vm_tag_jmpbuf_t jmpbuf) -{ - rb_vm_tag_jmpbuf_t buf = jmpbuf; - while (buf != NULL) { - rb_vm_tag_jmpbuf_t next = buf->next; - ruby_xfree(buf); - buf = next; - } -} +#define RB_VM_TAG_JMPBUF_GET(buf) (*buf) static inline void -rb_vm_tag_jmpbuf_init(struct rb_vm_tag *tag) +rb_vm_tag_jmpbuf_init(rb_vm_tag_jmpbuf_t *jmpbuf) { - if (tag->prev != NULL && tag->prev->buf->next != NULL) { - _rb_vm_tag_jmpbuf_deinit_internal(tag->prev->buf->next); - tag->prev->buf->next = NULL; - } - tag->buf = ruby_xmalloc(sizeof *tag->buf); - tag->buf->next = NULL; - if (tag->prev != NULL) { - tag->prev->buf->next = tag->buf; - } + *jmpbuf = ruby_xmalloc(sizeof(rb_jmpbuf_t)); } static inline void -rb_vm_tag_jmpbuf_deinit(struct rb_vm_tag *tag) +rb_vm_tag_jmpbuf_deinit(const rb_vm_tag_jmpbuf_t *jmpbuf) { - if (tag->prev != NULL) { - tag->prev->buf->next = NULL; - } - _rb_vm_tag_jmpbuf_deinit_internal(tag->buf); + ruby_xfree(*jmpbuf); } #else +typedef rb_jmpbuf_t rb_vm_tag_jmpbuf_t; + +#define RB_VM_TAG_JMPBUF_GET(buf) (buf) + static inline void -rb_vm_tag_jmpbuf_init(struct rb_vm_tag *tag) +rb_vm_tag_jmpbuf_init(rb_vm_tag_jmpbuf_t *jmpbuf) { // no-op } static inline void -rb_vm_tag_jmpbuf_deinit(struct rb_vm_tag *tag) +rb_vm_tag_jmpbuf_deinit(const rb_vm_tag_jmpbuf_t *jmpbuf) { // no-op } #endif +/* + the members which are written in EC_PUSH_TAG() should be placed at + the beginning and the end, so that entire region is accessible. +*/ +struct rb_vm_tag { + VALUE tag; + VALUE retval; + rb_vm_tag_jmpbuf_t buf; + struct rb_vm_tag *prev; + enum ruby_tag_type state; + unsigned int lock_rec; +}; + STATIC_ASSERT(rb_vm_tag_buf_offset, offsetof(struct rb_vm_tag, buf) > 0); STATIC_ASSERT(rb_vm_tag_buf_end, offsetof(struct rb_vm_tag, buf) + sizeof(rb_vm_tag_jmpbuf_t) < |