diff options
-rw-r--r-- | ipmid-new.cpp | 59 |
1 files changed, 36 insertions, 23 deletions
diff --git a/ipmid-new.cpp b/ipmid-new.cpp index 5eec4d1..7e77b12 100644 --- a/ipmid-new.cpp +++ b/ipmid-new.cpp @@ -739,29 +739,42 @@ Router* mutableRouter() /* legacy alternative to executionEntry */ void handleLegacyIpmiCommand(sdbusplus::message::message& m) { - unsigned char seq, netFn, lun, cmd; - std::vector<uint8_t> data; - - m.read(seq, netFn, lun, cmd, data); - - auto ctx = std::make_shared<ipmi::Context>(netFn, cmd, 0, 0, - ipmi::Privilege::Admin); - auto request = std::make_shared<ipmi::message::Request>( - ctx, std::forward<std::vector<uint8_t>>(data)); - ipmi::message::Response::ptr response = ipmi::executeIpmiCommand(request); - - // Responses in IPMI require a bit set. So there ya go... - netFn |= 0x01; - - const char *dest, *path; - constexpr const char* DBUS_INTF = "org.openbmc.HostIpmi"; - - dest = m.get_sender(); - path = m.get_path(); - getSdBus()->async_method_call([](boost::system::error_code ec) {}, dest, - path, DBUS_INTF, "sendMessage", seq, netFn, - lun, cmd, response->cc, - response->payload.raw); + // make a copy so the next two moves don't wreak havoc on the stack + sdbusplus::message::message b{m}; + boost::asio::spawn(*getIoContext(), [b = std::move(b)]( + boost::asio::yield_context yield) { + sdbusplus::message::message m{std::move(b)}; + unsigned char seq, netFn, lun, cmd; + std::vector<uint8_t> data; + + m.read(seq, netFn, lun, cmd, data); + auto ctx = std::make_shared<ipmi::Context>( + netFn, cmd, 0, 0, ipmi::Privilege::Admin, 0, &yield); + auto request = std::make_shared<ipmi::message::Request>( + ctx, std::forward<std::vector<uint8_t>>(data)); + ipmi::message::Response::ptr response = + ipmi::executeIpmiCommand(request); + + // Responses in IPMI require a bit set. So there ya go... + netFn |= 0x01; + + const char *dest, *path; + constexpr const char* DBUS_INTF = "org.openbmc.HostIpmi"; + + dest = m.get_sender(); + path = m.get_path(); + boost::system::error_code ec; + getSdBus()->yield_method_call(yield, ec, dest, path, DBUS_INTF, + "sendMessage", seq, netFn, lun, cmd, + response->cc, response->payload.raw); + if (ec) + { + log<level::ERR>("Failed to send response to requestor", + entry("ERROR=%s", ec.message().c_str()), + entry("SENDER=%s", dest), + entry("NETFN=0x%X", netFn), entry("CMD=0x%X", cmd)); + } + }); } #endif /* ALLOW_DEPRECATED_API */ |