Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b7bf96996f | ||
|
|
6d8c287032 | ||
|
|
ab3764ed0a | ||
|
|
9cc6fbe580 |
10
CHANGES
10
CHANGES
@@ -1,11 +1,21 @@
|
||||
Version 1.0.3, released 2009-09-14
|
||||
|
||||
* Check for integer and real overflows and underflows in decoder
|
||||
* Use the Python json module for tests, or simplejson if the json
|
||||
module is not found
|
||||
* Distribute changelog (this file)
|
||||
|
||||
|
||||
Version 1.0.2, released 2009-09-08
|
||||
|
||||
* Handle EOF correctly in decoder
|
||||
|
||||
|
||||
Version 1.0.1, released 2009-09-04
|
||||
|
||||
* Fixed broken json_is_boolean()
|
||||
|
||||
|
||||
Version 1.0, released 2009-08-25
|
||||
|
||||
* Initial release
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
EXTRA_DIST = LICENSE README.rst
|
||||
EXTRA_DIST = CHANGES LICENSE README.rst
|
||||
SUBDIRS = doc src test
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
AC_PREREQ([2.63])
|
||||
AC_INIT([jansson], [1.0.2], [petri@digip.org])
|
||||
AC_INIT([jansson], [1.0.3], [petri@digip.org])
|
||||
|
||||
AM_INIT_AUTOMAKE([1.10 foreign])
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ copyright = u'2009, Petri Lehtinen'
|
||||
# The short X.Y version.
|
||||
version = '1.0'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = '1.0.2'
|
||||
release = '1.0.3'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
||||
@@ -13,6 +13,6 @@ libjansson_la_SOURCES = \
|
||||
utf.h \
|
||||
util.h \
|
||||
value.c
|
||||
libjansson_la_LDFLAGS = -version-info 0:2:0
|
||||
libjansson_la_LDFLAGS = -version-info 0:3:0
|
||||
|
||||
AM_CFLAGS = -Wall -Wextra -Werror -std=c99
|
||||
|
||||
49
src/load.c
49
src/load.c
@@ -8,6 +8,7 @@
|
||||
#define _GNU_SOURCE
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -399,10 +400,11 @@ out:
|
||||
free(lex->value.string);
|
||||
}
|
||||
|
||||
static void lex_scan_number(lex_t *lex, char c, json_error_t *error)
|
||||
static int lex_scan_number(lex_t *lex, char c, json_error_t *error)
|
||||
{
|
||||
const char *saved_text;
|
||||
char *end;
|
||||
double value;
|
||||
|
||||
lex->token = TOKEN_INVALID;
|
||||
|
||||
@@ -423,14 +425,26 @@ static void lex_scan_number(lex_t *lex, char c, json_error_t *error)
|
||||
}
|
||||
|
||||
if(c != '.' && c != 'E' && c != 'e') {
|
||||
long value;
|
||||
|
||||
lex_unget_unsave(lex, c);
|
||||
lex->token = TOKEN_INTEGER;
|
||||
|
||||
saved_text = strbuffer_value(&lex->saved_text);
|
||||
lex->value.integer = strtol(saved_text, &end, 10);
|
||||
value = strtol(saved_text, &end, 10);
|
||||
assert(end == saved_text + lex->saved_text.length);
|
||||
|
||||
return;
|
||||
if((value == LONG_MAX && errno == ERANGE) || value > INT_MAX) {
|
||||
error_set(error, lex, "too big integer");
|
||||
goto out;
|
||||
}
|
||||
else if((value == LONG_MIN && errno == ERANGE) || value < INT_MIN) {
|
||||
error_set(error, lex, "too big negative integer");
|
||||
goto out;
|
||||
}
|
||||
|
||||
lex->token = TOKEN_INTEGER;
|
||||
lex->value.integer = (int)value;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(c == '.') {
|
||||
@@ -460,14 +474,29 @@ static void lex_scan_number(lex_t *lex, char c, json_error_t *error)
|
||||
}
|
||||
|
||||
lex_unget_unsave(lex, c);
|
||||
lex->token = TOKEN_REAL;
|
||||
|
||||
saved_text = strbuffer_value(&lex->saved_text);
|
||||
lex->value.real = strtod(saved_text, &end);
|
||||
value = strtod(saved_text, &end);
|
||||
assert(end == saved_text + lex->saved_text.length);
|
||||
|
||||
if(value == 0 && errno == ERANGE) {
|
||||
error_set(error, lex, "real number underflow");
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Cannot test for +/-HUGE_VAL because the HUGE_VAL constant is
|
||||
only defined in C99 mode. So let's trust in sole errno. */
|
||||
else if(errno == ERANGE) {
|
||||
error_set(error, lex, "real number overflow");
|
||||
goto out;
|
||||
}
|
||||
|
||||
lex->token = TOKEN_REAL;
|
||||
lex->value.real = value;
|
||||
return 0;
|
||||
|
||||
out:
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int lex_scan(lex_t *lex, json_error_t *error)
|
||||
@@ -506,8 +535,10 @@ static int lex_scan(lex_t *lex, json_error_t *error)
|
||||
else if(c == '"')
|
||||
lex_scan_string(lex, error);
|
||||
|
||||
else if(isdigit(c) || c == '-')
|
||||
lex_scan_number(lex, c, error);
|
||||
else if(isdigit(c) || c == '-') {
|
||||
if(lex_scan_number(lex, c, error))
|
||||
goto out;
|
||||
}
|
||||
|
||||
else if(isupper(c) || islower(c)) {
|
||||
/* eat up the whole identifier for clearer error messages */
|
||||
|
||||
@@ -5,8 +5,11 @@
|
||||
# Jansson is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the MIT license. See LICENSE for details.
|
||||
|
||||
import simplejson
|
||||
import sys
|
||||
try:
|
||||
import json
|
||||
except ImportError:
|
||||
import simplejson as json
|
||||
|
||||
def load(filename):
|
||||
try:
|
||||
@@ -17,14 +20,14 @@ def load(filename):
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
json = simplejson.load(jsonfile)
|
||||
jsondata = json.load(jsonfile)
|
||||
except ValueError, err:
|
||||
print "%s is malformed: %s" % (filename, err)
|
||||
sys.exit(1)
|
||||
finally:
|
||||
jsonfile.close()
|
||||
|
||||
return json
|
||||
return jsondata
|
||||
|
||||
def main():
|
||||
if len(sys.argv) != 3:
|
||||
|
||||
25
test/testdata/invalid
vendored
25
test/testdata/invalid
vendored
@@ -127,6 +127,21 @@ invalid token near '1e'
|
||||
====
|
||||
1
|
||||
invalid token near '1e'
|
||||
==== real-positive-overflow ====
|
||||
[123123e100000]
|
||||
====
|
||||
1
|
||||
real number overflow near '123123e100000'
|
||||
==== real-negative-overflow ====
|
||||
[-123123e100000]
|
||||
====
|
||||
1
|
||||
real number overflow near '-123123e100000'
|
||||
==== real-underflow ====
|
||||
[123e-10000000]
|
||||
====
|
||||
1
|
||||
real number underflow near '123e-10000000'
|
||||
==== integer-starting-with-zero ====
|
||||
[012]
|
||||
====
|
||||
@@ -137,6 +152,16 @@ invalid token near '0'
|
||||
====
|
||||
1
|
||||
invalid token near '-0'
|
||||
==== too-big-positive-integer ====
|
||||
[123123123123123]
|
||||
====
|
||||
1
|
||||
too big integer near '123123123123123'
|
||||
==== too-big-negative-integer ====
|
||||
[-123123123123123]
|
||||
====
|
||||
1
|
||||
too big negative integer near '-123123123123123'
|
||||
==== invalid-identifier ====
|
||||
[troo
|
||||
====
|
||||
|
||||
Reference in New Issue
Block a user