From 996be858439e8207dadc76e0b45344edfd787861 Mon Sep 17 00:00:00 2001 From: Eric Haszlakiewicz Date: Mon, 23 May 2016 02:10:58 +0000 Subject: [PATCH] Fix a few places that needed adjustment for the size_t changes, including updating the range checks to use a calculated SIZE_T_MAX. --- arraylist.c | 22 ++-- arraylist.h | 2 +- autoconf-archive/README.txt | 3 +- .../m4/ax_compile_check_sizeof.m4 | 114 ++++++++++++++++++ configure.ac | 4 + json_object.c | 4 +- json_object.h | 2 +- tests/test1.c | 6 +- 8 files changed, 142 insertions(+), 15 deletions(-) create mode 100644 autoconf-archive/m4/ax_compile_check_sizeof.m4 diff --git a/arraylist.c b/arraylist.c index a02266e..0d01069 100644 --- a/arraylist.c +++ b/arraylist.c @@ -22,6 +22,14 @@ # include #endif /* HAVE_STRINGS_H */ +#if SIZEOF_SIZE_T == SIZEOF_INT +#define SIZE_T_MAX UINT_MAX +#elif SIZEOF_SIZE_T == SIZEOF_LONG +#define SIZE_T_MAX ULONG_MAX +#else +#error Unable to determine size of size_t +#endif + #include "arraylist.h" struct array_list* @@ -64,8 +72,8 @@ static int array_list_expand_internal(struct array_list *arr, size_t max) size_t new_size; if(max < arr->size) return 0; - /* Avoid undefined behaviour on int32 overflow */ - if( arr->size >= INT_MAX / 2 ) + /* Avoid undefined behaviour on size_t overflow */ + if( arr->size >= SIZE_T_MAX / 2 ) new_size = max; else { @@ -73,8 +81,8 @@ static int array_list_expand_internal(struct array_list *arr, size_t max) if (new_size < max) new_size = max; } - if((size_t)new_size > (~((size_t)0)) / sizeof(void*)) return -1; - if(!(t = realloc(arr->array, ((size_t)new_size)*sizeof(void*)))) return -1; + if (new_size > (~((size_t)0)) / sizeof(void*)) return -1; + if (!(t = realloc(arr->array, new_size*sizeof(void*)))) return -1; arr->array = (void**)t; (void)memset(arr->array + arr->size, 0, (new_size-arr->size)*sizeof(void*)); arr->size = new_size; @@ -84,7 +92,7 @@ static int array_list_expand_internal(struct array_list *arr, size_t max) int array_list_put_idx(struct array_list *arr, size_t idx, void *data) { - if( idx < 0 || idx > INT_MAX - 1 ) return -1; + if (idx > SIZE_T_MAX - 1 ) return -1; if(array_list_expand_internal(arr, idx+1)) return -1; if(arr->array[idx]) arr->free_fn(arr->array[idx]); arr->array[idx] = data; @@ -118,9 +126,9 @@ array_list_length(struct array_list *arr) } int -array_list_del_idx( struct array_list *arr, int idx, int count ) +array_list_del_idx( struct array_list *arr, size_t idx, size_t count ) { - int i, stop; + size_t i, stop; stop = idx + count; if ( idx >= arr->length || stop > arr->length ) return -1; diff --git a/arraylist.h b/arraylist.h index bcbaa8b..bc10903 100644 --- a/arraylist.h +++ b/arraylist.h @@ -54,7 +54,7 @@ extern void* array_list_bsearch(const void **key, int (*sort_fn)(const void *, const void *)); extern int -array_list_del_idx(struct array_list *arr, int i, int count); +array_list_del_idx(struct array_list *arr, size_t idx, size_t count); #ifdef __cplusplus } diff --git a/autoconf-archive/README.txt b/autoconf-archive/README.txt index de65ae3..936582a 100644 --- a/autoconf-archive/README.txt +++ b/autoconf-archive/README.txt @@ -3,5 +3,6 @@ Autoconf Archive fetched from: http://gnu.mirror.iweb.com/autoconf-archive/autoconf-archive-2015.09.25.tar.xz -Grabbed the minimum files needed for the AX_APPEND_COMPILE_FLAGS macro. +Grabbed the minimum files needed for the AX_APPEND_COMPILE_FLAGS and +AX_COMPILE_CHECK_SIZEOF macros. diff --git a/autoconf-archive/m4/ax_compile_check_sizeof.m4 b/autoconf-archive/m4/ax_compile_check_sizeof.m4 new file mode 100644 index 0000000..00d0bcc --- /dev/null +++ b/autoconf-archive/m4/ax_compile_check_sizeof.m4 @@ -0,0 +1,114 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_compile_check_sizeof.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_COMPILE_CHECK_SIZEOF(TYPE [, HEADERS [, EXTRA_SIZES...]]) +# +# DESCRIPTION +# +# This macro checks for the size of TYPE using compile checks, not run +# checks. You can supply extra HEADERS to look into. the check will cycle +# through 1 2 4 8 16 and any EXTRA_SIZES the user supplies. If a match is +# found, it will #define SIZEOF_`TYPE' to that value. Otherwise it will +# emit a configure time error indicating the size of the type could not be +# determined. +# +# The trick is that C will not allow duplicate case labels. While this is +# valid C code: +# +# switch (0) case 0: case 1:; +# +# The following is not: +# +# switch (0) case 0: case 0:; +# +# Thus, the AC_TRY_COMPILE will fail if the currently tried size does not +# match. +# +# Here is an example skeleton configure.in script, demonstrating the +# macro's usage: +# +# AC_PROG_CC +# AC_CHECK_HEADERS(stddef.h unistd.h) +# AC_TYPE_SIZE_T +# AC_CHECK_TYPE(ssize_t, int) +# +# headers='#ifdef HAVE_STDDEF_H +# #include +# #endif +# #ifdef HAVE_UNISTD_H +# #include +# #endif +# ' +# +# AX_COMPILE_CHECK_SIZEOF(char) +# AX_COMPILE_CHECK_SIZEOF(short) +# AX_COMPILE_CHECK_SIZEOF(int) +# AX_COMPILE_CHECK_SIZEOF(long) +# AX_COMPILE_CHECK_SIZEOF(unsigned char *) +# AX_COMPILE_CHECK_SIZEOF(void *) +# AX_COMPILE_CHECK_SIZEOF(size_t, $headers) +# AX_COMPILE_CHECK_SIZEOF(ssize_t, $headers) +# AX_COMPILE_CHECK_SIZEOF(ptrdiff_t, $headers) +# AX_COMPILE_CHECK_SIZEOF(off_t, $headers) +# +# LICENSE +# +# Copyright (c) 2008 Kaveh Ghazi +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 5 + +AU_ALIAS([AC_COMPILE_CHECK_SIZEOF], [AX_COMPILE_CHECK_SIZEOF]) +AC_DEFUN([AX_COMPILE_CHECK_SIZEOF], +[changequote(<<, >>)dnl +dnl The name to #define. +define(<>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl +dnl The cache variable name. +define(<>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl +changequote([, ])dnl +AC_MSG_CHECKING(size of $1) +AC_CACHE_VAL(AC_CV_NAME, +[for ac_size in 4 8 1 2 16 $3 ; do # List sizes in rough order of prevalence. + AC_TRY_COMPILE([#include "confdefs.h" +#include +$2 +], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size) + if test x$AC_CV_NAME != x ; then break; fi +done +]) +if test x$AC_CV_NAME = x ; then + AC_MSG_ERROR([cannot determine a size for $1]) +fi +AC_MSG_RESULT($AC_CV_NAME) +AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1]) +undefine([AC_TYPE_NAME])dnl +undefine([AC_CV_NAME])dnl +]) diff --git a/configure.ac b/configure.ac index ed86210..631464d 100644 --- a/configure.ac +++ b/configure.ac @@ -107,6 +107,10 @@ AX_APPEND_COMPILE_FLAGS([-Wall -Werror -Wno-error=deprecated-declarations]) AX_APPEND_COMPILE_FLAGS([-Wextra -Wwrite-string -Wno-unused-parameter]) AX_APPEND_COMPILE_FLAGS([-D_GNU_SOURCE -D_REENTRANT]) +AX_COMPILE_CHECK_SIZEOF(int) +AX_COMPILE_CHECK_SIZEOF(long) +AX_COMPILE_CHECK_SIZEOF(size_t, [#include "json_inttypes.h"]) + AC_CONFIG_FILES([ Makefile json-c.pc diff --git a/json_object.c b/json_object.c index b0b381e..f0d1251 100644 --- a/json_object.c +++ b/json_object.c @@ -1000,7 +1000,7 @@ struct json_object* json_object_array_get_idx(const struct json_object *jso, static int json_array_equal(struct json_object* jso1, struct json_object* jso2) { - int len, i; + size_t len, i; len = json_object_array_length(jso1); if (len != json_object_array_length(jso2)) @@ -1079,7 +1079,7 @@ int json_object_equal(struct json_object* jso1, struct json_object* jso2) return 0; } -int json_object_array_del_idx(struct json_object *jso, int idx, int count) +int json_object_array_del_idx(struct json_object *jso, size_t idx, size_t count) { return array_list_del_idx(jso->o.c_array, idx, count); } diff --git a/json_object.h b/json_object.h index 46540b7..669f8d2 100644 --- a/json_object.h +++ b/json_object.h @@ -537,7 +537,7 @@ extern struct json_object* json_object_array_get_idx(const struct json_object *o * @param count the number of elements to delete * @returns 0 if the elements were successfully deleted */ -extern int json_object_array_del_idx(struct json_object *obj, int idx, int count); +extern int json_object_array_del_idx(struct json_object *obj, size_t idx, size_t count); /* json_bool type methods */ diff --git a/tests/test1.c b/tests/test1.c index 2446a10..3d5b09a 100644 --- a/tests/test1.c +++ b/tests/test1.c @@ -53,8 +53,8 @@ void test_array_del_idx(void); void test_array_del_idx() { int rc; - int ii; - int orig_array_len; + size_t ii; + size_t orig_array_len; json_object *my_array; #ifdef TEST_FORMATTED int sflags = 0; @@ -105,7 +105,7 @@ void test_array_del_idx() int main(int argc, char **argv) { json_object *my_string, *my_int, *my_object, *my_array; - int i; + size_t i; #ifdef TEST_FORMATTED int sflags = 0; #endif -- 2.40.0