[前][次][番号順一覧][スレッド一覧]

ruby-changes:69767

From: Samuel <ko1@a...>
Date: Wed, 17 Nov 2021 06:39:50 +0900 (JST)
Subject: [ruby-changes:69767] a19a657514 (master): Fix 32-bit conversions in IO::Buffer implementation.

https://git.ruby-lang.org/ruby.git/commit/?id=a19a657514

From a19a657514a384a6c36cb62a2b4eb5352fb3074e Mon Sep 17 00:00:00 2001
From: Samuel Williams <samuel.williams@o...>
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(-)

diff --git a/io_buffer.c b/io_buffer.c
index 9b8f85ed4cc..45dbfd02da3 100644
--- a/io_buffer.c
+++ b/io_buffer.c
@@ -313,7 +313,20 @@ io_buffer_map(int argc, VALUE *argv, VALUE klass) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L313
         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 https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L913
 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


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]