Skip to content

Commit 5200928

Browse files
mdkofacebook-github-bot
authored andcommitted
Back out "Use weak_ptr for holding operation during certificate validation"
Summary: Original commit changeset: f592b3ba0419 Original Phabricator Diff: D66730727 --- The following ran on D66730727 and failed: https://www.internalfb.com/intern/hhvm/automator/workflows/205817/ The following ran on **parent** of D66730727 and it succeeded: https://www.internalfb.com/intern/hhvm/automator/workflows/205818/ Reviewed By: jtwarren Differential Revision: D67992747 fbshipit-source-id: e58876849b730a7c39745f0edd5d536bf8285672
1 parent 77b209b commit 5200928

File tree

7 files changed

+57
-53
lines changed

7 files changed

+57
-53
lines changed

hphp/runtime/ext/async_mysql/ext_async_mysql.cpp

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ static std::shared_ptr<am::AsyncMysqlClient> getClient() {
166166
static std::vector<std::string> certLoggingImpl(
167167
X509* cert,
168168
const std::vector<std::string>& extNames,
169-
const am::Operation& op,
169+
am::ConnectOperation& op,
170170
bool validated) {
171171
// Capture the certificare Common Name
172172
std::string cn =
@@ -217,13 +217,12 @@ static bool certValidationImpl(
217217

218218
static bool serverCertLoggingCallback(
219219
X509* server_cert,
220-
const std::weak_ptr<am::Operation>& wptr,
220+
const void* context,
221221
folly::StringPiece& /*errMsg*/,
222222
const std::vector<std::string>& extNames) {
223-
auto op = wptr.lock();
224-
if (!op) {
225-
return false;
226-
}
223+
am::ConnectOperation* op = reinterpret_cast<am::ConnectOperation*>(
224+
const_cast<void*>(context));
225+
CHECK(op);
227226

228227
// Log the server cert content
229228
certLoggingImpl(server_cert, extNames, *op, false);
@@ -233,41 +232,38 @@ static bool serverCertLoggingCallback(
233232

234233
static bool serverCertValidationCallback(
235234
X509* server_cert,
236-
const std::weak_ptr<am::Operation>& wptr,
235+
const void* context,
237236
folly::StringPiece& /* errMsg */,
238237
const std::vector<std::string>& extNames,
239238
const std::vector<std::string>& extValues) {
240-
auto op = wptr.lock();
241-
if (!op) {
242-
return false;
243-
}
239+
facebook::common::mysql_client::ConnectOperation* op =
240+
reinterpret_cast<facebook::common::mysql_client::ConnectOperation*>(
241+
const_cast<void*>(context));
242+
CHECK(op);
244243

245244
// Log the server cert content
246245
auto certValues = certLoggingImpl(server_cert, extNames, *op, true);
247246
return certValidationImpl(extValues, certValues);
248247
}
249248

250-
static am::CertValidatorCallback generateCertValidationCallback(
249+
static facebook::common::mysql_client::CertValidatorCallback
250+
generateCertValidationCallback(
251251
const std::string& serverCertExtNames,
252252
const std::string& extensionValues) {
253253
std::vector<std::string> extNames;
254254
folly::split(',', serverCertExtNames, extNames);
255255
if (extensionValues.empty()) {
256256
return [extNames = std::move(extNames)] (
257-
X509* server_cert,
258-
const std::weak_ptr<am::Operation>& wptr,
259-
folly::StringPiece& errMsg) {
260-
return serverCertLoggingCallback(server_cert, wptr, errMsg, extNames);
257+
X509* server_cert, const void* context, folly::StringPiece& errMsg) {
258+
return serverCertLoggingCallback(server_cert, context, errMsg, extNames);
261259
};
262260
} else {
263261
std::vector<std::string> extValues;
264262
folly::split(',', extensionValues, extValues);
265263
return [extNames = std::move(extNames), extValues = std::move(extValues)] (
266-
X509* server_cert,
267-
const std::weak_ptr<am::Operation>& wptr,
268-
folly::StringPiece& errMsg) {
264+
X509* server_cert, const void* context, folly::StringPiece& errMsg) {
269265
return serverCertValidationCallback(
270-
server_cert, wptr, errMsg, extNames, extValues);
266+
server_cert, context, errMsg, extNames, extValues);
271267
};
272268
}
273269
}
@@ -493,7 +489,8 @@ HHVM_METHOD(AsyncMysqlConnectionOptions,
493489
data->m_conn_opts.setCertValidationCallback(
494490
generateCertValidationCallback(
495491
std::string(serverCertExtNames), std::string(extensionValues)),
496-
{} /* empty weak_ptr<Operation> */);
492+
nullptr,
493+
true);
497494
#endif
498495
}
499496

@@ -682,7 +679,8 @@ Object HHVM_STATIC_METHOD(
682679
op->setCertValidationCallback(
683680
generateCertValidationCallback(
684681
std::string(serverCertExtNames), std::string(serverCertExtValues)),
685-
{} /* empty weak_ptr<Operation> */);
682+
nullptr,
683+
true);
686684
}
687685

688686
return newAsyncMysqlConnectEvent(std::move(op), getClient());
@@ -882,7 +880,8 @@ static Object HHVM_METHOD(
882880
op->setCertValidationCallback(
883881
generateCertValidationCallback(
884882
std::string(serverCertExtNames), std::string(serverCertExtValues)),
885-
{} /* empty weak_ptr<Operation> */);
883+
nullptr,
884+
true);
886885
}
887886

888887
return newAsyncMysqlConnectEvent(

third-party/squangle/src/squangle/mysql_client/ConnectOperation.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ void ConnectOperationImpl::setConnectionOptions(
4747
if (conn_opts.getCertValidationCallback()) {
4848
setCertValidationCallback(
4949
conn_opts.getCertValidationCallback(),
50-
conn_opts.getCertValidationContext());
50+
conn_opts.getCertValidationContext(),
51+
conn_opts.isOpPtrAsValidationContext());
5152
}
5253
if (auto cats = conn_opts.getCryptoAuthTokenList()) {
5354
setCryptoAuthTokenList(std::move(*cats));
@@ -84,10 +85,12 @@ void ConnectOperationImpl::enableChangeUser() {
8485

8586
void ConnectOperationImpl::setCertValidationCallback(
8687
CertValidatorCallback callback,
87-
std::weak_ptr<Operation> wptr) {
88+
const void* context,
89+
bool opPtrAsContext) {
8890
CHECK_THROW(
8991
state() == OperationState::Unstarted, db::OperationStateException);
90-
conn_options_.setCertValidationCallback(std::move(callback), std::move(wptr));
92+
conn_options_.setCertValidationCallback(
93+
std::move(callback), context, opPtrAsContext);
9194
}
9295

9396
void ConnectOperationImpl::setTimeout(Duration timeout) {

third-party/squangle/src/squangle/mysql_client/ConnectOperation.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ class ConnectOperationImpl : virtual public OperationBase {
6565

6666
void setCertValidationCallback(
6767
CertValidatorCallback callback,
68-
std::weak_ptr<Operation> wptr);
68+
const void* context = nullptr,
69+
bool opPtrAsContext = false);
6970

7071
const CertValidatorCallback& getCertValidationCallback() const {
7172
return conn_options_.getCertValidationCallback();
@@ -272,8 +273,10 @@ class ConnectOperation : public Operation {
272273
}
273274
ConnectOperation& setCertValidationCallback(
274275
CertValidatorCallback callback,
275-
std::weak_ptr<Operation> wptr) {
276-
impl()->setCertValidationCallback(std::move(callback), std::move(wptr));
276+
const void* context = nullptr,
277+
bool opPtrAsContext = false) {
278+
impl()->setCertValidationCallback(
279+
std::move(callback), context, opPtrAsContext);
277280
return *this;
278281
}
279282

@@ -295,7 +298,7 @@ class ConnectOperation : public Operation {
295298
const std::string& sslCertCn,
296299
const std::vector<std::string>& sslCertSan,
297300
const std::vector<std::string>& sslCertIdentities,
298-
bool isValidated) const override {
301+
bool isValidated) {
299302
// Make sure we have an impl - it is possible to not have one.
300303
if (auto* implPtr = impl()) {
301304
implPtr->withOptionalConnectionContext([&](auto& ctx) {

third-party/squangle/src/squangle/mysql_client/ConnectionOptions.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
namespace facebook::common::mysql_client {
1818

19-
class Operation;
20-
2119
ConnectionOptions::ConnectionOptions()
2220
: connection_timeout_(FLAGS_async_mysql_connect_timeout_micros),
2321
total_timeout_(FLAGS_async_mysql_timeout_micros * 2),
@@ -79,9 +77,11 @@ ConnectionOptions& ConnectionOptions::setDscp(uint8_t dscp) {
7977

8078
ConnectionOptions& ConnectionOptions::setCertValidationCallback(
8179
CertValidatorCallback callback,
82-
std::weak_ptr<Operation> wptr) noexcept {
80+
const void* context,
81+
bool opPtrAsContext) noexcept {
8382
certValidationCallback_ = std::move(callback);
84-
certValidationWeakPtr_ = std::move(wptr);
83+
opPtrAsCertValidationContext_ = opPtrAsContext;
84+
certValidationContext_ = opPtrAsCertValidationContext_ ? nullptr : context;
8585
return *this;
8686
}
8787

third-party/squangle/src/squangle/mysql_client/ConnectionOptions.h

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,10 @@
1515

1616
namespace facebook::common::mysql_client {
1717

18-
class Operation;
1918
class SSLOptionsProviderBase;
2019

21-
using CertValidatorCallback = std::function<bool(
22-
X509* server_cert,
23-
const std::weak_ptr<Operation>& context,
24-
folly::StringPiece& errMsg)>;
20+
using CertValidatorCallback = std::function<
21+
bool(X509* server_cert, const void* context, folly::StringPiece& errMsg)>;
2522

2623
class ConnectionOptions {
2724
public:
@@ -195,14 +192,19 @@ class ConnectionOptions {
195192

196193
ConnectionOptions& setCertValidationCallback(
197194
CertValidatorCallback callback,
198-
std::weak_ptr<Operation> wptr) noexcept;
195+
const void* context,
196+
bool opPtrAsContext) noexcept;
199197

200198
const CertValidatorCallback& getCertValidationCallback() const noexcept {
201199
return certValidationCallback_;
202200
}
203201

204-
const std::weak_ptr<Operation>& getCertValidationContext() const noexcept {
205-
return certValidationWeakPtr_;
202+
const void* getCertValidationContext() const noexcept {
203+
return certValidationContext_;
204+
}
205+
206+
bool isOpPtrAsValidationContext() const noexcept {
207+
return opPtrAsCertValidationContext_;
206208
}
207209

208210
ConnectionOptions& setCryptoAuthTokenList(const std::string& tokenList) {
@@ -231,7 +233,8 @@ class ConnectionOptions {
231233
bool delayed_reset_conn_ = false;
232234
bool change_user_ = false;
233235
CertValidatorCallback certValidationCallback_{nullptr};
234-
std::weak_ptr<Operation> certValidationWeakPtr_;
236+
const void* certValidationContext_{nullptr};
237+
bool opPtrAsCertValidationContext_{false};
235238
};
236239

237240
} // namespace facebook::common::mysql_client

third-party/squangle/src/squangle/mysql_client/Operation.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ class OperationBase {
235235
return connection_context_.get();
236236
}
237237
void withOptionalConnectionContext(
238-
std::function<void(db::ConnectionContextBase&)> func) const {
238+
std::function<void(db::ConnectionContextBase&)> func) {
239239
if (connection_context_) {
240240
func(*connection_context_);
241241
}
@@ -623,12 +623,6 @@ class Operation : public std::enable_shared_from_this<Operation> {
623623
return impl()->endTime();
624624
}
625625

626-
virtual void reportServerCertContent(
627-
const std::string& /*sslCertCn*/,
628-
const std::vector<std::string>& /*sslCertSan*/,
629-
const std::vector<std::string>& /*sslCertIdentities*/,
630-
bool /*isValidated*/) const {}
631-
632626
static folly::StringPiece toString(OperationState state);
633627
static folly::StringPiece toString(OperationResult result);
634628
static folly::StringPiece toString(StreamState state);

third-party/squangle/src/squangle/mysql_client/mysql_protocol/MysqlConnectOperationImpl.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -373,13 +373,15 @@ int MysqlConnectOperationImpl::mysqlCertValidator(
373373
const CertValidatorCallback callback =
374374
self->getConnectionOptions().getCertValidationCallback();
375375
CHECK(callback);
376-
const auto& wptrOperation =
377-
self->getConnectionOptions().getCertValidationContext();
376+
const void* callbackContext =
377+
self->getConnectionOptions().isOpPtrAsValidationContext()
378+
? self
379+
: self->getConnectionOptions().getCertValidationContext();
378380
folly::StringPiece errorMessage;
379381

380382
// "libmysql" expects this callback to return "0" if the cert validation was
381383
// successful, and return "1" if validation failed.
382-
int result = callback(server_cert, wptrOperation, errorMessage) ? 0 : 1;
384+
int result = callback(server_cert, callbackContext, errorMessage) ? 0 : 1;
383385
if (!errorMessage.empty()) {
384386
*errptr = errorMessage.data();
385387
}

0 commit comments

Comments
 (0)