This fixes seg faults seen after tests finish running. This pulls in
an upstream fix for Nokogiri/libxml2:
https://github.com/ruby/ruby/pull/7663.

These patches can be dropped once Nokogiri v1.15 is available and
`NOKOGIRI_LIBXML_MEMORY_MANAGEMENT=default` is set in CI.

See https://gitlab.com/gitlab-org/gitlab/-/issues/390313#note_1342807685
for more details.
This commit is contained in:
Stan Hu 2023-04-13 11:58:23 -07:00
parent c2be25e44f
commit d95e4efae8
No known key found for this signature in database
GPG key ID: 8D3931AD39CC7A20
5 changed files with 93 additions and 0 deletions

View file

@ -0,0 +1,23 @@
diff --git a/gc.c b/gc.c
index 67a709ff79..98785901f4 100644
--- a/gc.c
+++ b/gc.c
@@ -10174,8 +10174,16 @@ ruby_xrealloc2_body(void *ptr, size_t n, size_t size)
void
ruby_sized_xfree(void *x, size_t size)
{
- if (x) {
- objspace_xfree(&rb_objspace, x, size);
+ if (LIKELY(x)) {
+ /* It's possible for a C extension's pthread destructor function set by pthread_key_create
+ * to be called after ruby_vm_destruct and attempt to free memory. Fall back to mimfree in
+ * that case. */
+ if (LIKELY(GET_VM())) {
+ objspace_xfree(&rb_objspace, x, size);
+ }
+ else {
+ ruby_mimfree(x);
+ }
}
}

View file

@ -0,0 +1,23 @@
diff --git a/gc.c b/gc.c
index 5d0c342206..2bfff21004 100644
--- a/gc.c
+++ b/gc.c
@@ -10905,8 +10905,16 @@ ruby_xrealloc2_body(void *ptr, size_t n, size_t size)
void
ruby_sized_xfree(void *x, size_t size)
{
- if (x) {
- objspace_xfree(&rb_objspace, x, size);
+ if (LIKELY(x)) {
+ /* It's possible for a C extension's pthread destructor function set by pthread_key_create
+ * to be called after ruby_vm_destruct and attempt to free memory. Fall back to mimfree in
+ * that case. */
+ if (LIKELY(GET_VM())) {
+ objspace_xfree(&rb_objspace, x, size);
+ }
+ else {
+ ruby_mimfree(x);
+ }
}
}

View file

@ -0,0 +1,23 @@
diff --git a/gc.c b/gc.c
index 030a4627bd..1c96f6401f 100644
--- a/gc.c
+++ b/gc.c
@@ -11763,8 +11763,16 @@ ruby_xrealloc2_body(void *ptr, size_t n, size_t size)
void
ruby_sized_xfree(void *x, size_t size)
{
- if (x) {
- objspace_xfree(&rb_objspace, x, size);
+ if (LIKELY(x)) {
+ /* It's possible for a C extension's pthread destructor function set by pthread_key_create
+ * to be called after ruby_vm_destruct and attempt to free memory. Fall back to mimfree in
+ * that case. */
+ if (LIKELY(GET_VM())) {
+ objspace_xfree(&rb_objspace, x, size);
+ }
+ else {
+ ruby_mimfree(x);
+ }
}
}

View file

@ -0,0 +1,23 @@
diff --git a/gc.c b/gc.c
index 54400e4f6b..96d43ac8ac 100644
--- a/gc.c
+++ b/gc.c
@@ -12614,8 +12614,16 @@ ruby_xrealloc2_body(void *ptr, size_t n, size_t size)
void
ruby_sized_xfree(void *x, size_t size)
{
- if (x) {
- objspace_xfree(&rb_objspace, x, size);
+ if (LIKELY(x)) {
+ /* It's possible for a C extension's pthread destructor function set by pthread_key_create
+ * to be called after ruby_vm_destruct and attempt to free memory. Fall back to mimfree in
+ * that case. */
+ if (LIKELY(GET_VM())) {
+ objspace_xfree(&rb_objspace, x, size);
+ }
+ else {
+ ruby_mimfree(x);
+ }
}
}

View file

@ -1 +1,2 @@
thread-memory-allocations
fix-ruby-xfree-for-libxml2