Browse Source

Fix a few places that needed adjustment for the size_t changes, including updating the range checks to use a calculated SIZE_T_MAX.

tags/json-c-0.13-20171207
Eric Haszlakiewicz 9 years ago
parent
commit
996be85843
8 changed files with 142 additions and 15 deletions
  1. +15
    -7
      arraylist.c
  2. +1
    -1
      arraylist.h
  3. +2
    -1
      autoconf-archive/README.txt
  4. +114
    -0
      autoconf-archive/m4/ax_compile_check_sizeof.m4
  5. +4
    -0
      configure.ac
  6. +2
    -2
      json_object.c
  7. +1
    -1
      json_object.h
  8. +3
    -3
      tests/test1.c

+ 15
- 7
arraylist.c View File

@@ -22,6 +22,14 @@
# include <strings.h> # include <strings.h>
#endif /* HAVE_STRINGS_H */ #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" #include "arraylist.h"


struct array_list* struct array_list*
@@ -64,8 +72,8 @@ static int array_list_expand_internal(struct array_list *arr, size_t max)
size_t new_size; size_t new_size;


if(max < arr->size) return 0; 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; new_size = max;
else else
{ {
@@ -73,8 +81,8 @@ static int array_list_expand_internal(struct array_list *arr, size_t max)
if (new_size < max) if (new_size < max)
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; arr->array = (void**)t;
(void)memset(arr->array + arr->size, 0, (new_size-arr->size)*sizeof(void*)); (void)memset(arr->array + arr->size, 0, (new_size-arr->size)*sizeof(void*));
arr->size = new_size; arr->size = new_size;
@@ -84,7 +92,7 @@ static int array_list_expand_internal(struct array_list *arr, size_t max)
int int
array_list_put_idx(struct array_list *arr, size_t idx, void *data) 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(array_list_expand_internal(arr, idx+1)) return -1;
if(arr->array[idx]) arr->free_fn(arr->array[idx]); if(arr->array[idx]) arr->free_fn(arr->array[idx]);
arr->array[idx] = data; arr->array[idx] = data;
@@ -118,9 +126,9 @@ array_list_length(struct array_list *arr)
} }


int 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; stop = idx + count;
if ( idx >= arr->length || stop > arr->length ) return -1; if ( idx >= arr->length || stop > arr->length ) return -1;


+ 1
- 1
arraylist.h View File

@@ -54,7 +54,7 @@ extern void* array_list_bsearch(const void **key,
int (*sort_fn)(const void *, const void *)); int (*sort_fn)(const void *, const void *));


extern int 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 #ifdef __cplusplus
} }


+ 2
- 1
autoconf-archive/README.txt View File

@@ -3,5 +3,6 @@ Autoconf Archive fetched from:


http://gnu.mirror.iweb.com/autoconf-archive/autoconf-archive-2015.09.25.tar.xz 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.



+ 114
- 0
autoconf-archive/m4/ax_compile_check_sizeof.m4 View File

@@ -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 <stddef.h>
# #endif
# #ifdef HAVE_UNISTD_H
# #include <unistd.h>
# #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 <ghazi@caip.rutgers.edu>
#
# 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 <http://www.gnu.org/licenses/>.
#
# 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(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl
dnl The cache variable name.
define(<<AC_CV_NAME>>, 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 <sys/types.h>
$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
])

+ 4
- 0
configure.ac View File

@@ -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([-Wextra -Wwrite-string -Wno-unused-parameter])
AX_APPEND_COMPILE_FLAGS([-D_GNU_SOURCE -D_REENTRANT]) 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([ AC_CONFIG_FILES([
Makefile Makefile
json-c.pc json-c.pc


+ 2
- 2
json_object.c View File

@@ -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, static int json_array_equal(struct json_object* jso1,
struct json_object* jso2) struct json_object* jso2)
{ {
int len, i;
size_t len, i;


len = json_object_array_length(jso1); len = json_object_array_length(jso1);
if (len != json_object_array_length(jso2)) 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; 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); return array_list_del_idx(jso->o.c_array, idx, count);
} }

+ 1
- 1
json_object.h View File

@@ -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 * @param count the number of elements to delete
* @returns 0 if the elements were successfully deleted * @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 */ /* json_bool type methods */




+ 3
- 3
tests/test1.c View File

@@ -53,8 +53,8 @@ void test_array_del_idx(void);
void test_array_del_idx() void test_array_del_idx()
{ {
int rc; int rc;
int ii;
int orig_array_len;
size_t ii;
size_t orig_array_len;
json_object *my_array; json_object *my_array;
#ifdef TEST_FORMATTED #ifdef TEST_FORMATTED
int sflags = 0; int sflags = 0;
@@ -105,7 +105,7 @@ void test_array_del_idx()
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
json_object *my_string, *my_int, *my_object, *my_array; json_object *my_string, *my_int, *my_object, *my_array;
int i;
size_t i;
#ifdef TEST_FORMATTED #ifdef TEST_FORMATTED
int sflags = 0; int sflags = 0;
#endif #endif


Loading…
Cancel
Save