Package: release.debian.org Severity: normal User: release.debian.org@packages.debian.org Usertags: unblock Please unblock package getdns Dear release team, when I was first packaging 1.1.0~a2 release, I took the source from github repository instead of upstream tarball (that was created later). And because getdns upstream uses patched version of jsmn, and I have used verbatim upstream sources of jsmn, a #849577 is born. So, 1.1.0~a2-2 release contains getdns version of jsmn, and so it's same as 1.1.0-a2 getdns upstream (as it should be). Please consider unblocking this package, so we don't ship broken getdns in stretch. unblock getdns/1.1.0~a2-2 -- System Information: Debian Release: 9.0 APT prefers testing APT policy: (990, 'testing'), (500, 'unstable-debug'), (500, 'testing-debug'), (500, 'unstable'), (1, 'experimental-debug'), (1, 'experimental') Architecture: amd64 (x86_64) Kernel: Linux 4.4.0-67-generic (SMP w/24 CPU cores) Locale: LANG=en_DK.UTF-8, LC_CTYPE=en_DK.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system)
diff -Nru getdns-1.1.0~a2/debian/changelog getdns-1.1.0~a2/debian/changelog --- getdns-1.1.0~a2/debian/changelog 2016-11-06 21:56:21.000000000 +0100 +++ getdns-1.1.0~a2/debian/changelog 2017-03-08 11:48:09.000000000 +0100 @@ -1,3 +1,9 @@ +getdns (1.1.0~a2-2) unstable; urgency=medium + + * Use upstream provided src/jsmn/ (Closes: #849577) + + -- Ondřej Surý <ondrej@debian.org> Wed, 08 Mar 2017 11:48:09 +0100 + getdns (1.1.0~a2-1) unstable; urgency=medium * Fix CURRENT_DATE generation for reproducible builds (Closes: #797215) diff -Nru getdns-1.1.0~a2/debian/patches/0001-Add-src-jsmn-to-sources.patch getdns-1.1.0~a2/debian/patches/0001-Add-src-jsmn-to-sources.patch --- getdns-1.1.0~a2/debian/patches/0001-Add-src-jsmn-to-sources.patch 2016-11-06 21:56:21.000000000 +0100 +++ getdns-1.1.0~a2/debian/patches/0001-Add-src-jsmn-to-sources.patch 2017-03-08 11:48:09.000000000 +0100 @@ -3,27 +3,15 @@ Subject: Add src/jsmn/ to sources --- - src/jsmn/LICENSE | 20 +++ - src/jsmn/README.md | 167 +++++++++++++++++++ - src/jsmn/example/jsondump.c | 126 +++++++++++++++ - src/jsmn/example/simple.c | 76 +++++++++ - src/jsmn/jsmn.c | 311 ++++++++++++++++++++++++++++++++++++ - src/jsmn/jsmn.h | 76 +++++++++ - src/jsmn/library.json | 16 ++ - src/jsmn/test/test.h | 27 ++++ - src/jsmn/test/tests.c | 378 ++++++++++++++++++++++++++++++++++++++++++++ - src/jsmn/test/testutil.h | 94 +++++++++++ - 10 files changed, 1291 insertions(+) + src/jsmn/LICENSE | 20 +++ + src/jsmn/README.md | 167 ++++++++++++++++++++++++++ + src/jsmn/jsmn.c | 347 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/jsmn/jsmn.h | 76 ++++++++++++ + 4 files changed, 610 insertions(+) create mode 100644 src/jsmn/LICENSE create mode 100644 src/jsmn/README.md - create mode 100644 src/jsmn/example/jsondump.c - create mode 100644 src/jsmn/example/simple.c create mode 100644 src/jsmn/jsmn.c create mode 100644 src/jsmn/jsmn.h - create mode 100644 src/jsmn/library.json - create mode 100644 src/jsmn/test/test.h - create mode 100644 src/jsmn/test/tests.c - create mode 100644 src/jsmn/test/testutil.h diff --git a/src/jsmn/LICENSE b/src/jsmn/LICENSE new file mode 100644 @@ -224,226 +212,12 @@ + +[1]: http://www.json.org/ +[2]: http://zserge.com/jsmn.html -diff --git a/src/jsmn/example/jsondump.c b/src/jsmn/example/jsondump.c -new file mode 100644 -index 0000000..cf08c5c ---- /dev/null -+++ b/src/jsmn/example/jsondump.c -@@ -0,0 +1,126 @@ -+#include <stdio.h> -+#include <stdlib.h> -+#include <unistd.h> -+#include <string.h> -+#include <errno.h> -+#include "../jsmn.h" -+ -+/* Function realloc_it() is a wrapper function for standart realloc() -+ * with one difference - it frees old memory pointer in case of realloc -+ * failure. Thus, DO NOT use old data pointer in anyway after call to -+ * realloc_it(). If your code has some kind of fallback algorithm if -+ * memory can't be re-allocated - use standart realloc() instead. -+ */ -+static inline void *realloc_it(void *ptrmem, size_t size) { -+ void *p = realloc(ptrmem, size); -+ if (!p) { -+ free (ptrmem); -+ fprintf(stderr, "realloc(): errno=%d\n", errno); -+ } -+ return p; -+} -+ -+/* -+ * An example of reading JSON from stdin and printing its content to stdout. -+ * The output looks like YAML, but I'm not sure if it's really compatible. -+ */ -+ -+static int dump(const char *js, jsmntok_t *t, size_t count, int indent) { -+ int i, j, k; -+ if (count == 0) { -+ return 0; -+ } -+ if (t->type == JSMN_PRIMITIVE) { -+ printf("%.*s", t->end - t->start, js+t->start); -+ return 1; -+ } else if (t->type == JSMN_STRING) { -+ printf("'%.*s'", t->end - t->start, js+t->start); -+ return 1; -+ } else if (t->type == JSMN_OBJECT) { -+ printf("\n"); -+ j = 0; -+ for (i = 0; i < t->size; i++) { -+ for (k = 0; k < indent; k++) printf(" "); -+ j += dump(js, t+1+j, count-j, indent+1); -+ printf(": "); -+ j += dump(js, t+1+j, count-j, indent+1); -+ printf("\n"); -+ } -+ return j+1; -+ } else if (t->type == JSMN_ARRAY) { -+ j = 0; -+ printf("\n"); -+ for (i = 0; i < t->size; i++) { -+ for (k = 0; k < indent-1; k++) printf(" "); -+ printf(" - "); -+ j += dump(js, t+1+j, count-j, indent+1); -+ printf("\n"); -+ } -+ return j+1; -+ } -+ return 0; -+} -+ -+int main() { -+ int r; -+ int eof_expected = 0; -+ char *js = NULL; -+ size_t jslen = 0; -+ char buf[BUFSIZ]; -+ -+ jsmn_parser p; -+ jsmntok_t *tok; -+ size_t tokcount = 2; -+ -+ /* Prepare parser */ -+ jsmn_init(&p); -+ -+ /* Allocate some tokens as a start */ -+ tok = malloc(sizeof(*tok) * tokcount); -+ if (tok == NULL) { -+ fprintf(stderr, "malloc(): errno=%d\n", errno); -+ return 3; -+ } -+ -+ for (;;) { -+ /* Read another chunk */ -+ r = fread(buf, 1, sizeof(buf), stdin); -+ if (r < 0) { -+ fprintf(stderr, "fread(): %d, errno=%d\n", r, errno); -+ return 1; -+ } -+ if (r == 0) { -+ if (eof_expected != 0) { -+ return 0; -+ } else { -+ fprintf(stderr, "fread(): unexpected EOF\n"); -+ return 2; -+ } -+ } -+ -+ js = realloc_it(js, jslen + r + 1); -+ if (js == NULL) { -+ return 3; -+ } -+ strncpy(js + jslen, buf, r); -+ jslen = jslen + r; -+ -+again: -+ r = jsmn_parse(&p, js, jslen, tok, tokcount); -+ if (r < 0) { -+ if (r == JSMN_ERROR_NOMEM) { -+ tokcount = tokcount * 2; -+ tok = realloc_it(tok, sizeof(*tok) * tokcount); -+ if (tok == NULL) { -+ return 3; -+ } -+ goto again; -+ } -+ } else { -+ dump(js, tok, p.toknext, 0); -+ eof_expected = 1; -+ } -+ } -+ -+ return 0; -+} -diff --git a/src/jsmn/example/simple.c b/src/jsmn/example/simple.c -new file mode 100644 -index 0000000..de44883 ---- /dev/null -+++ b/src/jsmn/example/simple.c -@@ -0,0 +1,76 @@ -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+#include "../jsmn.h" -+ -+/* -+ * A small example of jsmn parsing when JSON structure is known and number of -+ * tokens is predictable. -+ */ -+ -+const char *JSON_STRING = -+ "{\"user\": \"johndoe\", \"admin\": false, \"uid\": 1000,\n " -+ "\"groups\": [\"users\", \"wheel\", \"audio\", \"video\"]}"; -+ -+static int jsoneq(const char *json, jsmntok_t *tok, const char *s) { -+ if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start && -+ strncmp(json + tok->start, s, tok->end - tok->start) == 0) { -+ return 0; -+ } -+ return -1; -+} -+ -+int main() { -+ int i; -+ int r; -+ jsmn_parser p; -+ jsmntok_t t[128]; /* We expect no more than 128 tokens */ -+ -+ jsmn_init(&p); -+ r = jsmn_parse(&p, JSON_STRING, strlen(JSON_STRING), t, sizeof(t)/sizeof(t[0])); -+ if (r < 0) { -+ printf("Failed to parse JSON: %d\n", r); -+ return 1; -+ } -+ -+ /* Assume the top-level element is an object */ -+ if (r < 1 || t[0].type != JSMN_OBJECT) { -+ printf("Object expected\n"); -+ return 1; -+ } -+ -+ /* Loop over all keys of the root object */ -+ for (i = 1; i < r; i++) { -+ if (jsoneq(JSON_STRING, &t[i], "user") == 0) { -+ /* We may use strndup() to fetch string value */ -+ printf("- User: %.*s\n", t[i+1].end-t[i+1].start, -+ JSON_STRING + t[i+1].start); -+ i++; -+ } else if (jsoneq(JSON_STRING, &t[i], "admin") == 0) { -+ /* We may additionally check if the value is either "true" or "false" */ -+ printf("- Admin: %.*s\n", t[i+1].end-t[i+1].start, -+ JSON_STRING + t[i+1].start); -+ i++; -+ } else if (jsoneq(JSON_STRING, &t[i], "uid") == 0) { -+ /* We may want to do strtol() here to get numeric value */ -+ printf("- UID: %.*s\n", t[i+1].end-t[i+1].start, -+ JSON_STRING + t[i+1].start); -+ i++; -+ } else if (jsoneq(JSON_STRING, &t[i], "groups") == 0) { -+ int j; -+ printf("- Groups:\n"); -+ if (t[i+1].type != JSMN_ARRAY) { -+ continue; /* We expect groups to be an array of strings */ -+ } -+ for (j = 0; j < t[i+1].size; j++) { -+ jsmntok_t *g = &t[i+j+2]; -+ printf(" * %.*s\n", g->end - g->start, JSON_STRING + g->start); -+ } -+ i += t[i+1].size + 1; -+ } else { -+ printf("Unexpected key: %.*s\n", t[i].end-t[i].start, -+ JSON_STRING + t[i].start); -+ } -+ } -+ return 0; -+} diff --git a/src/jsmn/jsmn.c b/src/jsmn/jsmn.c new file mode 100644 -index 0000000..e7765eb +index 0000000..c5f47cb --- /dev/null +++ b/src/jsmn/jsmn.c -@@ -0,0 +1,311 @@ +@@ -0,0 +1,347 @@ +#include "jsmn.h" + +/** @@ -487,11 +261,18 @@ + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + switch (js[parser->pos]) { -+#ifndef JSMN_STRICT ++#if !defined(JSMN_STRICT) && !defined(JSMN_GETDNS) + /* In strict mode primitive must be followed by "," or "}" or "]" */ + case ':': ++#elif defined(JSMN_GETDNS) ++ case ':': ++ if (tokens[parser->toksuper].type != JSMN_OBJECT) ++ break; +#endif + case '\t' : case '\r' : case '\n' : case ' ' : ++#ifdef JSMN_GETDNS ++ case '>': ++#endif + case ',' : case ']' : case '}' : + goto found; + } @@ -500,7 +281,7 @@ + return JSMN_ERROR_INVAL; + } + } -+#ifdef JSMN_STRICT ++#if defined(JSMN_STRICT) + /* In strict mode primitive must be followed by a comma/object/array */ + parser->pos = start; + return JSMN_ERROR_PART; @@ -679,6 +460,9 @@ + tokens[parser->toksuper].size++; + break; + case '\t' : case '\r' : case '\n' : case ' ': ++#ifdef JSMN_GETDNS ++ case '>': ++#endif + break; + case ':': + parser->toksuper = parser->toknext - 1; @@ -701,6 +485,32 @@ +#endif + } + break; ++#ifdef JSMN_GETDNS ++ case '<': ++ if (parser->pos + 14 < len && ++ js[parser->pos+ 1] == 'b' && ++ js[parser->pos+ 2] == 'i' && ++ js[parser->pos+ 3] == 'n' && ++ js[parser->pos+ 4] == 'd' && ++ js[parser->pos+ 5] == 'a' && ++ js[parser->pos+ 6] == 't' && ++ js[parser->pos+ 7] == 'a' && ++ js[parser->pos+ 8] == ' ') { ++ if (js[parser->pos+ 9] == 'o' && ++ js[parser->pos+10] == 'f' && ++ js[parser->pos+11] == ' ') { ++ parser->pos += 11; ++ break; ++ ++ } else if (js[parser->pos+ 9] == 'f' && ++ js[parser->pos+10] == 'o' && ++ js[parser->pos+11] == 'r' && ++ js[parser->pos+12] == ' ') { ++ parser->pos += 12; ++ break; ++ } ++ } ++#endif +#ifdef JSMN_STRICT + /* In strict mode primitives are: numbers and booleans */ + case '-': case '0': case '1' : case '2': case '3' : case '4': @@ -837,542 +647,3 @@ +#endif + +#endif /* __JSMN_H_ */ -diff --git a/src/jsmn/library.json b/src/jsmn/library.json -new file mode 100644 -index 0000000..8e2f5c2 ---- /dev/null -+++ b/src/jsmn/library.json -@@ -0,0 +1,16 @@ -+{ -+ "name": "jsmn", -+ "keywords": "json", -+ "description": "Minimalistic JSON parser/tokenizer in C. It can be easily integrated into resource-limited or embedded projects", -+ "repository": -+ { -+ "type": "git", -+ "url": "https://github.com/zserge/jsmn.git" -+ }, -+ "frameworks": "*", -+ "platforms": "*", -+ "examples": [ -+ "example/*.c" -+ ], -+ "exclude": "test" -+} -diff --git a/src/jsmn/test/test.h b/src/jsmn/test/test.h -new file mode 100644 -index 0000000..930ebaf ---- /dev/null -+++ b/src/jsmn/test/test.h -@@ -0,0 +1,27 @@ -+#ifndef __TEST_H__ -+#define __TEST_H__ -+ -+static int test_passed = 0; -+static int test_failed = 0; -+ -+/* Terminate current test with error */ -+#define fail() return __LINE__ -+ -+/* Successfull end of the test case */ -+#define done() return 0 -+ -+/* Check single condition */ -+#define check(cond) do { if (!(cond)) fail(); } while (0) -+ -+/* Test runner */ -+static void test(int (*func)(void), const char *name) { -+ int r = func(); -+ if (r == 0) { -+ test_passed++; -+ } else { -+ test_failed++; -+ printf("FAILED: %s (at line %d)\n", name, r); -+ } -+} -+ -+#endif /* __TEST_H__ */ -diff --git a/src/jsmn/test/tests.c b/src/jsmn/test/tests.c -new file mode 100644 -index 0000000..a72689e ---- /dev/null -+++ b/src/jsmn/test/tests.c -@@ -0,0 +1,378 @@ -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+#include <stdarg.h> -+ -+#include "test.h" -+#include "testutil.h" -+ -+int test_empty(void) { -+ check(parse("{}", 1, 1, -+ JSMN_OBJECT, 0, 2, 0)); -+ check(parse("[]", 1, 1, -+ JSMN_ARRAY, 0, 2, 0)); -+ check(parse("[{},{}]", 3, 3, -+ JSMN_ARRAY, 0, 7, 2, -+ JSMN_OBJECT, 1, 3, 0, -+ JSMN_OBJECT, 4, 6, 0)); -+ return 0; -+} -+ -+int test_object(void) { -+ check(parse("{\"a\":0}", 3, 3, -+ JSMN_OBJECT, 0, 7, 1, -+ JSMN_STRING, "a", 1, -+ JSMN_PRIMITIVE, "0")); -+ check(parse("{\"a\":[]}", 3, 3, -+ JSMN_OBJECT, 0, 8, 1, -+ JSMN_STRING, "a", 1, -+ JSMN_ARRAY, 5, 7, 0)); -+ check(parse("{\"a\":{},\"b\":{}}", 5, 5, -+ JSMN_OBJECT, -1, -1, 2, -+ JSMN_STRING, "a", 1, -+ JSMN_OBJECT, -1, -1, 0, -+ JSMN_STRING, "b", 1, -+ JSMN_OBJECT, -1, -1, 0)); -+ check(parse("{\n \"Day\": 26,\n \"Month\": 9,\n \"Year\": 12\n }", 7, 7, -+ JSMN_OBJECT, -1, -1, 3, -+ JSMN_STRING, "Day", 1, -+ JSMN_PRIMITIVE, "26", -+ JSMN_STRING, "Month", 1, -+ JSMN_PRIMITIVE, "9", -+ JSMN_STRING, "Year", 1, -+ JSMN_PRIMITIVE, "12")); -+ check(parse("{\"a\": 0, \"b\": \"c\"}", 5, 5, -+ JSMN_OBJECT, -1, -1, 2, -+ JSMN_STRING, "a", 1, -+ JSMN_PRIMITIVE, "0", -+ JSMN_STRING, "b", 1, -+ JSMN_STRING, "c", 0)); -+ -+#ifdef JSMN_STRICT -+ check(parse("{\"a\"\n0}", JSMN_ERROR_INVAL, 3)); -+ check(parse("{\"a\", 0}", JSMN_ERROR_INVAL, 3)); -+ check(parse("{\"a\": {2}}", JSMN_ERROR_INVAL, 3)); -+ check(parse("{\"a\": {2: 3}}", JSMN_ERROR_INVAL, 3)); -+ check(parse("{\"a\": {\"a\": 2 3}}", JSMN_ERROR_INVAL, 5)); -+ /* FIXME */ -+ /*check(parse("{\"a\"}", JSMN_ERROR_INVAL, 2));*/ -+ /*check(parse("{\"a\": 1, \"b\"}", JSMN_ERROR_INVAL, 4));*/ -+ /*check(parse("{\"a\",\"b\":1}", JSMN_ERROR_INVAL, 4));*/ -+ /*check(parse("{\"a\":1,}", JSMN_ERROR_INVAL, 4));*/ -+ /*check(parse("{\"a\":\"b\":\"c\"}", JSMN_ERROR_INVAL, 4));*/ -+ /*check(parse("{,}", JSMN_ERROR_INVAL, 4));*/ -+#endif -+ return 0; -+} -+ -+int test_array(void) { -+ /* FIXME */ -+ /*check(parse("[10}", JSMN_ERROR_INVAL, 3));*/ -+ /*check(parse("[1,,3]", JSMN_ERROR_INVAL, 3)*/ -+ check(parse("[10]", 2, 2, -+ JSMN_ARRAY, -1, -1, 1, -+ JSMN_PRIMITIVE, "10")); -+ check(parse("{\"a\": 1]", JSMN_ERROR_INVAL, 3)); -+ /* FIXME */ -+ /*check(parse("[\"a\": 1]", JSMN_ERROR_INVAL, 3));*/ -+ return 0; -+} -+ -+int test_primitive(void) { -+ check(parse("{\"boolVar\" : true }", 3, 3, -+ JSMN_OBJECT, -1, -1, 1, -+ JSMN_STRING, "boolVar", 1, -+ JSMN_PRIMITIVE, "true")); -+ check(parse("{\"boolVar\" : false }", 3, 3, -+ JSMN_OBJECT, -1, -1, 1, -+ JSMN_STRING, "boolVar", 1, -+ JSMN_PRIMITIVE, "false")); -+ check(parse("{\"nullVar\" : null }", 3, 3, -+ JSMN_OBJECT, -1, -1, 1, -+ JSMN_STRING, "nullVar", 1, -+ JSMN_PRIMITIVE, "null")); -+ check(parse("{\"intVar\" : 12}", 3, 3, -+ JSMN_OBJECT, -1, -1, 1, -+ JSMN_STRING, "intVar", 1, -+ JSMN_PRIMITIVE, "12")); -+ check(parse("{\"floatVar\" : 12.345}", 3, 3, -+ JSMN_OBJECT, -1, -1, 1, -+ JSMN_STRING, "floatVar", 1, -+ JSMN_PRIMITIVE, "12.345")); -+ return 0; -+} -+ -+int test_string(void) { -+ check(parse("{\"strVar\" : \"hello world\"}", 3, 3, -+ JSMN_OBJECT, -1, -1, 1, -+ JSMN_STRING, "strVar", 1, -+ JSMN_STRING, "hello world", 0)); -+ check(parse("{\"strVar\" : \"escapes: \\/\\r\\n\\t\\b\\f\\\"\\\\\"}", 3, 3, -+ JSMN_OBJECT, -1, -1, 1, -+ JSMN_STRING, "strVar", 1, -+ JSMN_STRING, "escapes: \\/\\r\\n\\t\\b\\f\\\"\\\\", 0)); -+ check(parse("{\"strVar\": \"\"}", 3, 3, -+ JSMN_OBJECT, -1, -1, 1, -+ JSMN_STRING, "strVar", 1, -+ JSMN_STRING, "", 0)); -+ check(parse("{\"a\":\"\\uAbcD\"}", 3, 3, -+ JSMN_OBJECT, -1, -1, 1, -+ JSMN_STRING, "a", 1, -+ JSMN_STRING, "\\uAbcD", 0)); -+ check(parse("{\"a\":\"str\\u0000\"}", 3, 3, -+ JSMN_OBJECT, -1, -1, 1, -+ JSMN_STRING, "a", 1, -+ JSMN_STRING, "str\\u0000", 0)); -+ check(parse("{\"a\":\"\\uFFFFstr\"}", 3, 3, -+ JSMN_OBJECT, -1, -1, 1, -+ JSMN_STRING, "a", 1, -+ JSMN_STRING, "\\uFFFFstr", 0)); -+ check(parse("{\"a\":[\"\\u0280\"]}", 4, 4, -+ JSMN_OBJECT, -1, -1, 1, -+ JSMN_STRING, "a", 1, -+ JSMN_ARRAY, -1, -1, 1, -+ JSMN_STRING, "\\u0280", 0)); -+ -+ check(parse("{\"a\":\"str\\uFFGFstr\"}", JSMN_ERROR_INVAL, 3)); -+ check(parse("{\"a\":\"str\\u@FfF\"}", JSMN_ERROR_INVAL, 3)); -+ check(parse("{{\"a\":[\"\\u028\"]}", JSMN_ERROR_INVAL, 4)); -+ return 0; -+} -+ -+int test_partial_string(void) { -+ int i; -+ int r; -+ jsmn_parser p; -+ jsmntok_t tok[5]; -+ const char *js = "{\"x\": \"va\\\\ue\", \"y\": \"value y\"}"; -+ -+ jsmn_init(&p); -+ for (i = 1; i <= strlen(js); i++) { -+ r = jsmn_parse(&p, js, i, tok, sizeof(tok)/sizeof(tok[0])); -+ if (i == strlen(js)) { -+ check(r == 5); -+ check(tokeq(js, tok, 5, -+ JSMN_OBJECT, -1, -1, 2, -+ JSMN_STRING, "x", 1, -+ JSMN_STRING, "va\\\\ue", 0, -+ JSMN_STRING, "y", 1, -+ JSMN_STRING, "value y", 0)); -+ } else { -+ check(r == JSMN_ERROR_PART); -+ } -+ } -+ return 0; -+} -+ -+int test_partial_array(void) { -+#ifdef JSMN_STRICT -+ int r; -+ int i; -+ jsmn_parser p; -+ jsmntok_t tok[10]; -+ const char *js = "[ 1, true, [123, \"hello\"]]"; -+ -+ jsmn_init(&p); -+ for (i = 1; i <= strlen(js); i++) { -+ r = jsmn_parse(&p, js, i, tok, sizeof(tok)/sizeof(tok[0])); -+ if (i == strlen(js)) { -+ check(r == 6); -+ check(tokeq(js, tok, 6, -+ JSMN_ARRAY, -1, -1, 3, -+ JSMN_PRIMITIVE, "1", -+ JSMN_PRIMITIVE, "true", -+ JSMN_ARRAY, -1, -1, 2, -+ JSMN_PRIMITIVE, "123", -+ JSMN_STRING, "hello", 0)); -+ } else { -+ check(r == JSMN_ERROR_PART); -+ } -+ } -+#endif -+ return 0; -+} -+ -+int test_array_nomem(void) { -+ int i; -+ int r; -+ jsmn_parser p; -+ jsmntok_t toksmall[10], toklarge[10]; -+ const char *js; -+ -+ js = " [ 1, true, [123, \"hello\"]]"; -+ -+ for (i = 0; i < 6; i++) { -+ jsmn_init(&p); -+ memset(toksmall, 0, sizeof(toksmall)); -+ memset(toklarge, 0, sizeof(toklarge)); -+ r = jsmn_parse(&p, js, strlen(js), toksmall, i); -+ check(r == JSMN_ERROR_NOMEM); -+ -+ memcpy(toklarge, toksmall, sizeof(toksmall)); -+ -+ r = jsmn_parse(&p, js, strlen(js), toklarge, 10); -+ check(r >= 0); -+ check(tokeq(js, toklarge, 4, -+ JSMN_ARRAY, -1, -1, 3, -+ JSMN_PRIMITIVE, "1", -+ JSMN_PRIMITIVE, "true", -+ JSMN_ARRAY, -1, -1, 2, -+ JSMN_PRIMITIVE, "123", -+ JSMN_STRING, "hello", 0)); -+ } -+ return 0; -+} -+ -+int test_unquoted_keys(void) { -+#ifndef JSMN_STRICT -+ int r; -+ jsmn_parser p; -+ jsmntok_t tok[10]; -+ const char *js; -+ -+ jsmn_init(&p); -+ js = "key1: \"value\"\nkey2 : 123"; -+ -+ r = jsmn_parse(&p, js, strlen(js), tok, 10); -+ check(r >= 0); -+ check(tokeq(js, tok, 4, -+ JSMN_PRIMITIVE, "key1", -+ JSMN_STRING, "value", 0, -+ JSMN_PRIMITIVE, "key2", -+ JSMN_PRIMITIVE, "123")); -+#endif -+ return 0; -+} -+ -+int test_issue_22(void) { -+ int r; -+ jsmn_parser p; -+ jsmntok_t tokens[128]; -+ const char *js; -+ -+ js = "{ \"height\":10, \"layers\":[ { \"data\":[6,6], \"height\":10, " -+ "\"name\":\"Calque de Tile 1\", \"opacity\":1, \"type\":\"tilelayer\", " -+ "\"visible\":true, \"width\":10, \"x\":0, \"y\":0 }], " -+ "\"orientation\":\"orthogonal\", \"properties\": { }, \"tileheight\":32, " -+ "\"tilesets\":[ { \"firstgid\":1, \"image\":\"..\\/images\\/tiles.png\", " -+ "\"imageheight\":64, \"imagewidth\":160, \"margin\":0, \"name\":\"Tiles\", " -+ "\"properties\":{}, \"spacing\":0, \"tileheight\":32, \"tilewidth\":32 }], " -+ "\"tilewidth\":32, \"version\":1, \"width\":10 }"; -+ jsmn_init(&p); -+ r = jsmn_parse(&p, js, strlen(js), tokens, 128); -+ check(r >= 0); -+ return 0; -+} -+ -+int test_issue_27(void) { -+ const char *js = -+ "{ \"name\" : \"Jack\", \"age\" : 27 } { \"name\" : \"Anna\", "; -+ check(parse(js, JSMN_ERROR_PART, 8)); -+ return 0; -+} -+ -+int test_input_length(void) { -+ const char *js; -+ int r; -+ jsmn_parser p; -+ jsmntok_t tokens[10]; -+ -+ js = "{\"a\": 0}garbage"; -+ -+ jsmn_init(&p); -+ r = jsmn_parse(&p, js, 8, tokens, 10); -+ check(r == 3); -+ check(tokeq(js, tokens, 3, -+ JSMN_OBJECT, -1, -1, 1, -+ JSMN_STRING, "a", 1, -+ JSMN_PRIMITIVE, "0")); -+ return 0; -+} -+ -+int test_count(void) { -+ jsmn_parser p; -+ const char *js; -+ -+ js = "{}"; -+ jsmn_init(&p); -+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 1); -+ -+ js = "[]"; -+ jsmn_init(&p); -+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 1); -+ -+ js = "[[]]"; -+ jsmn_init(&p); -+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 2); -+ -+ js = "[[], []]"; -+ jsmn_init(&p); -+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 3); -+ -+ js = "[[], []]"; -+ jsmn_init(&p); -+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 3); -+ -+ js = "[[], [[]], [[], []]]"; -+ jsmn_init(&p); -+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 7); -+ -+ js = "[\"a\", [[], []]]"; -+ jsmn_init(&p); -+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 5); -+ -+ js = "[[], \"[], [[]]\", [[]]]"; -+ jsmn_init(&p); -+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 5); -+ -+ js = "[1, 2, 3]"; -+ jsmn_init(&p); -+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 4); -+ -+ js = "[1, 2, [3, \"a\"], null]"; -+ jsmn_init(&p); -+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 7); -+ -+ return 0; -+} -+ -+ -+int test_nonstrict(void) { -+#ifndef JSMN_STRICT -+ const char *js; -+ js = "a: 0garbage"; -+ check(parse(js, 2, 2, -+ JSMN_PRIMITIVE, "a", -+ JSMN_PRIMITIVE, "0garbage")); -+ -+ js = "Day : 26\nMonth : Sep\n\nYear: 12"; -+ check(parse(js, 6, 6, -+ JSMN_PRIMITIVE, "Day", -+ JSMN_PRIMITIVE, "26", -+ JSMN_PRIMITIVE, "Month", -+ JSMN_PRIMITIVE, "Sep", -+ JSMN_PRIMITIVE, "Year", -+ JSMN_PRIMITIVE, "12")); -+#endif -+ return 0; -+} -+ -+int main(void) { -+ test(test_empty, "test for a empty JSON objects/arrays"); -+ test(test_object, "test for a JSON objects"); -+ test(test_array, "test for a JSON arrays"); -+ test(test_primitive, "test primitive JSON data types"); -+ test(test_string, "test string JSON data types"); -+ -+ test(test_partial_string, "test partial JSON string parsing"); -+ test(test_partial_array, "test partial array reading"); -+ test(test_array_nomem, "test array reading with a smaller number of tokens"); -+ test(test_unquoted_keys, "test unquoted keys (like in JavaScript)"); -+ test(test_input_length, "test strings that are not null-terminated"); -+ test(test_issue_22, "test issue #22"); -+ test(test_issue_27, "test issue #27"); -+ test(test_count, "test tokens count estimation"); -+ test(test_nonstrict, "test for non-strict mode"); -+ printf("\nPASSED: %d\nFAILED: %d\n", test_passed, test_failed); -+ return (test_failed > 0); -+} -diff --git a/src/jsmn/test/testutil.h b/src/jsmn/test/testutil.h -new file mode 100644 -index 0000000..9a1eb2d ---- /dev/null -+++ b/src/jsmn/test/testutil.h -@@ -0,0 +1,94 @@ -+#ifndef __TEST_UTIL_H__ -+#define __TEST_UTIL_H__ -+ -+#include "../jsmn.c" -+ -+static int vtokeq(const char *s, jsmntok_t *t, int numtok, va_list ap) { -+ if (numtok > 0) { -+ int i, start, end, size; -+ int type; -+ char *value; -+ -+ size = -1; -+ value = NULL; -+ for (i = 0; i < numtok; i++) { -+ type = va_arg(ap, int); -+ if (type == JSMN_STRING) { -+ value = va_arg(ap, char *); -+ size = va_arg(ap, int); -+ start = end = -1; -+ } else if (type == JSMN_PRIMITIVE) { -+ value = va_arg(ap, char *); -+ start = end = size = -1; -+ } else { -+ start = va_arg(ap, int); -+ end = va_arg(ap, int); -+ size = va_arg(ap, int); -+ value = NULL; -+ } -+ if (t[i].type != type) { -+ printf("token %d type is %d, not %d\n", i, t[i].type, type); -+ return 0; -+ } -+ if (start != -1 && end != -1) { -+ if (t[i].start != start) { -+ printf("token %d start is %d, not %d\n", i, t[i].start, start); -+ return 0; -+ } -+ if (t[i].end != end ) { -+ printf("token %d end is %d, not %d\n", i, t[i].end, end); -+ return 0; -+ } -+ } -+ if (size != -1 && t[i].size != size) { -+ printf("token %d size is %d, not %d\n", i, t[i].size, size); -+ return 0; -+ } -+ -+ if (s != NULL && value != NULL) { -+ const char *p = s + t[i].start; -+ if (strlen(value) != t[i].end - t[i].start || -+ strncmp(p, value, t[i].end - t[i].start) != 0) { -+ printf("token %d value is %.*s, not %s\n", i, t[i].end-t[i].start, -+ s+t[i].start, value); -+ return 0; -+ } -+ } -+ } -+ } -+ return 1; -+} -+ -+static int tokeq(const char *s, jsmntok_t *tokens, int numtok, ...) { -+ int ok; -+ va_list args; -+ va_start(args, numtok); -+ ok = vtokeq(s, tokens, numtok, args); -+ va_end(args); -+ return ok; -+} -+ -+static int parse(const char *s, int status, int numtok, ...) { -+ int r; -+ int ok = 1; -+ va_list args; -+ jsmn_parser p; -+ jsmntok_t *t = malloc(numtok * sizeof(jsmntok_t)); -+ -+ jsmn_init(&p); -+ r = jsmn_parse(&p, s, strlen(s), t, numtok); -+ if (r != status) { -+ printf("status is %d, not %d\n", r, status); -+ return 0; -+ } -+ -+ if (status >= 0) { -+ va_start(args, numtok); -+ ok = vtokeq(s, t, numtok, args); -+ va_end(args); -+ } -+ free(t); -+ return ok; -+} -+ -+#endif /* __TEST_UTIL_H__ */
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Format: 3.0 (quilt) Source: getdns Binary: libgetdns-dev, libgetdns1, getdns-utils Architecture: any Version: 1.1.0~a2-2 Maintainer: Debian DNS Packaging <pkg-dns-devel@lists.alioth.debian.org> Uploaders: Ondřej Surý <ondrej@debian.org>, Scott Kitterman <scott@kitterman.com>, Daniel Kahn Gillmor <dkg@fifthhorseman.net> Homepage: https://getdnsapi.net/ Standards-Version: 3.9.8 Vcs-Browser: https://anonscm.debian.org/git/pkg-dns/getdns.git Vcs-Git: https://anonscm.debian.org/git/pkg-dns/getdns.git Build-Depends: autotools-dev, check, debhelper (>= 9), dh-autoreconf, libev-dev, libevent-dev, libexpat-dev, libidn11-dev, libldns-dev, libunbound-dev, libuv1-dev, unbound-anchor Package-List: getdns-utils deb libs extra arch=any libgetdns-dev deb libdevel extra arch=any libgetdns1 deb libs extra arch=any Checksums-Sha1: 4a20a83884a9ce6027441f9d0c0be58280fd0364 658110 getdns_1.1.0~a2.orig.tar.gz 28fbe8bd20a628bddbcab158a3fc092966c2eb9e 19836 getdns_1.1.0~a2-2.debian.tar.xz Checksums-Sha256: 49204cfe1958e181c149926bbf65d0e30b62359bc8a2e739c6512416dbdac3f6 658110 getdns_1.1.0~a2.orig.tar.gz ac18616f733fde8436fa28ead07854fcf54a9402a442231516a35341dd7108bf 19836 getdns_1.1.0~a2-2.debian.tar.xz Files: d8e93059508fc0898da554bec81d630f 658110 getdns_1.1.0~a2.orig.tar.gz 8c62e360e14de5f7464c0eb4f59fdf07 19836 getdns_1.1.0~a2-2.debian.tar.xz -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEMLkz2A/OPZgaLTj7DJm3DvT8uwcFAli/5I5fFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDMw QjkzM0Q4MEZDRTNEOTgxQTJEMzhGQjBDOTlCNzBFRjRGQ0JCMDcACgkQDJm3DvT8 uwdyKhAA7jfEOsmTUG/13vQuczWtXUdBUbmlItxgWLr7a7pMnqyn2BItpFGa9rr4 eWYg+yw2cvPMEv7OmDFpt6Dd+p46KGVFK1GkHJbc7IDdUglLx0I4R2fgRSh6Cs76 cxFGcXxJKBW4OA551fMNuZ1iBqOiPICkj7NX7OTQ67j+PrLWKdmGzOB104O/nq7J 7W1CXl/D9F2M4Ctef/Vqe01E48NRKYPaQcG77dHoWmSN4aVyz09bI9edczEtrHh/ q3ji0hqRFYLl/9cvx+H1WtjLFog0DWSGN9F23p8zFCGiAhUFJ1pTtnx+FJzLw4+u JpOp05x0qD+2G9IcLizSQ7fqU0EdiqMR8tO7PXJRsIDGYj7Y3GpIFbKdVz/7Q1GF Hd4/EKd6vCtVSWbS8Mvfn7YWBSGzCKjs8Ii56HlUH0ViFUy+QETOBkGflD1vYO6e v0oRcF7+dL81txTR5MtDXBD2sebgn/cJxtqW0wDl/MOkaTD8em4fkk+nowrDgcLO DgvHtW4tT6Zxq7aleaqpXq75G7gZgtv/1gJNOM6gopLC7DgZIf3e2oJAUjO7Yxjz JwmhsSIR1UeoGiiS83oi2t/kwwOiEszPMJ/fk5v/X+c87rBsXP/ANg3Re11h9aDl 8jsflc5myu8d76UU8tpxZojd5WFjJ3hhlkDtoQhGbu7wYyKhsRk= =RKHx -----END PGP SIGNATURE-----
Attachment:
getdns_1.1.0~a2-2.debian.tar.xz
Description: application/xz
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Format: 1.8 Date: Wed, 08 Mar 2017 11:48:09 +0100 Source: getdns Binary: libgetdns-dev libgetdns1 getdns-utils Architecture: source Version: 1.1.0~a2-2 Distribution: unstable Urgency: medium Maintainer: Debian DNS Packaging <pkg-dns-devel@lists.alioth.debian.org> Changed-By: Ondřej Surý <ondrej@debian.org> Description: getdns-utils - modern asynchronous DNS API (utils) libgetdns-dev - modern asynchronous DNS API (development) libgetdns1 - modern asynchronous DNS API (shared library) Closes: 849577 Changes: getdns (1.1.0~a2-2) unstable; urgency=medium . * Use upstream provided src/jsmn/ (Closes: #849577) Checksums-Sha1: 3a6c0917e921180c987446e5c1d5408c86393451 2370 getdns_1.1.0~a2-2.dsc 28fbe8bd20a628bddbcab158a3fc092966c2eb9e 19836 getdns_1.1.0~a2-2.debian.tar.xz 5d7181e1e8c04a674555f1b947186c61818082e9 6486 getdns_1.1.0~a2-2_amd64.buildinfo Checksums-Sha256: bb00bcf568c664fbc50d15111e0af49b2f1cf1507db619f92674d4b1701f8487 2370 getdns_1.1.0~a2-2.dsc ac18616f733fde8436fa28ead07854fcf54a9402a442231516a35341dd7108bf 19836 getdns_1.1.0~a2-2.debian.tar.xz 7b9d2a712d785dfbc370451c643a7cedaf8e91a4e64dfeda5352b7fbfdb0623e 6486 getdns_1.1.0~a2-2_amd64.buildinfo Files: e79c972b279141fce0428388d793499d 2370 libs extra getdns_1.1.0~a2-2.dsc 8c62e360e14de5f7464c0eb4f59fdf07 19836 libs extra getdns_1.1.0~a2-2.debian.tar.xz e5a0ad31cb8b7623ad9e360f5be7e27c 6486 libs extra getdns_1.1.0~a2-2_amd64.buildinfo -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEMLkz2A/OPZgaLTj7DJm3DvT8uwcFAli/5I9fFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDMw QjkzM0Q4MEZDRTNEOTgxQTJEMzhGQjBDOTlCNzBFRjRGQ0JCMDcACgkQDJm3DvT8 uwf0VhAA47ruDJjcha0bIoNGrxq7yOvJWcfavK86YTq7CDJTp2aDiZUAylDe5srr mMylJTVOysPQLeAtifrYgNM1kRN5coqOVl/qAK0UFVHXggiPGyBPJSdAOo9FIySp aH0PutYF5LfFcCq/2dwD6/UKJ/lP3jUlOmkOlyyTSd3MpSFBTfc3O11ZWu8ISOoi /8jfu4Fmvrq/QmyQcwxEMW8YVvJmjYIeVao0I7NrXw/rEPMqmkT/kseclhmB3YUx A56A2jcSnb/fh1A2RRHBFWlbI1IYSz5RhmBaohLn4CTECFiuhYB4MpWqFYY00i7t Zdyih4NCP5jv7+lQKFUWTdsDdu++EFf3xuzDiPQWhtNkdCdxNadSoquTelA7pysx V1Du/HE8A3Zz8i4JIZjEV/DHVOesQdaSgghlnKjmfwWcHDDi2ckqNyWA+HU9tHCX Q9cqJdGagBwHbxZ8nRleuMQl5sFYkl/PU4jMFKFGEcnCbKyRtIYjdsQdT0/NmeEf CAuPkMq5pjG6Pbno/do5jQE11vRL6+33jPuFV3mgicewOwFq/Ue/zPJ36TmhDJ5Y hx6pg00UZ9BNNMMPogYJXjsQbCsay9AZS7wM7n9GvgtXHnajUoLIqeQ/PpU9VIOb IJaRmmg99NBavvayhpSiQyx5f7XLSYevH2Cbrc8egwCDABeycFU= =D7UR -----END PGP SIGNATURE-----