summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuta Saito <kateinoigakukun@gmail.com>2025-04-01 11:01:49 +0000
committerYuta Saito <kateinoigakukun@gmail.com>2025-04-02 01:11:01 +0900
commit30e5e7c005f4a0a2cd4b883ab8c2be48aa3bf6ed (patch)
tree8cd1698c24ae2485cdbdd8456dbf2c0afb1769ba
parenta671b25525279706d1fa2ee3b25ef45e3ec0eb89 (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.h4
-rw-r--r--vm_core.h77
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() \
diff --git a/vm_core.h b/vm_core.h
index 28d742feed..d9159f5ccf 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -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) <