summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorPeter Zhu <[email protected]>2024-12-24 17:46:43 -0500
committerPeter Zhu <[email protected]>2025-01-02 11:03:04 -0500
commit99ff0224a564b59df3ba8fbd7911dd41a7fdde34 (patch)
tree50119e2d938e21080f7950ab9f067a0f63b78ce3 /gc.c
parentb8c4af24f920a973cfa1f7b671825e8a5421368c (diff)
Move rbimpl_size_add_overflow from gc.c to memory.h
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/12459
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c40
1 files changed, 10 insertions, 30 deletions
diff --git a/gc.c b/gc.c
index 68304d26c5..386d6d0c02 100644
--- a/gc.c
+++ b/gc.c
@@ -481,38 +481,10 @@ rb_malloc_grow_capa(size_t current, size_t type_size)
}
static inline struct rbimpl_size_mul_overflow_tag
-size_add_overflow(size_t x, size_t y)
-{
- size_t z;
- bool p;
-#if 0
-
-#elif defined(ckd_add)
- p = ckd_add(&z, x, y);
-
-#elif __has_builtin(__builtin_add_overflow)
- p = __builtin_add_overflow(x, y, &z);
-
-#elif defined(DSIZE_T)
- RB_GNUC_EXTENSION DSIZE_T dx = x;
- RB_GNUC_EXTENSION DSIZE_T dy = y;
- RB_GNUC_EXTENSION DSIZE_T dz = dx + dy;
- p = dz > SIZE_MAX;
- z = (size_t)dz;
-
-#else
- z = x + y;
- p = z < y;
-
-#endif
- return (struct rbimpl_size_mul_overflow_tag) { p, z, };
-}
-
-static inline struct rbimpl_size_mul_overflow_tag
size_mul_add_overflow(size_t x, size_t y, size_t z) /* x * y + z */
{
struct rbimpl_size_mul_overflow_tag t = rbimpl_size_mul_overflow(x, y);
- struct rbimpl_size_mul_overflow_tag u = size_add_overflow(t.right, z);
+ struct rbimpl_size_mul_overflow_tag u = rbimpl_size_add_overflow(t.right, z);
return (struct rbimpl_size_mul_overflow_tag) { t.left || u.left, u.right };
}
@@ -521,7 +493,7 @@ size_mul_add_mul_overflow(size_t x, size_t y, size_t z, size_t w) /* x * y + z *
{
struct rbimpl_size_mul_overflow_tag t = rbimpl_size_mul_overflow(x, y);
struct rbimpl_size_mul_overflow_tag u = rbimpl_size_mul_overflow(z, w);
- struct rbimpl_size_mul_overflow_tag v = size_add_overflow(t.right, u.right);
+ struct rbimpl_size_mul_overflow_tag v = rbimpl_size_add_overflow(t.right, u.right);
return (struct rbimpl_size_mul_overflow_tag) { t.left || u.left || v.left, v.right };
}
@@ -4590,6 +4562,14 @@ ruby_malloc_size_overflow(size_t count, size_t elsize)
count, elsize);
}
+void
+ruby_malloc_add_size_overflow(size_t x, size_t y)
+{
+ rb_raise(rb_eArgError,
+ "malloc: possible integer overflow (%"PRIuSIZE"+%"PRIuSIZE")",
+ x, y);
+}
+
static void *ruby_xmalloc2_body(size_t n, size_t size);
void *