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,9 +7,9 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "FlipperResponder.h"
|
||||
#include "FlipperConnectionManager.h"
|
||||
#include <folly/json.h>
|
||||
#include "FlipperConnectionManager.h"
|
||||
#include "FlipperResponder.h"
|
||||
|
||||
namespace facebook {
|
||||
namespace flipper {
|
||||
@@ -26,23 +26,33 @@ class FireAndForgetBasedFlipperResponder : public FlipperResponder {
|
||||
FireAndForgetBasedFlipperResponder(
|
||||
FlipperConnectionManager* socket,
|
||||
int64_t responseID)
|
||||
: socket_(socket), responseID_(responseID) {}
|
||||
: socket_(socket), responseID_(responseID), idValid_(true) {}
|
||||
|
||||
FireAndForgetBasedFlipperResponder(FlipperConnectionManager* socket)
|
||||
: socket_(socket), idValid_(false) {}
|
||||
|
||||
void success(const folly::dynamic& response) override {
|
||||
const folly::dynamic message =
|
||||
folly::dynamic::object("id", responseID_)("success", response);
|
||||
const folly::dynamic message = idValid_
|
||||
? folly::dynamic::object("id", responseID_)("success", response)
|
||||
: folly::dynamic::object("success", response);
|
||||
socket_->sendMessage(message);
|
||||
}
|
||||
|
||||
void error(const folly::dynamic& response) override {
|
||||
const folly::dynamic message =
|
||||
folly::dynamic::object("id", responseID_)("error", response);
|
||||
const folly::dynamic message = idValid_
|
||||
? folly::dynamic::object("id", responseID_)("error", response)
|
||||
: folly::dynamic::object("error", response);
|
||||
socket_->sendMessage(message);
|
||||
}
|
||||
|
||||
bool hasId() const {
|
||||
return idValid_;
|
||||
}
|
||||
|
||||
private:
|
||||
FlipperConnectionManager* socket_;
|
||||
int64_t responseID_;
|
||||
bool idValid_;
|
||||
};
|
||||
|
||||
} // namespace flipper
|
||||
|
||||
Reference in New Issue
Block a user