Your message dated Mon, 03 Apr 2017 14:06:00 +0000 with message-id <e54f5d38-967f-9627-c732-d293bd9efaba@thykier.net> and subject line Re: Bug#859404: unblock: getdns/1.1.0~a2-2 has caused the Debian Bug report #859404, regarding unblock: getdns/1.1.0~a2-2 to be marked as done. This means that you claim that the problem has been dealt with. If this is not the case it is now your responsibility to reopen the Bug report if necessary, and/or fix the problem forthwith. (NB: If you are a system administrator and have no idea what this message is talking about, this may indicate a serious mail system misconfiguration somewhere. Please contact owner@bugs.debian.org immediately.) -- 859404: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=859404 Debian Bug Tracking System Contact owner@bugs.debian.org with problems
--- Begin Message ---
- To: Debian Bug Tracking System <submit@bugs.debian.org>
- Subject: unblock: getdns/1.1.0~a2-2
- From: Ondřej Surý <ondrej@debian.org>
- Date: Mon, 03 Apr 2017 12:04:43 +0200
- Message-id: <[🔎] 149121388378.151712.6503986362610761726.reportbug@lettie.labs.nic.cz>
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-----
--- End Message ---
--- Begin Message ---
- To: Ondřej Surý <ondrej@debian.org>, 859404-done@bugs.debian.org
- Subject: Re: Bug#859404: unblock: getdns/1.1.0~a2-2
- From: Niels Thykier <niels@thykier.net>
- Date: Mon, 03 Apr 2017 14:06:00 +0000
- Message-id: <e54f5d38-967f-9627-c732-d293bd9efaba@thykier.net>
- In-reply-to: <[🔎] 149121388378.151712.6503986362610761726.reportbug@lettie.labs.nic.cz>
- References: <[🔎] 149121388378.151712.6503986362610761726.reportbug@lettie.labs.nic.cz>
Ondřej Surý: > 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 > > [...] Unblocked, thanks. ~Niels
--- End Message ---