From b7c1b60c83098abf83c39b724e4e96eae8478c53 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Fri, 9 Aug 2013 18:23:56 -0400 Subject: [PATCH] dereference-pointer: check for null pointer. * libguile/foreign.c (scm_dereference_pointer): Check for attempts to dereference a null pointer. * test-suite/tests/foreign.test ("null pointer"): Add test. --- libguile/foreign.c | 8 +++++++- test-suite/tests/foreign.test | 4 ++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/libguile/foreign.c b/libguile/foreign.c index 90a4fcab4..01af90019 100644 --- a/libguile/foreign.c +++ b/libguile/foreign.c @@ -342,9 +342,15 @@ SCM_DEFINE (scm_dereference_pointer, "dereference-pointer", 1, 0, 0, "holds a pointer, return this pointer.") #define FUNC_NAME s_scm_dereference_pointer { + void **ptr; + SCM_VALIDATE_POINTER (1, pointer); - return scm_from_pointer (* (void **) SCM_POINTER_VALUE (pointer), NULL); + ptr = SCM_POINTER_VALUE (pointer); + if (SCM_UNLIKELY (ptr == NULL)) + null_pointer_error (FUNC_NAME); + + return scm_from_pointer (*ptr, NULL); } #undef FUNC_NAME diff --git a/test-suite/tests/foreign.test b/test-suite/tests/foreign.test index 4b129db24..acdb3db05 100644 --- a/test-suite/tests/foreign.test +++ b/test-suite/tests/foreign.test @@ -51,6 +51,10 @@ (pass-if "null-pointer? %null-pointer" (null-pointer? %null-pointer)) + (pass-if-exception "dereference-pointer %null-pointer" + exception:null-pointer-error + (dereference-pointer %null-pointer)) + (pass-if-exception "pointer->bytevector %null-pointer" exception:null-pointer-error (pointer->bytevector %null-pointer 7)))