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:
parent
b44f505f15
commit
fe73fedab4
2 changed files with 40 additions and 9 deletions
|
@ -3,8 +3,8 @@
|
||||||
#ifndef SCM_VALIDATE_H
|
#ifndef SCM_VALIDATE_H
|
||||||
#define SCM_VALIDATE_H
|
#define SCM_VALIDATE_H
|
||||||
|
|
||||||
/* Copyright (C) 1999, 2000, 2001, 2002, 2004, 2006, 2007, 2009,
|
/* Copyright (C) 1999-2002, 2004, 2006, 2007, 2009, 2011-2014,
|
||||||
* 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
|
* 2018 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public License
|
* 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); \
|
SCM_ASSERT (scm_ilength (lst) > 0, lst, pos, FUNC_NAME); \
|
||||||
} while (0)
|
} 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) \
|
#define SCM_VALIDATE_LIST_COPYLEN(pos, lst, cvar) \
|
||||||
do { \
|
do { \
|
||||||
cvar = scm_ilength (lst); \
|
cvar = scm_ilength (lst); \
|
||||||
SCM_ASSERT (cvar >= 0, lst, pos, FUNC_NAME); \
|
SCM_ASSERT (cvar != -1, lst, pos, FUNC_NAME); \
|
||||||
} while (0)
|
} 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) \
|
#define SCM_VALIDATE_NONEMPTYLIST_COPYLEN(pos, lst, cvar) \
|
||||||
do { \
|
do { \
|
||||||
cvar = scm_ilength (lst); \
|
cvar = scm_ilength (lst); \
|
||||||
SCM_ASSERT (cvar >= 1, lst, pos, FUNC_NAME); \
|
SCM_ASSERT (cvar != -1 && cvar != 0, lst, pos, FUNC_NAME); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define SCM_VALIDATE_ALISTCELL(pos, alist) \
|
#define SCM_VALIDATE_ALISTCELL(pos, alist) \
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
;;;; bytevectors.test --- R6RS bytevectors. -*- mode: scheme; coding: utf-8; -*-
|
;;;; 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
|
;;;; Ludovic Courtès
|
||||||
;;;;
|
;;;;
|
||||||
|
@ -19,10 +19,11 @@
|
||||||
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
(define-module (test-bytevector)
|
(define-module (test-bytevector)
|
||||||
:use-module (test-suite lib)
|
#:use-module (test-suite lib)
|
||||||
:use-module (system base compile)
|
#:use-module (system base compile)
|
||||||
:use-module (rnrs bytevectors)
|
#:use-module (rnrs bytevectors)
|
||||||
:use-module (srfi srfi-4))
|
#:use-module (srfi srfi-1)
|
||||||
|
#:use-module (srfi srfi-4))
|
||||||
|
|
||||||
(define exception:decoding-error
|
(define exception:decoding-error
|
||||||
(cons 'decoding-error "input (locale conversion|decoding) error"))
|
(cons 'decoding-error "input (locale conversion|decoding) error"))
|
||||||
|
@ -111,6 +112,14 @@
|
||||||
(equal? lst
|
(equal? lst
|
||||||
(bytevector->u8-list (u8-list->bytevector 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]"
|
(pass-if "bytevector-uint-{ref,set!} [small]"
|
||||||
(let ((b (make-bytevector 15)))
|
(let ((b (make-bytevector 15)))
|
||||||
(bytevector-uint-set! b 0 #x1234
|
(bytevector-uint-set! b 0 #x1234
|
||||||
|
@ -206,6 +215,24 @@
|
||||||
(bytevector-u8-set! bv 3 #xff)
|
(bytevector-u8-set! bv 3 #xff)
|
||||||
bv)))
|
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]"
|
(pass-if-exception "sint-list->bytevector [out-of-range]"
|
||||||
exception:out-of-range
|
exception:out-of-range
|
||||||
(sint-list->bytevector (list 0 0 (expt 2 16)) (endianness big)
|
(sint-list->bytevector (list 0 0 (expt 2 16)) (endianness big)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue