summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2013-08-09 18:23:56 -0400
committerMark H Weaver <mhw@netris.org>2013-08-09 18:26:07 -0400
commitb7c1b60c83098abf83c39b724e4e96eae8478c53 (patch)
tree464941ff44909f2e125d2f18ef8b04754a78851d
parentfa102e73c3d14f52d089ec2faa55c9a7e87f4a23 (diff)
downloadguile-b7c1b60c83098abf83c39b724e4e96eae8478c53.tar.gz
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.
-rw-r--r--libguile/foreign.c8
-rw-r--r--test-suite/tests/foreign.test4
2 files changed, 11 insertions, 1 deletions
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)))