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>
#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;


+ 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 *));

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
}


+ 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

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([-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


+ 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,
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);
}

+ 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
* @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 */



+ 3
- 3
tests/test1.c View File

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


Loading…
Cancel
Save