1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-29 19:30:36 +02:00

Fix list validation of *list->bytevector procedures.

Fixes <https://bugs.gnu.org/32938>.
Reported by Josh Datko <jbd@cryptotronix.com>.

* libguile/validate.h (SCM_VALIDATE_LIST_COPYLEN)
(SCM_VALIDATE_NONEMPTYLIST_COPYLEN): Use '!=' instead of '>=' to
validate the result of 'scm_ilength' after it has been stored in
the user variable 'cvar'.
* test-suite/tests/bytevectors.test: Add tests.  Use '#:use-module'
instead of ':use-module' in 'define-module' form.
This commit is contained in:
Mark H Weaver 2018-10-14 02:22:22 -04:00 committed by Andy Wingo
parent 0c0a658c56
commit 5dcad70d99
2 changed files with 39 additions and 8 deletions

View file

@ -1,7 +1,7 @@
#ifndef SCM_LIST_H
#define SCM_LIST_H
/* Copyright 1995-1997,2000-2001,2003-2006,2008-2009,2018
/* Copyright 1995-1997,2000-2001,2003-2006,2008-2009,2018-2019
Free Software Foundation, Inc.
This file is part of Guile.
@ -88,16 +88,20 @@ SCM_API SCM scm_copy_tree (SCM obj);
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) instead of (cvar >= 0) 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, lst, pos, FUNC_NAME); \
} while (0)

View file

@ -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)