summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Avdey <eiri@eiri.ca>2019-02-01 12:41:54 -0400
committerJan Lehnardt <jan@apache.org>2019-02-17 18:33:19 +0100
commit94588604e812699b429b86f3c3f507fdc5469dcc (patch)
treea24210275c2bf26d40f53b18bff4be505742972d
parent78d6987f8cfb00ced5d488dd35b70956556277ab (diff)
downloadcouchdb-94588604e812699b429b86f3c3f507fdc5469dcc.tar.gz
Fix from_json_obj_validate crash when provided rev isn't a valid hex
-rw-r--r--src/couch/src/couch_doc.erl13
-rw-r--r--src/couch/test/couch_doc_json_tests.erl6
2 files changed, 16 insertions, 3 deletions
diff --git a/src/couch/src/couch_doc.erl b/src/couch/src/couch_doc.erl
index 6717c9b0f..4a49372c7 100644
--- a/src/couch/src/couch_doc.erl
+++ b/src/couch/src/couch_doc.erl
@@ -275,9 +275,16 @@ transfer_fields([{<<"_revisions">>, {Props}} | Rest], Doc, DbName) ->
true ->
ok
end,
- [throw({doc_validation, "RevId isn't a string"}) ||
- RevId <- RevIds, not is_binary(RevId)],
- RevIds2 = [parse_revid(RevId) || RevId <- RevIds],
+ RevIds2 = lists:map(fun(RevId) ->
+ try
+ parse_revid(RevId)
+ catch
+ error:function_clause ->
+ throw({doc_validation, "RevId isn't a string"});
+ error:badarg ->
+ throw({doc_validation, "RevId isn't a valid hexadecimal"})
+ end
+ end, RevIds),
transfer_fields(Rest, Doc#doc{revs={Start, RevIds2}}, DbName);
transfer_fields([{<<"_deleted">>, B} | Rest], Doc, DbName) when is_boolean(B) ->
diff --git a/src/couch/test/couch_doc_json_tests.erl b/src/couch/test/couch_doc_json_tests.erl
index bcff0646a..b9e3d01e9 100644
--- a/src/couch/test/couch_doc_json_tests.erl
+++ b/src/couch/test/couch_doc_json_tests.erl
@@ -268,6 +268,12 @@ from_json_error_cases() ->
"Revision ids must be strings."
},
{
+ {[{<<"_revisions">>, {[{<<"start">>, 0},
+ {<<"ids">>, [<<"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx">>]}]}}]},
+ {doc_validation, "RevId isn't a valid hexadecimal"},
+ "Revision ids must be a valid hex."
+ },
+ {
{[{<<"_something">>, 5}]},
{doc_validation, <<"Bad special document member: _something">>},
"Underscore prefix fields are reserved."