Changeset f632f7d9a1b4222c469abf2fc43923fe4868fe37

Show
Ignore:
Timestamp:
09/07/11 21:19:46 (3 years ago)
Author:
Theo Schlossnagle <jesus@omniti.com>
git-committer:
Theo Schlossnagle <jesus@omniti.com> 1315430386 -0400
git-parent:

[fd806572060400af50d983bcef55dd90a6c39bde]

git-author:
Theo Schlossnagle <jesus@omniti.com> 1315430386 -0400
Message:

provide overflow detection and recover for json_objects and leverage that in the lua stuff

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/json-lib/json_object.c

    refa9375 rf632f7d  
    327327  struct json_object *jso = json_object_new(json_type_int); 
    328328  if(!jso) return NULL; 
     329  jso->o_ioverflow = json_overflow_int; 
    329330  jso->_to_json_string = &json_object_int_to_json_string; 
    330331  jso->o.c_int = i; 
    331332  return jso; 
     333} 
     334 
     335json_int_overflow json_object_get_int_overflow(struct json_object *jso) 
     336{ 
     337  return jso->o_ioverflow; 
     338} 
     339void json_object_set_int_overflow(struct json_object *jso, 
     340                                          json_int_overflow o) { 
     341  jso->o_ioverflow = o; 
     342} 
     343 
     344u_int64_t json_object_get_uint64(struct json_object *jso) 
     345{ 
     346  return jso->overflow.c_uint64; 
     347} 
     348void json_object_set_uint64(struct json_object *jso, u_int64_t v) 
     349{ 
     350  jso->overflow.c_uint64 = v; 
     351} 
     352int64_t json_object_get_int64(struct json_object *jso) 
     353{ 
     354  return jso->overflow.c_int64; 
     355} 
     356void json_object_set_int64(struct json_object *jso, int64_t v) 
     357{ 
     358  jso->overflow.c_int64 = v; 
    332359} 
    333360 
  • src/json-lib/json_object.h

    refa9375 rf632f7d  
    5050} json_type; 
    5151 
     52typedef enum json_int_overflow { 
     53  json_overflow_int, 
     54  json_overflow_uint64, 
     55  json_overflow_int64 
     56} json_int_overflow; 
     57 
    5258/* reference counting functions */ 
    5359 
     
    255261extern struct json_object* json_object_new_int(int i); 
    256262 
     263 
     264extern json_int_overflow json_object_get_int_overflow(struct json_object *jso); 
     265extern void json_object_set_int_overflow(struct json_object *jso, 
     266                                          json_int_overflow o); 
     267extern u_int64_t json_object_get_uint64(struct json_object *jso); 
     268extern int64_t json_object_get_int64(struct json_object *jso); 
     269extern void json_object_set_uint64(struct json_object *jso, u_int64_t v); 
     270extern void json_object_set_int64(struct json_object *jso, int64_t v); 
     271 
    257272/** Get the int value of a json_object 
    258273 * 
  • src/json-lib/json_object_private.h

    refa9375 rf632f7d  
    1717#endif 
    1818 
     19#include <stdint.h> 
     20 
    1921typedef void (json_object_delete_fn)(struct json_object *o); 
    2022typedef int (json_object_to_json_string_fn)(struct json_object *o, 
     
    2426{ 
    2527  enum json_type o_type; 
     28  enum json_int_overflow o_ioverflow; 
    2629  json_object_delete_fn *_delete; 
    2730  json_object_to_json_string_fn *_to_json_string; 
     
    3639    char *c_string; 
    3740  } o; 
     41  union { 
     42    u_int64_t c_uint64; 
     43    int64_t c_int64; 
     44  } overflow; 
    3845}; 
    3946 
  • src/json-lib/json_tokener.c

    refa9375 rf632f7d  
    474474        if(!tok->is_double && sscanf(tok->pb->buf, "%d", &numi) == 1) { 
    475475          current = json_object_new_int(numi); 
     476          if(tok->pb->buf[0] == '-') { 
     477            int64_t i64; 
     478            i64 = strtoll(tok->pb->buf, NULL, 10); 
     479            json_object_set_int64(current, i64); 
     480            if(i64 != numi) 
     481              json_object_set_int_overflow(current, json_overflow_int64); 
     482          } 
     483          else { 
     484            u_int64_t u64; 
     485            u64 = strtoll(tok->pb->buf, NULL, 10); 
     486            json_object_set_uint64(current, u64); 
     487            if(u64 != numi) 
     488              json_object_set_int_overflow(current, json_overflow_uint64); 
     489          } 
    476490        } else if(tok->is_double && sscanf(tok->pb->buf, "%lf", &numd) == 1) { 
    477491          current = json_object_new_double(numd); 
  • src/modules/lua_noit.c

    r032dfff rf632f7d  
    17741774    case json_type_boolean: lua_pushboolean(L, json_object_get_boolean(o)); break; 
    17751775    case json_type_double: lua_pushnumber(L, json_object_get_double(o)); break; 
    1776     case json_type_int: lua_pushnumber(L, json_object_get_int(o)); break; 
     1776    case json_type_int: 
     1777    { 
     1778      int64_t i64; 
     1779      uint64_t u64; 
     1780      char istr[64]; 
     1781      switch(json_object_get_int_overflow(o)) { 
     1782        case json_overflow_int: 
     1783          lua_pushnumber(L, json_object_get_int(o)); break; 
     1784        case json_overflow_int64: 
     1785          i64 = json_object_get_int64(o); 
     1786          snprintf(istr, sizeof(istr), "%lld", i64); 
     1787          lua_pushstring(L, istr); 
     1788          break; 
     1789        case json_overflow_uint64: 
     1790          u64 = json_object_get_uint64(o); 
     1791          snprintf(istr, sizeof(istr), "%llu", u64); 
     1792          lua_pushstring(L, istr); 
     1793          break; 
     1794      } 
     1795      break; 
     1796    } 
    17771797    case json_type_array: 
    17781798    {