summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2016-05-22 22:33:46 +0200
committerAndy Wingo <wingo@pobox.com>2016-05-22 22:33:46 +0200
commit4e288ec2ff9c5387951dcb7f78f3193261228878 (patch)
tree7ea1407463e1da6d07531831d99d0864b06f6db8
parent2c95a2102711c990d81bd8908506cd35b9b71022 (diff)
downloadguile-4e288ec2ff9c5387951dcb7f78f3193261228878.tar.gz
Fix range checking in new Scheme-to-C port code
* libguile/ports.c (trampoline_to_c_read, trampoline_to_c_write): Fix bugs checking ranges of start and count parameters.
-rw-r--r--libguile/ports.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/libguile/ports.c b/libguile/ports.c
index 445ccc076..ff1db9d35 100644
--- a/libguile/ports.c
+++ b/libguile/ports.c
@@ -172,10 +172,11 @@ trampoline_to_c_read (SCM port, SCM dst, SCM start, SCM count)
size_t c_start, c_count, ret;
SCM_VALIDATE_OPPORT (1, port);
+ SCM_VALIDATE_BYTEVECTOR (2, dst);
c_start = scm_to_size_t (start);
c_count = scm_to_size_t (count);
- SCM_ASSERT_RANGE (2, start, c_start <= c_count);
- SCM_ASSERT_RANGE (3, count, c_start+c_count <= scm_c_bytevector_length (dst));
+ SCM_ASSERT_RANGE (3, start, c_start <= SCM_BYTEVECTOR_LENGTH (dst));
+ SCM_ASSERT_RANGE (4, count, c_count <= SCM_BYTEVECTOR_LENGTH (dst) - c_start);
ret = SCM_PORT_TYPE (port)->c_read (port, dst, c_start, c_count);
@@ -198,10 +199,11 @@ trampoline_to_c_write (SCM port, SCM src, SCM start, SCM count)
size_t c_start, c_count, ret;
SCM_VALIDATE_OPPORT (1, port);
+ SCM_VALIDATE_BYTEVECTOR (2, src);
c_start = scm_to_size_t (start);
c_count = scm_to_size_t (count);
- SCM_ASSERT_RANGE (2, start, c_start <= c_count);
- SCM_ASSERT_RANGE (3, count, c_start+c_count <= scm_c_bytevector_length (src));
+ SCM_ASSERT_RANGE (3, start, c_start <= SCM_BYTEVECTOR_LENGTH (src));
+ SCM_ASSERT_RANGE (4, count, c_count <= SCM_BYTEVECTOR_LENGTH (src) - c_start);
ret = SCM_PORT_TYPE (port)->c_write (port, src, c_start, c_count);