From 956ea81f63afcbb131ba7605e5e4f1acf59183f0 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 30 Apr 2017 00:42:07 +0900 Subject: [PATCH] bugfix: strict byte range check --- lib/blob.c | 6 +++--- lib/include/picrin.h | 2 +- lib/state.h | 4 +++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/blob.c b/lib/blob.c index 1462e1a3..b3b00cbf 100644 --- a/lib/blob.c +++ b/lib/blob.c @@ -56,7 +56,7 @@ pic_blob_bytevector(pic_state *pic) TYPE_CHECK(pic, argv[i], int); if (pic_int(pic, argv[i]) < 0 || pic_int(pic, argv[i]) > 255) { - pic_error(pic, "byte out of range", 0); + pic_error(pic, "byte out of range", 1, argv[i]); } *data++ = (unsigned char)pic_int(pic, argv[i]); @@ -74,7 +74,7 @@ pic_blob_make_bytevector(pic_state *pic) pic_get_args(pic, "i|i", &k, &b); if (b < 0 || b > 255) - pic_error(pic, "byte out of range", 0); + pic_error(pic, "byte out of range", 1, pic_int_value(pic, b)); if (k < 0) { pic_error(pic, "make-bytevector: negative length given", 1, pic_int_value(pic, k)); @@ -119,7 +119,7 @@ pic_blob_bytevector_u8_set(pic_state *pic) pic_get_args(pic, "bii", &buf, &len, &k, &v); if (v < 0 || v > 255) - pic_error(pic, "byte out of range", 0); + pic_error(pic, "byte out of range", 1, pic_int_value(pic, v)); VALID_INDEX(pic, len, k); diff --git a/lib/include/picrin.h b/lib/include/picrin.h index dce362fc..d9f4a96a 100644 --- a/lib/include/picrin.h +++ b/lib/include/picrin.h @@ -125,7 +125,7 @@ pic_value pic_data_value(pic_state *, void *ptr, const pic_data_type *type); int pic_int(pic_state *, pic_value i); double pic_float(pic_state *, pic_value f); char pic_char(pic_state *, pic_value c); -#define pic_bool(pic,b) (! pic_false_p(pic, b)) +#define pic_bool(pic,b) (! pic_false_p(pic, (b))) const char *pic_str(pic_state *, pic_value str, int *len); unsigned char *pic_blob(pic_state *, pic_value blob, int *len); void *pic_data(pic_state *, pic_value data); diff --git a/lib/state.h b/lib/state.h index cc147c33..1c7f2543 100644 --- a/lib/state.h +++ b/lib/state.h @@ -61,7 +61,9 @@ pic_value pic_global_ref(pic_state *pic, pic_value uid); void pic_global_set(pic_state *pic, pic_value uid, pic_value value); #define MKCALL(cxt,argc) \ - ((cxt)->tmpcode[0] = OP_CALL, (cxt)->tmpcode[1] = (argc), (cxt)->tmpcode) + ((argc) < 256 \ + ? ((cxt)->tmpcode[0] = OP_CALL, (cxt)->tmpcode[1] = (argc), (cxt)->tmpcode) \ + : (pic_error(pic, "too many arguments", 1, pic_int_value(pic, (argc))), NULL)) #define CONTEXT_VINITK(pic,cxt,proc,k,n,ap) do { \ int i; \