| commit 870ee48fe109c289033cd0b7543b6f5ea4e6f128 |
| Author: Joakim Hamren <joakim.hamren@gmail.com> |
| Date: Sat Feb 4 01:07:52 2017 +0100 |
| |
| Fixes for sort_keys bug and a typo. |
| |
| - Fixed segfault when using sort_keys=True on dict with unorderable keys (GH247) |
| |
| - Fixed refcount becoming negative when using sort_keys=True (GH243) |
| |
| - Fixed compile error when defining JSON_NO_EXTRA_WHITESPACE |
| caused by a wrongly named variable. (GH245) |
| |
| diff --git a/lib/ultrajsonenc.c b/lib/ultrajsonenc.c |
| index cb10024..1bfa8f4 100644 |
| --- a/lib/ultrajsonenc.c |
| +++ b/lib/ultrajsonenc.c |
| @@ -717,7 +717,7 @@ static void encode(JSOBJ obj, JSONObjectEncoder *enc, const char *name, size_t c |
| { |
| const char *value; |
| char *objName; |
| - int count; |
| + int count, res; |
| JSOBJ iterObj; |
| size_t szlen; |
| JSONTypeContext tc; |
| @@ -796,7 +796,7 @@ static void encode(JSOBJ obj, JSONObjectEncoder *enc, const char *name, size_t c |
| { |
| Buffer_AppendCharUnchecked (enc, ','); |
| #ifndef JSON_NO_EXTRA_WHITESPACE |
| - Buffer_AppendCharUnchecked (buffer, ' '); |
| + Buffer_AppendCharUnchecked (enc, ' '); |
| #endif |
| Buffer_AppendIndentNewlineUnchecked (enc); |
| } |
| @@ -823,8 +823,16 @@ static void encode(JSOBJ obj, JSONObjectEncoder *enc, const char *name, size_t c |
| Buffer_AppendCharUnchecked (enc, '{'); |
| Buffer_AppendIndentNewlineUnchecked (enc); |
| |
| - while (enc->iterNext(obj, &tc)) |
| + while ((res = enc->iterNext(obj, &tc))) |
| { |
| + if(res < 0) |
| + { |
| + enc->iterEnd(obj, &tc); |
| + enc->endTypeContext(obj, &tc); |
| + enc->level--; |
| + return; |
| + } |
| + |
| if (count > 0) |
| { |
| Buffer_AppendCharUnchecked (enc, ','); |
| diff --git a/python/objToJSON.c b/python/objToJSON.c |
| index 1960d40..8133fb5 100644 |
| --- a/python/objToJSON.c |
| +++ b/python/objToJSON.c |
| @@ -537,6 +537,7 @@ static int SortedDict_iterNext(JSOBJ obj, JSONTypeContext *tc) |
| // Sort the list. |
| if (PyList_Sort(items) < 0) |
| { |
| + PyErr_SetString(PyExc_ValueError, "unorderable keys"); |
| goto error; |
| } |
| |
| @@ -607,7 +608,6 @@ static void SortedDict_iterEnd(JSOBJ obj, JSONTypeContext *tc) |
| { |
| GET_TC(tc)->itemName = NULL; |
| GET_TC(tc)->itemValue = NULL; |
| - Py_DECREF(GET_TC(tc)->newObj); |
| Py_DECREF(GET_TC(tc)->dictObj); |
| PRINTMARK(); |
| } |