Mir client crashes in google::protobuf::MessageLite::ParseFromString when the server sends an error response

Bug #1669177 reported by Michał Kuchta
14
This bug affects 3 people
Affects Status Importance Assigned to Milestone
Canonical System Image
New
High
Stephen M. Webb
Mir
New
High
Unassigned
0.26
New
High
Unassigned
mir (Ubuntu)
New
High
Unassigned

Bug Description

Mir client crash occurred during executing 01_hello_SDL (SDL_VIDEODRIVER=mir ./01_hello_SDL) program (program source is available here: http://lazyfoo.net/tutorials/SDL/01_hello_SDL/01_hello_SDL.zip ).

Stack trace:
#0 0x00007ffff00050c0 in ?? ()
#1 0x00007ffff59e796f in google::protobuf::MessageLite::ParseFromString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /usr/lib/x86_64-linux-gnu/libprotobuf-lite.so.9
#2 0x00007ffff6affb88 in mir::client::rpc::MirProtobufRpcChannel::<lambda(google::protobuf::MessageLite*)>::operator()(google::protobuf::MessageLite *) const (__closure=0x7ffff4bc9a20, result_message=0x7ffff0004f80)
    at /media/kinga/Dane/mir/mir_nowy/src/client/rpc/mir_protobuf_rpc_channel.cpp:506
#3 0x00007ffff6b00897 in std::_Function_handler<void(google::protobuf::MessageLite*), mir::client::rpc::MirProtobufRpcChannel::on_data_available()::<lambda(google::protobuf::MessageLite*)> >::_M_invoke(const std::_Any_data &, <unknown type in /usr/local/lib/libmirclient.so.9, CU 0x5376df, DIE 0x58367b>) (__functor=...,
    __args#0=<unknown type in /usr/local/lib/libmirclient.so.9, CU 0x5376df, DIE 0x58367b>)
    at /usr/include/c++/5/functional:1871
#4 0x00007ffff6afbab5 in std::function<void (google::protobuf::MessageLite*)>::operator()(google::protobuf::MessageLite*) const (this=0x7ffff4bc9a20, __args#0=0x7ffff0004f80) at /usr/include/c++/5/functional:2267
#5 0x00007ffff6afad99 in mir::client::rpc::detail::PendingCallCache::populate_message_for_result(mir::protobuf::wire::Result&, std::function<void (google::protobuf::MessageLite*)> const&) (this=0x61e990, result=...,
    populator=...) at /media/kinga/Dane/mir/mir_nowy/src/client/rpc/mir_basic_rpc_channel.cpp:74
#6 0x00007ffff6affed5 in mir::client::rpc::MirProtobufRpcChannel::on_data_available (this=0x61e960)
    at /media/kinga/Dane/mir/mir_nowy/src/client/rpc/mir_protobuf_rpc_channel.cpp:508
#7 0x00007ffff6b09c95 in mir::client::rpc::TransportObservers::<lambda(auto:1)>::operator()<std::shared_ptr<mir::client::rpc::StreamTransport::Observer> >(std::shared_ptr<mir::client::rpc::StreamTransport::Observer>) const (
    __closure=0x7ffff4bc9bd0, observer=warning: RTTI symbol not found for class 'std::_Sp_counted_deleter<mir::client::rpc::MirProtobufRpcChannel*, mir::client::rpc::MirProtobufRpcChannel::MirProtobufRpcChannel(std::unique_ptr<mir::client::rpc::StreamTransport, std::default_delete<mir::client::rpc::StreamTransport> >, std::shared_ptr<mir::client::SurfaceMap> const&, std::shared_ptr<mir::client::AsyncBufferFactory> const&, std::shared_ptr<mir::client::DisplayConfiguration> const&, std::shared_ptr<mir::input::InputDevices> const&, std::shared_ptr<mir::client::rpc::RpcReport> const&, std::shared_ptr<mir::client::AtomicCallback<MirLifecycleState> > const&, std::shared_ptr<mir::client::AtomicCallback<int> > const&, std::shared_ptr<mir::client::AtomicCallback<MirError const*> > const&, std::shared_ptr<mir::client::EventSink> const&)::NullDeleter, std::allocator<void>, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_deleter<mir::client::rpc::MirProtobufRpcChannel*, mir::client::rpc::MirProtobufRpcChannel::MirProtobufRpcChannel(std::unique_ptr<mir::client::rpc::StreamTransport, std::default_delete<mir::client::rpc::StreamTransport> >, std::shared_ptr<mir::client::SurfaceMap> const&, std::shared_ptr<mir::client::AsyncBufferFactory> const&, std::shared_ptr<mir::client::DisplayConfiguration> const&, std::shared_ptr<mir::input::InputDevices> const&, std::shared_ptr<mir::client::rpc::RpcReport> const&, std::shared_ptr<mir::client::AtomicCallback<MirLifecycleState> > const&, std::shared_ptr<mir::client::AtomicCallback<int> > const&, std::shared_ptr<mir::client::AtomicCallback<MirError const*> > const&, std::shared_ptr<mir::client::EventSink> const&)::NullDeleter, std::allocator<void>, (__gnu_cxx::_Lock_policy)2>'
std::shared_ptr (count 3, weak 0) 0x61e970)
    at /media/kinga/Dane/mir/mir_nowy/src/client/rpc/stream_socket_transport.cpp:40
#8 0x00007ffff6b0ad2c in std::_Function_handler<void(const std::shared_ptr<mir::client::rpc::StreamTransport::Observer>&), mir::client::rpc::TransportObservers::on_data_available()::<lambda(auto:1)> >::_M_invoke(const std::_Any_data &, const std::shared_ptr<mir::client::rpc::StreamTransport::Observer> &) (__functor=..., __args#0=warning: RTTI symbol not found for class 'std::_Sp_counted_deleter<mir::client::rpc::MirProtobufRpcChannel*, mir::client::rpc::MirProtobufRpcChannel::MirProtobufRpcChannel(std::unique_ptr<mir::client::rpc::StreamTransport, std::default_delete<mir::client::rpc::StreamTransport> >, std::shared_ptr<mir::client::SurfaceMap> const&, std::shared_ptr<mir::client::AsyncBufferFactory> const&, std::shared_ptr<mir::client::DisplayConfiguration> const&, std::shared_ptr<mir::input::InputDevices> const&, std::shared_ptr<mir::client::rpc::RpcReport> const&, std::shared_ptr<mir::client::AtomicCallback<MirLifecycleState> > const&, std::shared_ptr<mir::client::AtomicCallback<int> > const&, std::shared_ptr<mir::client::AtomicCallback<MirError const*> > const&, std::shared_ptr<mir::client::EventSink> const&)::NullDeleter, std::allocator<void>, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_deleter<mir::client::rpc::MirProtobufRpcChannel*, mir::client::rpc::MirProtobufRpcChannel::MirProtobufRpcChannel(std::unique_ptr<mir::client::rpc::StreamTransport, std::default_delete<mir::client::rpc::StreamTransport> >, std::shared_ptr<mir::client::SurfaceMap> const&, std::shared_ptr<mir::client::AsyncBufferFactory> const&, std::shared_ptr<mir::client::DisplayConfiguration> const&, std::shared_ptr<mir::input::InputDevices> const&, std::shared_ptr<mir::client::rpc::RpcReport> const&, std::shared_ptr<mir::client::AtomicCallback<MirLifecycleState> > const&, std::shared_ptr<mir::client::AtomicCallback<int> > const&, std::shared_ptr<mir::client::AtomicCallback<MirError const*> > const&, std::shared_ptr<mir::client::EventSink> const&)::NullDeleter, std::allocator<void>, (__gnu_cxx::_Lock_policy)2>'

std::shared_ptr (count 3, weak 0) 0x61e970) at /usr/include/c++/5/functional:1871
#9 0x00007ffff6b0c551 in std::function<void (std::shared_ptr<mir::client::rpc::StreamTransport::Observer> const&)>::operator()(std::shared_ptr<mir::client::rpc::StreamTransport::Observer> const&) const (this=0x7ffff4bc9bd0,
    __args#0=warning: RTTI symbol not found for class 'std::_Sp_counted_deleter<mir::client::rpc::MirProtobufRpcChannel*, mir::client::rpc::MirProtobufRpcChannel::MirProtobufRpcChannel(std::unique_ptr<mir::client::rpc::StreamTransport, std::default_delete<mir::client::rpc::StreamTransport> >, std::shared_ptr<mir::client::SurfaceMap> const&, std::shared_ptr<mir::client::AsyncBufferFactory> const&, std::shared_ptr<mir::client::DisplayConfiguration> const&, std::shared_ptr<mir::input::InputDevices> const&, std::shared_ptr<mir::client::rpc::RpcReport> const&, std::shared_ptr<mir::client::AtomicCallback<MirLifecycleState> > const&, std::shared_ptr<mir::client::AtomicCallback<int> > const&, std::shared_ptr<mir::client::AtomicCallback<MirError const*> > const&, std::shared_ptr<mir::client::EventSink> const&)::NullDeleter, std::allocator<void>, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_deleter<mir::client::rpc::MirProtobufRpcChannel*, mir::client::rpc::MirProtobufRpcChannel::MirProtobufRpcChannel(std::unique_ptr<mir::client::rpc::StreamTransport, std::default_delete<mir::client::rpc::StreamTransport> >, std::shared_ptr<mir::client::SurfaceMap> const&, std::shared_ptr<mir::client::AsyncBufferFactory> const&, std::shared_ptr<mir::client::DisplayConfiguration> const&, std::shared_ptr<mir::input::InputDevices> const&, std::shared_ptr<mir::client::rpc::RpcReport> const&, std::shared_ptr<mir::client::AtomicCallback<MirLifecycleState> > const&, std::shared_ptr<mir::client::AtomicCallback<int> > const&, std::shared_ptr<mir::client::AtomicCallback<MirError const*> > const&, std::shared_ptr<mir::client::EventSink> const&)::NullDeleter, std::allocator<void>, (__gnu_cxx::_Lock_policy)2>'
std::shared_ptr (count 3, weak 0) 0x61e970) at /usr/include/c++/5/functional:2267
#10 0x00007ffff6b0b817 in mir::ThreadSafeList<std::shared_ptr<mir::client::rpc::StreamTransport::Observer> >::for_each(std::function<void (std::shared_ptr<mir::client::rpc::StreamTransport::Observer> const&)> const&) (
    this=0x61e870, f=...) at /media/kinga/Dane/mir/mir_nowy/src/include/common/mir/thread_safe_list.h:80
#11 0x00007ffff6b09ce0 in mir::client::rpc::TransportObservers::on_data_available (this=0x61e868)
    at /media/kinga/Dane/mir/mir_nowy/src/client/rpc/stream_socket_transport.cpp:40
#12 0x00007ffff6b0a8c0 in mir::client::rpc::StreamSocketTransport::dispatch (this=0x61e850, events=1)
    at /media/kinga/Dane/mir/mir_nowy/src/client/rpc/stream_socket_transport.cpp:208
#13 0x00007ffff65657fc in mir::dispatch::MultiplexingDispatchable::dispatch (this=0x61eb98, events=1)
    at /media/kinga/Dane/mir/mir_nowy/src/common/dispatch/multiplexing_dispatchable.cpp:140
#14 0x00007ffff6b00305 in mir::client::rpc::MirProtobufRpcChannel::dispatch (this=0x61e960, events=1)
    at /media/kinga/Dane/mir/mir_nowy/src/client/rpc/mir_protobuf_rpc_channel.cpp:555
#15 0x00007ffff65657fc in mir::dispatch::MultiplexingDispatchable::dispatch (this=0x61f3f0, events=1)
    at /media/kinga/Dane/mir/mir_nowy/src/common/dispatch/multiplexing_dispatchable.cpp:140
#16 0x00007ffff6568ade in (anonymous namespace)::dispatch_loop(const std::__cxx11::string &, std::shared_ptr<mir::dispatch::ThreadedDispatcher::ThreadShutdownRequestHandler>, std::shared_ptr<mir::dispatch::Dispatchable>, const std::function<void()> &) (name="RPC Thread", thread_register=std::shared_ptr (count 4, weak 0) 0x61f2a0,
    dispatcher=std::shared_ptr (count 2, weak 0) 0x61f3f0, exception_handler=...)
    at /media/kinga/Dane/mir/mir_nowy/src/common/dispatch/threaded_dispatcher.cpp:211
---Type <return> to continue, or q <return> to quit---
llocator<char> >, std::shared_ptr<mir::dispatch::ThreadedDispatcher::ThreadShutdownRequestHandler>, std::shared_ptr<mir::dispatch::MultiplexingDispatchable>, std::function<void ()>))(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mir::dispatch::ThreadedDispatcher::ThreadShutdownRequestHandler>, std::shared_ptr<mir::dispatch::Dispatchable>, std::function<void ()> const&)>::_M_invoke<0ul, 1ul, 2ul, 3ul>(std::_Index_tuple<0ul, 1ul, 2ul, 3ul>) (this=0x61f4e8)
    at /usr/include/c++/5/functional:1531
#18 0x00007ffff6574374 in std::_Bind_simple<void (*(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<mir::dispatch::ThreadedDispatcher::ThreadShutdownRequestHandler>, std::shared_ptr<mir::dispatch::MultiplexingDispatchable>, std::function<void ()>))(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mir::dispatch::ThreadedDispatcher::ThreadShutdownRequestHandler>, std::shared_ptr<mir::dispatch::Dispatchable>, std::function<void ()> const&)>::operator()() (this=0x61f4e8) at /usr/include/c++/5/functional:1520
#19 0x00007ffff6573ec6 in std::thread::_Impl<std::_Bind_simple<void (*(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<mir::dispatch::ThreadedDispatcher::ThreadShutdownRequestHandler>, std::shared_ptr<mir::dispatch::MultiplexingDispatchable>, std::function<void ()>))(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mir::dispatch::ThreadedDispatcher::ThreadShutdownRequestHandler>, std::shared_ptr<mir::dispatch::Dispatchable>, std::function<void ()> const&)> >::_M_run() (this=0x61f4d0) at /usr/include/c++/5/thread:115
#20 0x00007ffff56fdc80 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#21 0x00007ffff6fc56ba in start_thread (arg=0x7ffff4bca700) at pthread_create.c:333
#22 0x00007ffff77ee82d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109

Revision history for this message
Michał Kuchta (kuchtam) wrote :

I have found that the problem is caused by line:
result_message->ParseFromString(result->response());
in void mclr::MirProtobufRpcChannel::on_data_available()

I checked that response() return invalid data (which previously client has received from server).

I have checked server side and I have found that issue is caused by this part of code:

catch (std::exception const& x)
    {
        using namespace std::literals::string_literals;
        result_message.set_error("Error processing request: "s +
            x.what() + "\nInternal error details: " + boost::diagnostic_information(x));
        self->send_response(invocation.id(), &result_message);

in template_protobuf_message_processor.h

Where result_message type is protobuf::Void and send_response function has signature:

mfd::ProtobufResponder::send_response(
    ::google::protobuf::uint32 id,
    google::protobuf::MessageLite* response,
    FdSets const& fd_sets)

Inexplicit type conversion from protobuf::Void to protobuf::MessageLite probably causes that send_response_buffer in ProtobufResponder::send_response function is broken and contains string:

Error processing request: Invalid SurfaceId
Internal error details: /media/kinga/Dane/mir/mir_nowy/src/server/scene/application_session.cpp(176): Throw in function std::map<mir::IntWrapper<mir::frontend::detail::SessionsSurfaceIdTag>, std::shared_ptr<mir::scene::Surface> >::const_iterator mir::scene::ApplicationSession::checked_find(mir::frontend::SurfaceId) const
Dynamic exception type: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::runtime_error> >
std::exception::what: Invalid SurfaceId

Revision history for this message
Michał Kuchta (kuchtam) wrote :
Download full text (13.4 KiB)

Server side stack trace:

0 0x00007ffff708a428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1 0x00007ffff708c02a in __GI_abort () at abort.c:89
#2 0x00007ffff7082bd7 in __assert_fail_base (fmt=<optimized out>, assertion=assertion@entry=0x7ffff5e4ea72 "false",
    file=file@entry=0x7ffff5e4ea28 "/media/kinga/Dane/mir/mir_nowy/src/server/frontend/protobuf_responder.cpp", line=line@entry=58,
    function=function@entry=0x7ffff5e4ea80 <mir::frontend::detail::ProtobufResponder::send_response(unsigned int, google::protobuf::MessageLite*, std::vector<std::vector<mir::Fd, std::allocator<mir::Fd> >, std::allocator<std::vector<mir::Fd, std::allocator<mir::Fd> > > > const&)::__PRETTY_FUNCTION__> "virtual void mir::frontend::detail::ProtobufResponder::send_response(google::protobuf::uint32, google::protobuf::MessageLite*, const FdSets&)") at assert.c:92
#3 0x00007ffff7082c82 in __GI___assert_fail (assertion=0x7ffff5e4ea72 "false", file=0x7ffff5e4ea28 "/media/kinga/Dane/mir/mir_nowy/src/server/frontend/protobuf_responder.cpp",
    line=58,
    function=0x7ffff5e4ea80 <mir::frontend::detail::ProtobufResponder::send_response(unsigned int, google::protobuf::MessageLite*, std::vector<std::vector<mir::Fd, std::allocator<mir::Fd> >, std::allocator<std::vector<mir::Fd, std::allocator<mir::Fd> > > > const&)::__PRETTY_FUNCTION__> "virtual void mir::frontend::detail::ProtobufResponder::send_response(google::protobuf::uint32, google::protobuf::MessageLite*, const FdSets&)") at assert.c:101
#4 0x00007ffff5d2c537 in mir::frontend::detail::ProtobufResponder::send_response (this=0x7fffd8000a30, id=24, response=0x7fffdfffe2b0,
    fd_sets=std::vector of length 0, capacity 0) at /media/kinga/Dane/mir/mir_nowy/src/server/frontend/protobuf_responder.cpp:58
#5 0x00007ffff5d1b47d in mir::frontend::detail::ProtobufMessageProcessor::send_response (this=0x7fffd8000e60, id=24, response=0x7fffdfffe2b0)
    at /media/kinga/Dane/mir/mir_nowy/src/server/frontend/protobuf_message_processor.cpp:386
#6 0x00007ffff5d22650 in mir::frontend::detail::invoke<mir::frontend::detail::ProtobufMessageProcessor, mir::frontend::detail::DisplayServer, mir::protobuf::DisplayServer, mir::protobuf::SurfaceModifications, mir::protobuf::Void> (self=0x7fffd8000e60, server=0x7fffd8000bc0, function=&virtual table offset 40, invocation=...)
    at /media/kinga/Dane/mir/mir_nowy/src/include/server/mir/frontend/template_protobuf_message_processor.h:98
#7 0x00007ffff5d1a651 in mir::frontend::detail::ProtobufMessageProcessor::dispatch (this=0x7fffd8000e60, invocation=..., side_channel_fds=std::vector of length 0, capacity 0)
    at /media/kinga/Dane/mir/mir_nowy/src/server/frontend/protobuf_message_processor.cpp:266
#8 0x00007ffff5d469cf in mir::frontend::detail::SocketConnection::on_new_message (this=0x7fffd8000ec0, error=...)
    at /media/kinga/Dane/mir/mir_nowy/src/server/frontend/socket_connection.cpp:123
#9 0x00007ffff5d465f2 in mir::frontend::detail::SocketConnection::on_read_size (this=0x7fffd8000ec0, error=...)
    at /media/kinga/Dane/mir/mir_nowy/src/server/frontend/socket_connection.cpp:82
#10 0x00007ffff5d48676 in std::_Mem_fn_base<void (mir::frontend::det...

Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Nice work, thanks.

summary: - Mir Server’s internal error causes client crash.
+ Mir client crashes in google::protobuf::MessageLite::ParseFromString
+ when the server sends an error response
Changed in mir:
importance: Undecided → High
milestone: none → 1.0.0
Changed in canonical-devices-system-image:
importance: Undecided → High
milestone: none → u8c-1
tags: added: unity8-desktop
Changed in canonical-devices-system-image:
assignee: nobody → Stephen M. Webb (bregma)
Revision history for this message
Michał Kuchta (kuchtam) wrote :

I added additional logs to figure out what happened and here is the output:


mir_window_spec_set_pointer_confinement
XXXXX MirProtobufRpcChannel::call_method [sending...] method_name:modify_surface
XXXXX PendingCallCache::save_completion_details [sending...] id: 23 address: 140737219953968
XXXXX MirProtobufRpcChannel::call_method [sending...] method_name:release_surface
XXXXX PendingCallCache::save_completion_details [sending...] id: 24 address: 6416816
XXXXX PendingCallCache::populate_message_for_result [receiving...] id: 22 address: 140737219953968
XXXXX PendingCallCache::populate_message_for_result [receiving...] id: 23 address: 140737219953968
mir_window_spec_set_pointer_confinement
XXXXX MirProtobufRpcChannel::call_method [sending...] method_name:modify_surface
XXXXX PendingCallCache::save_completion_details [sending...] id: 25 address: 140737219953968
XXXXX PendingCallCache::populate_message_for_result [receiving...] id: 24 address: 6416816
XXXXX MirProtobufRpcChannel::call_method [sending...] method_name:disconnect
XXXXX PendingCallCache::save_completion_details [sending...] id: 26 address: 6417056
XXXXX PendingCallCache::populate_message_for_result [receiving...] id: 25 address: 140737219953968

From logs I see such flow of communication client-server:
       client server
    ...
   | modify_surface id:23 |
          |----------------------------->|
          | release_surface id:24 |
    |----------------------------->|
          |populate_messag(RES for id:23)|
          |<-----------------------------|
          | (release_surface with id:24 processing)
          | (Cleanup internal server's resources for surface)
          | modify_surface id:25 |
          |----------------------------->|
          |populate_messag(RES for id:24)|
          |<-----------------------------|
   | (modify_surface with id:25 processing)
          | (Server create resp with error code)
          | |
 (release_surface with id:24 processing) |
 (Cleanup internal client's resources for surface)
 (But PendingCallCache map is not cleaned)
 (PendingCallCache[25] still contains pointer to deleted structure)
          | |
          |populate_messag(RES for id:25)|
          |<-----------------------------|
  (PendingCallCache[25]->ParseFromString())
  (Client crash!)

Changed in canonical-devices-system-image:
status: New → Confirmed
Changed in mir:
status: New → Confirmed
Revision history for this message
Brandon Schaefer (brandontschaefer) wrote :

a mir::protobuf::Void extends from the MessageLite.

The overall issue seems to be a threaded one. Right now in the SDL mir port when we get an event it normally just adds and event to its own internal queue (need to double check that as well though really).

The issue is with pointer confinement now when we get a window focus event we set the keyboard focused which ends up asking the window to grab the pointer. This happens on the event callback thread. At the sametime its asking the surface to modify its contents its being released during a mir_connection_release_sync. Hence the corrupted looking state, it actually throws the error message that it cannot find the surface while trying to modify a surface during a connection release.

The fix is in SDL2. Though not sure if Mir could handle this error better.

Changed in mir:
status: Confirmed → Invalid
Revision history for this message
Brandon Schaefer (brandontschaefer) wrote :

To test you can comment out either the SetKeyboadFocus in SDL_mirevents.c or avoid setting pointer confinement in SDL_mirwindow.c.

Ill ask RAOF about is FD event reader, as would be best to move to that API then using an internal event queue with mutex/cond. Will try to get a fix soon!

Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Duplicate of bug 1194384 then?

Changed in canonical-devices-system-image:
status: Confirmed → Incomplete
milestone: u8c-1 → u8c-2
Stephen M. Webb (bregma)
Changed in mir:
milestone: 1.0.0 → none
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Not invalid for Mir. On second thoughts I'm not convinced that any SDL toolkit bug should ever be able to crash in Mir like this. Mir should stop such crashes from occurring regardless.

Changed in mir:
status: Invalid → New
Changed in canonical-devices-system-image:
status: Incomplete → New
Revision history for this message
Michał Sawicz (saviq) wrote :

Syncing task from Mir.

Changed in mir (Ubuntu):
importance: Undecided → High
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.