Boost logo

Boost Users :

Subject: [Boost-users] Debugging openssl server and asio
From: Allan Nielsen (a_at_[hidden])
Date: 2011-08-27 14:54:35


Hi

I'm trying to hack cpp-netlib to implement a https server. I have used the
ssl server example from boost 1.46.1 which is working okay, but when I
(think) I do the same thing in cpp-net lib I got this segmentation fault:

#0 0x00007ffff7bbda57 in SSL_accept () from /usr/lib64/libssl.so.1.0.0
#1 0x00000000004c1702 in
boost::network::http::sync_connection<boost::network::http::tags::http_server,
handler>::socket (this=0x4d58ca)
    at
/home/awn/git/buildroot5/git/gmbinit/test/cpp-netlib-0.9.2/boost/network/protocol/http/server/sync_connection.hpp:50
#2 0x00000000004d4e67 in boost::detail::function::function_invoker1<int
(*)(SSL*), int, SSL*>::invoke (function_ptr=..., a0=0x731820) at
/usr/include/boost-1_46/boost/function/function_template.hpp:95
#3 0x00000000004d0fd6 in boost::function1<int, SSL*>::operator()
(this=0x73b490, a0=0x731820) at
/usr/include/boost-1_46/boost/function/function_template.hpp:1013
#4 0x00000000004cde2f in
boost::asio::ssl::detail::openssl_operation<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
boost::asio::stream_socket_service<boost::asio::ip::tcp> > >::start
(this=0x73b490)
    at
/usr/include/boost-1_46/boost/asio/ssl/detail/openssl_operation.hpp:149
#5 0x00000000004df1b3 in boost::_mfi::mf0<int,
boost::asio::ssl::detail::openssl_operation<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
boost::asio::stream_socket_service<boost::asio::ip::tcp> > > >::operator() (
    this=0x7fffffffc500, p=0x73b490) at
/usr/include/boost-1_46/boost/bind/mem_fn_template.hpp:49
#6 0x00000000004dd693 in
boost::_bi::list1<boost::_bi::value<boost::asio::ssl::detail::openssl_operation<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
boost::asio::stream_socket_service<boost::asio::ip::tcp> > >*>
>::operator()<int, boost::_mfi::mf0<int,
boost::asio::ssl::detail::openssl_operation<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
boost::asio::stream_socket_service<boost::asio::ip::tcp> > > >,
boost::_bi::list0> (this=0x7fffffffc510, f=...,
    a=...) at /usr/include/boost-1_46/boost/bind/bind.hpp:243
#7 0x00000000004db687 in boost::_bi::bind_t<int, boost::_mfi::mf0<int,
boost::asio::ssl::detail::openssl_operation<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
boost::asio::stream_socket_service<boost::asio::ip::tcp> > > >,
boost::_bi::list1<boost::_bi::value<boost::asio::ssl::detail::openssl_operation<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
boost::asio::stream_socket_service<boost::asio::ip::tcp> > >*> >
>::operator() (this=0x7fffffffc500)
    at /usr/include/boost-1_46/boost/bind/bind_template.hpp:20
#8 0x00000000004d980e in
boost::asio::asio_handler_invoke<boost::_bi::bind_t<int,
boost::_mfi::mf0<int,
boost::asio::ssl::detail::openssl_operation<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
boost::asio::stream_socket_service<boost::asio::ip::tcp> > > >,
boost::_bi::list1<boost::_bi::value<boost::asio::ssl::detail::openssl_operation<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
boost::asio::stream_socket_service<boost::asio::ip::tcp> > >*> > > > (
    function=...) at
/usr/include/boost-1_46/boost/asio/handler_invoke_hook.hpp:64
#9 0x00000000004d7b22 in
boost_asio_handler_invoke_helpers::invoke<boost::_bi::bind_t<int,
boost::_mfi::mf0<int,
boost::asio::ssl::detail::openssl_operation<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
boost::asio::stream_socket_service<boost::asio::ip::tcp> > > >,
boost::_bi::list1<boost::_bi::value<boost::asio::ssl::detail::openssl_operation<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
boost::asio::stream_socket_service<boost::asio::ip::tcp> > >*> > >,
boost::_bi::bind_t<int, boost::_mfi::mf0<int,
boost::asio::ssl::detail::openssl_operation<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
boost::asio::stream_socket_service<boost::asio::ip::tcp> > > >,
boost::_bi::list1<boost::_bi::value<boost::asio::ssl::detail::openssl_operation<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
boost::asio::stream_socket_service<boost::asio::ip::tcp> > >*> > > >
(function=..., context=...)
    at
/usr/include/boost-1_46/boost/asio/detail/handler_invoke_helpers.hpp:39
#10 0x00000000004d5990 in
boost::asio::detail::completion_handler<boost::_bi::bind_t<int,
boost::_mfi::mf0<int,
boost::asio::ssl::detail::openssl_operation<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
boost::asio::stream_socket_service<boost::asio::ip::tcp> > > >,
boost::_bi::list1<boost::_bi::value<boost::asio::ssl::detail::openssl_operation<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
boost::asio::stream_socket_service<boost::asio::ip::tcp> > >*> > >
>::do_complete (owner=0x734c60, base=0x72fb80) at
/usr/include/boost-1_46/boost/asio/detail/completion_handler.hpp:63
#11 0x00000000004ae40b in
boost::asio::detail::task_io_service_operation::complete (this=0x72fb80,
owner=...) at
/usr/include/boost-1_46/boost/asio/detail/task_io_service_operation.hpp:35
#12 0x00000000004b3fb2 in boost::asio::detail::strand_service::do_complete
(owner=0x734c60, base=0x7308e0) at
/usr/include/boost-1_46/boost/asio/detail/impl/strand_service.ipp:98
#13 0x00000000004ae40b in
boost::asio::detail::task_io_service_operation::complete (this=0x7308e0,
owner=...) at
/usr/include/boost-1_46/boost/asio/detail/task_io_service_operation.hpp:35
#14 0x00000000004b0449 in boost::asio::detail::task_io_service::do_one
(this=0x734c60, lock=..., this_idle_thread=0x7fffffffc790) at
/usr/include/boost-1_46/boost/asio/detail/impl/task_io_service.ipp:278
#15 0x00000000004aff97 in boost::asio::detail::task_io_service::run
(this=0x734c60, ec=...) at
/usr/include/boost-1_46/boost/asio/detail/impl/task_io_service.ipp:130
#16 0x00000000004b0841 in boost::asio::io_service::run (this=0x7fffffffc980)
at /usr/include/boost-1_46/boost/asio/impl/io_service.ipp:57
#17 0x00000000004ac04b in main (arg=1, argv=0x7fffffffcb18) at
/home/awn/git/buildroot5/git/gmbinit/test/serverTest.cxx:51

As the problem is in SSL_accept () i expect there is something wrong with
my SSL context which I create like this:

    boost::asio::ssl::context context_(io_service,
boost::asio::ssl::context::sslv23);
    context_.set_verify_mode(boost::asio::ssl::context::verify_none);
    context_.use_certificate_chain_file("/etc/ssl/gamblify/gamblify.cert");
    context_.use_private_key_file("/etc/ssl/gamblify/gamblify.pem",
boost::asio::ssl::context::pem);

The context is created in my main function, and then passed around as a
reference.

The type of my socket is:
     boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket_;

I create it like this:
     socket_(service_, context)

Accept is using the lowest layer which I return like this

boost::asio::ssl::stream<boost::asio::ip::tcp::socket>::lowest_layer_type&
socket()
        {
            return socket_.lowest_layer();
        }

I call async_accept like this:

            new_connection.reset(new sync_connection<Tag,Handler>(service_,
handler_, context_));
            acceptor_.async_accept(new_connection->socket(),
                boost::bind(&sync_server_base<Tag,Handler>::handle_accept,
                            this, boost::asio::placeholders::error));

The handler looks like this:
        void handle_accept(boost::system::error_code const & ec) {
            if (!ec) {
                new_connection->start();
                new_connection.reset(new
sync_connection<Tag,Handler>(service_, handler_, context_));
                acceptor_.async_accept(new_connection->socket(),

boost::bind(&sync_server_base<Tag,Handler>::handle_accept,
                                this, boost::asio::placeholders::error));
            }
        }

Eventually the accept handler and it is running start which looks like this:
        void start()
        {
            std::cerr << "Running start" << std::endl;
            socket_.async_handshake(boost::asio::ssl::stream_base::server,

boost::bind(&sync_connection<Tag,Handler>::handle_handshake, this,

boost::asio::placeholders::error));
        }

Then at some point before I reach the handle_handshake I get an segmentation
fault...

Can any body see any problems with this, or just give some hints on how to
debug this kind of bugs...

--
Allan W. Nielsen


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net