diff options
author | Eric Avdey <eiri@eiri.ca> | 2019-02-01 12:41:54 -0400 |
---|---|---|
committer | Eric Avdey <eiri@eiri.ca> | 2019-02-01 12:41:54 -0400 |
commit | 57c0f04c681cd69806a525801a9431a4f9161cde (patch) | |
tree | 3af47be7aa54b597f5a032812fc61bbc8260dc09 | |
parent | 4959bc598b6c9bb2ab2b7972c7606fe8783d1fc8 (diff) | |
download | couchdb-fix-bulk_docs-invalid-rev-crash.tar.gz |
Fix from_json_obj_validate crash when provided rev isn't a valid hexfix-bulk_docs-invalid-rev-crash
-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 e5ad9e9f1..2a2b4db68 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 848bae888..51f228900 100644 --- a/src/couch/test/couch_doc_json_tests.erl +++ b/src/couch/test/couch_doc_json_tests.erl @@ -270,6 +270,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." |