From a19a657514a384a6c36cb62a2b4eb5352fb3074e Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Mon, 15 Nov 2021 15:16:48 +1300 Subject: Fix 32-bit conversions in IO::Buffer implementation. --- io_buffer.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'io_buffer.c') diff --git a/io_buffer.c b/io_buffer.c index 9b8f85ed4c..45dbfd02da 100644 --- a/io_buffer.c +++ b/io_buffer.c @@ -313,7 +313,20 @@ io_buffer_map(int argc, VALUE *argv, VALUE klass) size = RB_NUM2SIZE(argv[1]); } else { - size = rb_file_size(io); + off_t file_size = rb_file_size(io); + + // Compiler can confirm that we handled file_size < 0 case: + if (file_size < 0) { + rb_raise(rb_eArgError, "Invalid negative file size!"); + } + // Here, we assume that file_size is positive: + else if ((uintmax_t)file_size > SIZE_MAX) { + rb_raise(rb_eArgError, "File larger than address space!"); + } + else { + // This conversion shoud be safe: + size = (size_t)file_size; + } } off_t offset = 0; @@ -900,10 +913,10 @@ DECLAIR_TYPE(U32, uint32_t, RB_IO_BUFFER_BIG_ENDIAN, RB_UINT2NUM, RB_NUM2UINT, r DECLAIR_TYPE(s32, int32_t, RB_IO_BUFFER_LITTLE_ENDIAN, RB_INT2NUM, RB_NUM2INT, ruby_swap32) DECLAIR_TYPE(S32, int32_t, RB_IO_BUFFER_BIG_ENDIAN, RB_INT2NUM, RB_NUM2INT, ruby_swap32) -DECLAIR_TYPE(u64, uint64_t, RB_IO_BUFFER_LITTLE_ENDIAN, RB_ULONG2NUM, RB_NUM2ULONG, ruby_swap64) -DECLAIR_TYPE(U64, uint64_t, RB_IO_BUFFER_BIG_ENDIAN, RB_ULONG2NUM, RB_NUM2ULONG, ruby_swap64) -DECLAIR_TYPE(s64, int64_t, RB_IO_BUFFER_LITTLE_ENDIAN, RB_LONG2NUM, RB_NUM2LONG, ruby_swap64) -DECLAIR_TYPE(S64, int64_t, RB_IO_BUFFER_BIG_ENDIAN, RB_LONG2NUM, RB_NUM2LONG, ruby_swap64) +DECLAIR_TYPE(u64, uint64_t, RB_IO_BUFFER_LITTLE_ENDIAN, RB_ULL2NUM, RB_NUM2ULL, ruby_swap64) +DECLAIR_TYPE(U64, uint64_t, RB_IO_BUFFER_BIG_ENDIAN, RB_ULL2NUM, RB_NUM2ULL, ruby_swap64) +DECLAIR_TYPE(s64, int64_t, RB_IO_BUFFER_LITTLE_ENDIAN, RB_LL2NUM, RB_NUM2LL, ruby_swap64) +DECLAIR_TYPE(S64, int64_t, RB_IO_BUFFER_BIG_ENDIAN, RB_LL2NUM, RB_NUM2LL, ruby_swap64) DECLAIR_TYPE(f32, float, RB_IO_BUFFER_LITTLE_ENDIAN, DBL2NUM, NUM2DBL, ruby_swapf32) DECLAIR_TYPE(F32, float, RB_IO_BUFFER_BIG_ENDIAN, DBL2NUM, NUM2DBL, ruby_swapf32) -- cgit v1.2.1