Avoid crashing Flipper SDK on request for unsupported plugins
Summary: in FlipperRSocketResponder::handleFireAndForget, a responder object was being conditionally (for requests with an "id" field) created, resulting in a null pointer passed into FlipperClient::onMessageReceived when no id was present. FlipperClient::onMessage received, in the meantime, unconditionally dereferences that pointer, resulting in a segmentation fault. This change creates the responder object regardless of whether or not the "id" key is present in the request object, thus avoiding passing a null pointer into FlipperClient::onMessageReceived. Reviewed By: jknoxville Differential Revision: D18583898 fbshipit-source-id: 2112c45bc0cd639cec908d0039d6bdaed2f61491
This commit is contained in:
committed by
Facebook Github Bot
parent
2854b57c74
commit
cb3b77bc95
@@ -7,6 +7,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Flipper/FireAndForgetBasedFlipperResponder.h>
|
||||
#include <Flipper/FlipperConnectionManager.h>
|
||||
|
||||
namespace facebook {
|
||||
@@ -43,7 +44,17 @@ class FlipperConnectionManagerMock : public FlipperConnectionManager {
|
||||
const folly::dynamic& message,
|
||||
std::unique_ptr<FlipperResponder> responder) override {
|
||||
if (responder) {
|
||||
respondersReceived++;
|
||||
const FireAndForgetBasedFlipperResponder* const r =
|
||||
dynamic_cast<FireAndForgetBasedFlipperResponder*>(responder.get());
|
||||
if (r) {
|
||||
if (r->hasId()) {
|
||||
++respondersWithIdReceived;
|
||||
} else {
|
||||
++respondersWithoutIdReceived;
|
||||
}
|
||||
} else {
|
||||
++respondersWithIdReceived;
|
||||
}
|
||||
}
|
||||
callbacks->onMessageReceived(message, std::move(responder));
|
||||
messagesReceived.push_back(message);
|
||||
@@ -58,7 +69,8 @@ class FlipperConnectionManagerMock : public FlipperConnectionManager {
|
||||
Callbacks* callbacks;
|
||||
std::vector<folly::dynamic> messages;
|
||||
std::vector<folly::dynamic> messagesReceived;
|
||||
int respondersReceived = 0;
|
||||
int respondersWithIdReceived = 0;
|
||||
int respondersWithoutIdReceived = 0;
|
||||
};
|
||||
|
||||
} // namespace test
|
||||
|
||||
Reference in New Issue
Block a user