From e7b18ca6d9b45b7e71694557b9fab8152c62c1ed Mon Sep 17 00:00:00 2001 From: "Urabe, Shyouhei" Date: Fri, 26 Apr 2019 18:01:24 +0900 Subject: [PATCH] glibc says memcpy cannot take NULL At least since 2004, glibc's annotates memcpy as __attribute__((__nonnull__)). On the other hand the argv here, which is passed from rb_funcallv, may be NULL. Practically this should never be a serious problem but for maximum safety, let's avoid passing NULL here. --- vm_eval.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/vm_eval.c b/vm_eval.c index fc271415a6..285eb77773 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -383,6 +383,13 @@ check_funcall_missing(rb_execution_context_t *ec, VALUE klass, VALUE recv, ID mi VALUE argbuf, *new_args = ALLOCV_N(VALUE, argbuf, argc+1); new_args[0] = ID2SYM(mid); + #ifdef __GLIBC__ + if (!argv) { + static const VALUE buf = Qfalse; + VM_ASSERT(argc == 0); + argv = &buf; + } + #endif MEMCPY(new_args+1, argv, VALUE, argc); ec->method_missing_reason = MISSING_NOENTRY; args.ec = ec; @@ -734,6 +741,13 @@ method_missing(VALUE obj, ID id, int argc, const VALUE *argv, enum method_missin nargv = ALLOCV_N(VALUE, work, argc + 1); nargv[0] = ID2SYM(id); + #ifdef __GLIBC__ + if (!argv) { + static const VALUE buf = Qfalse; + VM_ASSERT(argc == 0); + argv = &buf; + } + #endif MEMCPY(nargv + 1, argv, VALUE, argc); ++argc; argv = nargv;