[erlang-bugs] httpc_handler crash on malformed content-length

Magnus Mueller <>
Tue Feb 18 11:24:32 CET 2014


Hello List.

httpc_handler crashes hard when the supplied content-length is not parseable with list_to_integer.

== Steps to reproduce ==

1) Use netcat to listen at a specific port (nc -l 30100)
2) Open an Erlang shell, start inets and perform a httpc request
3) After httpc sent its request, write the following into stdin of netcat (followed by two newlines):

    HTTP/1.1 200 OK
    content-length: die!

=== httpc in repl ===

()1> inets:start().
ok
()2> httpc:request("http://localhost:30100").
{error,
    {badarg,
        [{erlang,list_to_integer,["die!"],[]},
         {httpc_handler,handle_http_body,2,
             [{file,"httpc_handler.erl"},{line,1143}]},
         {httpc_handler,handle_info,2,
             [{file,"httpc_handler.erl"},{line,462}]},
         {gen_server,handle_msg,5,
             [{file,"gen_server.erl"},{line,604}]},
         {proc_lib,init_p_do_apply,3,
             [{file,"proc_lib.erl"},{line,239}]}]}}
()3> 
=ERROR REPORT==== 18-Feb-2014::11:16:52 ===
** Generic server <0.55.0> terminating 
** Last message in was {tcp,#Port<0.3049>,<<"\n">>}
** When Server state == {state,
                            {request,#Ref<0.0.0.90>,<0.41.0>,0,http,
                                {"localhost",30100},
                                "/",[],get,
                                {http_request_h,undefined,"keep-alive",
                                    undefined,undefined,undefined,undefined,
                                    undefined,undefined,undefined,undefined,
                                    undefined,undefined,undefined,undefined,
                                    undefined,undefined,"localhost:30100",
                                    undefined,undefined,undefined,undefined,
                                    undefined,undefined,undefined,undefined,
                                    undefined,[],undefined,undefined,
                                    undefined,undefined,"0",undefined,
                                    undefined,undefined,undefined,undefined,
                                    undefined,[]},
                                {[],[]},
                                {http_options,"HTTP/1.1",infinity,true,
                                    {essl,[]},
                                    undefined,false,infinity,false},
                                "http://localhost:30100",[],none,[],
                                1392718605743,undefined,undefined,false},
                            {session,
                                {{"localhost",30100},<0.55.0>}, 
                                false,http,#Port<0.3049>,ip_comm,1,keep_alive,
                                false},
                            undefined,undefined,undefined,
                            {httpc_response,parse_headers,
                                [<<"\r\n">>,"!eid :htgnel-tnetnoc",[],nolimit,
                                 ["OK",200,"HTTP/1.1"],
                                 false]},
                            {[],[]},
                            {[],[]},
                            new,[],nolimit,nolimit,
                            {options,
                                {undefined,[]},
                                {undefined,[]},
                                0,2,5,120000,2,disabled,false,inet,default,
                                default,[]},
                            {timers,[],undefined},
                            httpc_manager,inactive}
** Reason for termination == 
** {badarg,[{erlang,list_to_integer,["die!"],[]},
            {httpc_handler,handle_http_body,2,
                           [{file,"httpc_handler.erl"},{line,1143}]},
            {httpc_handler,handle_info,2,
                           [{file,"httpc_handler.erl"},{line,462}]},
            {gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,604}]},
            {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]}


More information about the erlang-bugs mailing list