diff options
author | Eric Avdey <eiri@eiri.ca> | 2019-02-04 22:51:18 -0400 |
---|---|---|
committer | Jan Lehnardt <jan@apache.org> | 2019-02-17 18:33:19 +0100 |
commit | 78d6987f8cfb00ced5d488dd35b70956556277ab (patch) | |
tree | 09e0703ffdbb3f26adf9bdbfeb4ab5921b3aa2b6 | |
parent | ffc8c49b460819e63762aeea89a9c0cecf4140d4 (diff) | |
download | couchdb-78d6987f8cfb00ced5d488dd35b70956556277ab.tar.gz |
Fix badarg crash on invalid rev for individual doc update
-rw-r--r-- | src/couch/src/couch_doc.erl | 8 | ||||
-rw-r--r-- | src/couch/test/couch_db_doc_tests.erl | 21 |
2 files changed, 24 insertions, 5 deletions
diff --git a/src/couch/src/couch_doc.erl b/src/couch/src/couch_doc.erl index e5ad9e9f1..6717c9b0f 100644 --- a/src/couch/src/couch_doc.erl +++ b/src/couch/src/couch_doc.erl @@ -179,12 +179,12 @@ parse_rev(Rev) when is_list(Rev) -> SplitRev = lists:splitwith(fun($-) -> false; (_) -> true end, Rev), case SplitRev of {Pos, [$- | RevId]} -> - IntPos = try list_to_integer(Pos) of - Val -> Val + try + IntPos = list_to_integer(Pos), + {IntPos, parse_revid(RevId)} catch error:badarg -> throw({bad_request, <<"Invalid rev format">>}) - end, - {IntPos, parse_revid(RevId)}; + end; _Else -> throw({bad_request, <<"Invalid rev format">>}) end; parse_rev(_BadRev) -> diff --git a/src/couch/test/couch_db_doc_tests.erl b/src/couch/test/couch_db_doc_tests.erl index aa9c6fd71..cdcf81d15 100644 --- a/src/couch/test/couch_db_doc_tests.erl +++ b/src/couch/test/couch_db_doc_tests.erl @@ -42,7 +42,8 @@ couch_db_doc_test_() -> foreach, fun setup/0, fun teardown/1, [ - fun should_truncate_number_of_revisions/1 + fun should_truncate_number_of_revisions/1, + fun should_raise_bad_request_on_invalid_rev/1 ] } } @@ -59,6 +60,24 @@ should_truncate_number_of_revisions(DbName) -> ?_assertEqual(5, length(Revs)). +should_raise_bad_request_on_invalid_rev(DbName) -> + DocId = <<"foo">>, + InvalidRev1 = <<"foo">>, + InvalidRev2 = <<"a-foo">>, + InvalidRev3 = <<"1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx">>, + Expect = {bad_request, <<"Invalid rev format">>}, + Db = open_db(DbName), + create_doc(Db, DocId), + [ + {InvalidRev1, + ?_assertThrow(Expect, add_revisions(Db, DocId, InvalidRev1, 1))}, + {InvalidRev2, + ?_assertThrow(Expect, add_revisions(Db, DocId, InvalidRev2, 1))}, + {InvalidRev3, + ?_assertThrow(Expect, add_revisions(Db, DocId, InvalidRev3, 1))} + ]. + + open_db(DbName) -> {ok, Db} = couch_db:open_int(DbName, [?ADMIN_CTX]), Db. |