From c26f650d9606d510d776bb10b558aca215fb67e8 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 5 Aug 2023 11:11:26 +0900 Subject: [PATCH] Fix wrong conversion and cast Conversions from `uint64_t`/`VALUE` to `long` may loose upper bits. --- ext/yarp/api_pack.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ext/yarp/api_pack.c b/ext/yarp/api_pack.c index 05f9dc42c08..7f0440970e3 100644 --- a/ext/yarp/api_pack.c +++ b/ext/yarp/api_pack.c @@ -9,6 +9,16 @@ static VALUE v3_2_0_symbol; static VALUE pack_symbol; static VALUE unpack_symbol; +#if SIZEOF_UINT64_T == SIZEOF_LONG_LONG +# define UINT64T2NUM(x) ULL2NUM(x) +# define NUM2UINT64T(x) (uint64_t)NUM2ULL(x) +#elif SIZEOF_UINT64_T == SIZEOF_LONG +# define UINT64T2NUM(x) ULONG2NUM(x) +# define NUM2UINT64T(x) (uint64_t)NUM2ULONG(x) +#else +// error No uint64_t conversion +#endif + static VALUE pack_type_to_symbol(yp_pack_type type) { switch (type) { @@ -221,7 +231,7 @@ pack_parse(VALUE self, VALUE version_symbol, VALUE variant_symbol, VALUE format_ pack_endian_to_symbol(endian), pack_size_to_symbol(size), pack_length_type_to_symbol(length_type), - (long) LONG2NUM(length) }; + UINT64T2NUM(length) }; rb_ary_push(directives_array, rb_class_new_instance(9, directive_args, rb_cYARPPackDirective)); }