From b7fd730409dba14ec3492b37a1bded6e5ea24163 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Tue, 9 Jun 2009 03:53:36 +0000 Subject: [PATCH] Malformed CAPTCHA response may crash a room. This is now fixed. SVN Revision: 2148 --- src/ejabberd_captcha.erl | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/ejabberd_captcha.erl b/src/ejabberd_captcha.erl index 71a711fee..95d44ef2a 100644 --- a/src/ejabberd_captcha.erl +++ b/src/ejabberd_captcha.erl @@ -153,22 +153,26 @@ process_reply({xmlelement, "captcha", _, _} = El) -> {error, malformed}; Xdata -> Fields = jlib:parse_xdata_submit(Xdata), - [Id | _] = proplists:get_value("challenge", Fields, [none]), - [OCR | _] = proplists:get_value("ocr", Fields, [none]), - ?T(case mnesia:read(captcha, Id, write) of - [#captcha{pid=Pid, args=Args, key=Key, tref=Tref}] -> - mnesia:delete({captcha, Id}), - erlang:cancel_timer(Tref), - if OCR == Key -> - Pid ! {captcha_succeed, Args}, - ok; - true -> - Pid ! {captcha_failed, Args}, - {error, bad_match} - end; - _ -> - {error, not_found} - end) + case {proplists:get_value("challenge", Fields), + proplists:get_value("ocr", Fields)} of + {[Id|_], [OCR|_]} -> + ?T(case mnesia:read(captcha, Id, write) of + [#captcha{pid=Pid, args=Args, key=Key, tref=Tref}] -> + mnesia:delete({captcha, Id}), + erlang:cancel_timer(Tref), + if OCR == Key -> + Pid ! {captcha_succeed, Args}, + ok; + true -> + Pid ! {captcha_failed, Args}, + {error, bad_match} + end; + _ -> + {error, not_found} + end); + _ -> + {error, malformed} + end end; process_reply(_) -> {error, malformed}.