]> granicus.if.org Git - json-c/commitdiff
Fix a few places that needed adjustment for the size_t changes, including updating...
authorEric Haszlakiewicz <erh+git@nimenees.com>
Mon, 23 May 2016 02:10:58 +0000 (02:10 +0000)
committerEric Haszlakiewicz <erh+git@nimenees.com>
Mon, 23 May 2016 02:10:58 +0000 (02:10 +0000)
arraylist.c
arraylist.h
autoconf-archive/README.txt
autoconf-archive/m4/ax_compile_check_sizeof.m4 [new file with mode: 0644]
configure.ac
json_object.c
json_object.h
tests/test1.c

index a02266e8266b174f2660b8e79ffc52933730300a..0d0106956fdb3bd1958868ff3b507c6641d29d32 100644 (file)
 # 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;
index bcbaa8b30059ec27c9ee2d16700c777f4fbb751a..bc10903dcc98978d8c5536f3028c5bef818dd4c2 100644 (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
 }
index de65ae31c1451813ff14b28c26fa3941d90c1076..936582a5348862e397e083ef1844bff3ac395c4a 100644 (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.
 
diff --git a/autoconf-archive/m4/ax_compile_check_sizeof.m4 b/autoconf-archive/m4/ax_compile_check_sizeof.m4
new file mode 100644 (file)
index 0000000..00d0bcc
--- /dev/null
@@ -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
+])
index ed86210678c08378648ce30e93c2f75b9ed88461..631464d4ddc2c1bf5ac7afaf32636df01ed79652 100644 (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
index b0b381e304676ec973710160f62bbcf85e0b9d45..f0d1251de605223daac0f053b134264aad97783b 100644 (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);
 }
index 46540b742116e229fe0f08d75009442d4b712a20..669f8d231568da3bea4b48a9cc3ddd2a6c931844 100644 (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 */
 
index 2446a10e9727d7b7007c5b695cd8355493df4cb6..3d5b09a01be31910ff4daa345bcde8ff0e8757d4 100644 (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