summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Avdey <eiri@eiri.ca>2019-02-04 22:51:18 -0400
committerJan Lehnardt <jan@apache.org>2019-02-17 18:33:19 +0100
commit78d6987f8cfb00ced5d488dd35b70956556277ab (patch)
tree09e0703ffdbb3f26adf9bdbfeb4ab5921b3aa2b6
parentffc8c49b460819e63762aeea89a9c0cecf4140d4 (diff)
downloadcouchdb-78d6987f8cfb00ced5d488dd35b70956556277ab.tar.gz
Fix badarg crash on invalid rev for individual doc update
-rw-r--r--src/couch/src/couch_doc.erl8
-rw-r--r--src/couch/test/couch_db_doc_tests.erl21
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.