diff options
author | Eric Avdey <eiri@eiri.ca> | 2019-02-01 12:41:54 -0400 |
---|---|---|
committer | Jan Lehnardt <jan@apache.org> | 2019-02-17 18:33:19 +0100 |
commit | 94588604e812699b429b86f3c3f507fdc5469dcc (patch) | |
tree | a24210275c2bf26d40f53b18bff4be505742972d | |
parent | 78d6987f8cfb00ced5d488dd35b70956556277ab (diff) | |
download | couchdb-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.erl | 13 | ||||
-rw-r--r-- | src/couch/test/couch_doc_json_tests.erl | 6 |
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." |