[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#859404: unblock: getdns/1.1.0~a2-2



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-----

Reply to: