summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/validate.h12
-rw-r--r--test-suite/tests/bytevectors.test37
2 files changed, 40 insertions, 9 deletions
diff --git a/libguile/validate.h b/libguile/validate.h
index a1b1b553a..237865547 100644
--- a/libguile/validate.h
+++ b/libguile/validate.h
@@ -3,8 +3,8 @@
#ifndef SCM_VALIDATE_H
#define SCM_VALIDATE_H
-/* Copyright (C) 1999, 2000, 2001, 2002, 2004, 2006, 2007, 2009,
- * 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
+/* Copyright (C) 1999-2002, 2004, 2006, 2007, 2009, 2011-2014,
+ * 2018 Free Software Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
@@ -255,16 +255,20 @@
SCM_ASSERT (scm_ilength (lst) > 0, lst, pos, FUNC_NAME); \
} while (0)
+/* Note: we use (cvar != -1) instead of (cvar >= 0) below
+ in case 'cvar' is of unsigned type. */
#define SCM_VALIDATE_LIST_COPYLEN(pos, lst, cvar) \
do { \
cvar = scm_ilength (lst); \
- SCM_ASSERT (cvar >= 0, lst, pos, FUNC_NAME); \
+ SCM_ASSERT (cvar != -1, lst, pos, FUNC_NAME); \
} while (0)
+/* Note: we use (cvar != -1 && cvar != 0) instead of
+ (cvar >= 1) below in case 'cvar' is of unsigned type. */
#define SCM_VALIDATE_NONEMPTYLIST_COPYLEN(pos, lst, cvar) \
do { \
cvar = scm_ilength (lst); \
- SCM_ASSERT (cvar >= 1, lst, pos, FUNC_NAME); \
+ SCM_ASSERT (cvar != -1 && cvar != 0, lst, pos, FUNC_NAME); \
} while (0)
#define SCM_VALIDATE_ALISTCELL(pos, alist) \
diff --git a/test-suite/tests/bytevectors.test b/test-suite/tests/bytevectors.test
index f0d9f1983..5d4568d82 100644
--- a/test-suite/tests/bytevectors.test
+++ b/test-suite/tests/bytevectors.test
@@ -1,6 +1,6 @@
;;;; bytevectors.test --- R6RS bytevectors. -*- mode: scheme; coding: utf-8; -*-
;;;;
-;;;; Copyright (C) 2009-2015 Free Software Foundation, Inc.
+;;;; Copyright (C) 2009-2015, 2018 Free Software Foundation, Inc.
;;;;
;;;; Ludovic Courtès
;;;;
@@ -19,10 +19,11 @@
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
(define-module (test-bytevector)
- :use-module (test-suite lib)
- :use-module (system base compile)
- :use-module (rnrs bytevectors)
- :use-module (srfi srfi-4))
+ #:use-module (test-suite lib)
+ #:use-module (system base compile)
+ #:use-module (rnrs bytevectors)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-4))
(define exception:decoding-error
(cons 'decoding-error "input (locale conversion|decoding) error"))
@@ -111,6 +112,14 @@
(equal? lst
(bytevector->u8-list (u8-list->bytevector lst)))))
+ (pass-if-exception "u8-list->bytevector [invalid argument type]"
+ exception:wrong-type-arg
+ (u8-list->bytevector 'not-a-list))
+
+ (pass-if-exception "u8-list->bytevector [circular list]"
+ exception:wrong-type-arg
+ (u8-list->bytevector (circular-list 1 2 3)))
+
(pass-if "bytevector-uint-{ref,set!} [small]"
(let ((b (make-bytevector 15)))
(bytevector-uint-set! b 0 #x1234
@@ -206,6 +215,24 @@
(bytevector-u8-set! bv 3 #xff)
bv)))
+ (pass-if-exception "sint-list->bytevector [invalid argument type]"
+ exception:wrong-type-arg
+ (sint-list->bytevector 'not-a-list (endianness big) 2))
+
+ (pass-if-exception "uint-list->bytevector [invalid argument type]"
+ exception:wrong-type-arg
+ (uint-list->bytevector 'not-a-list (endianness big) 2))
+
+ (pass-if-exception "sint-list->bytevector [circular list]"
+ exception:wrong-type-arg
+ (sint-list->bytevector (circular-list 1 2 3) (endianness big)
+ 2))
+
+ (pass-if-exception "uint-list->bytevector [circular list]"
+ exception:wrong-type-arg
+ (uint-list->bytevector (circular-list 1 2 3) (endianness big)
+ 2))
+
(pass-if-exception "sint-list->bytevector [out-of-range]"
exception:out-of-range
(sint-list->bytevector (list 0 0 (expt 2 16)) (endianness big)