diff options
author | Peter Zhu <[email protected]> | 2024-12-24 17:46:43 -0500 |
---|---|---|
committer | Peter Zhu <[email protected]> | 2025-01-02 11:03:04 -0500 |
commit | 99ff0224a564b59df3ba8fbd7911dd41a7fdde34 (patch) | |
tree | 50119e2d938e21080f7950ab9f067a0f63b78ce3 /gc.c | |
parent | b8c4af24f920a973cfa1f7b671825e8a5421368c (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.c | 40 |
1 files changed, 10 insertions, 30 deletions
@@ -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 * |