Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
From 3d186e7edd50ad4e8037f3cd017a19532a5f9a58 Mon Sep 17 00:00:00 2001
From: Yuta Saito <[email protected]>
Date: Tue, 1 Apr 2025 05:48:13 +0000
Subject: [PATCH 1/3] Revert "Don't set `saved_ec.tag` to `NULL` in
`cont_init()`"

This reverts commit 372515f33c908b36b3f5fbd2edcb34c69b418500.
---
cont.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/cont.c b/cont.c
index 072ae4562f..ae68da4e83 100644
--- a/cont.c
+++ b/cont.c
@@ -1369,6 +1369,7 @@ cont_init(rb_context_t *cont, rb_thread_t *th)
/* save thread context */
cont_save_thread(cont, th);
cont->saved_ec.thread_ptr = th;
+ cont->saved_ec.tag = NULL;
cont->saved_ec.local_storage = NULL;
cont->saved_ec.local_storage_recursive_hash = Qnil;
cont->saved_ec.local_storage_recursive_hash_for_trace = Qnil;
--
2.48.1

Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
From 72a19c53d2ef1d3d452ad23fe3efc9e02de3a45c Mon Sep 17 00:00:00 2001
From: Yuta Saito <[email protected]>
Date: Tue, 1 Apr 2025 05:48:27 +0000
Subject: [PATCH 2/3] Revert "Fix jump buffer leak in setjmp handler in WASI
builds"

This reverts commit 3a730be8b464454878a42132f6fecb98ab4c1b5b.
---
cont.c | 1 -
eval_intern.h | 4 +--
vm_core.h | 77 +++++++++++++++++----------------------------------
3 files changed, 27 insertions(+), 55 deletions(-)

diff --git a/cont.c b/cont.c
index ae68da4e83..072ae4562f 100644
--- a/cont.c
+++ b/cont.c
@@ -1369,7 +1369,6 @@ cont_init(rb_context_t *cont, rb_thread_t *th)
/* save thread context */
cont_save_thread(cont, th);
cont->saved_ec.thread_ptr = th;
- cont->saved_ec.tag = NULL;
cont->saved_ec.local_storage = NULL;
cont->saved_ec.local_storage_recursive_hash = Qnil;
cont->saved_ec.local_storage_recursive_hash_for_trace = Qnil;
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) <
--
2.48.1

Loading