Skip to content

Commit 4468712

Browse files
committed
WL#15524 Patch #2 TLS-safe upgrade of mgm socket to transporter
This changes TransporterRegistry::connect_ndb_mgmd() to return NdbSocket rather than ndb_socket_t. Back-ported from mysql-trunk. Change-Id: Ic3b9ccf39ec78ed25705a4bbbdc5ac2953a35611
1 parent 27b4ea7 commit 4468712

File tree

10 files changed

+49
-52
lines changed

10 files changed

+49
-52
lines changed

storage/ndb/include/transporter/TransporterRegistry.hpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -261,26 +261,20 @@ class TransporterRegistry
261261
bool& close_with_reset,
262262
bool& log_failure);
263263

264-
bool connect_server(ndb_socket_t sockfd, BaseString & msg,
265-
bool & close_with_reset, bool & log_failure) {
266-
NdbSocket sock(sockfd, NdbSocket::From::Existing);
267-
return connect_server(sock, msg, close_with_reset, log_failure);
268-
}
269-
270264
bool connect_client(NdbMgmHandle *h);
271265

272266
/**
273267
* Given a hostname and port, creates a NdbMgmHandle, turns it into
274268
* a transporter, and returns the socket.
275269
*/
276-
ndb_socket_t connect_ndb_mgmd(const char* server_name,
277-
unsigned short server_port);
270+
NdbSocket connect_ndb_mgmd(const char* server_name,
271+
unsigned short server_port);
278272

279273
/**
280274
* Given a connected NdbMgmHandle, turns it into a transporter
281275
* and returns the socket.
282276
*/
283-
ndb_socket_t connect_ndb_mgmd(NdbMgmHandle *h);
277+
NdbSocket connect_ndb_mgmd(NdbMgmHandle *h);
284278

285279
/**
286280
* Manage allTransporters and theNodeIdTransporters when using

storage/ndb/src/common/transporter/Transporter.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,11 +259,20 @@ Transporter::connect_server(NdbSocket & sockfd,
259259
}
260260

261261

262+
bool
263+
Transporter::connect_client_mgm(int port)
264+
{
265+
require(!isPartOfMultiTransporter());
266+
NdbSocket secureSocket =
267+
m_transporter_registry.connect_ndb_mgmd(remoteHostName, port);
268+
return connect_client(secureSocket);
269+
}
270+
271+
262272
bool
263273
Transporter::connect_client()
264274
{
265275
NdbSocket secureSocket;
266-
ndb_socket_t sockfd;
267276
DBUG_ENTER("Transporter::connect_client");
268277

269278
require(!isMultiTransporter());
@@ -284,9 +293,7 @@ Transporter::connect_client()
284293

285294
if(isMgmConnection)
286295
{
287-
require(!isPartOfMultiTransporter());
288-
sockfd= m_transporter_registry.connect_ndb_mgmd(remoteHostName, port);
289-
secureSocket.init_from_new(sockfd);
296+
return connect_client_mgm(port);
290297
}
291298
else
292299
{

storage/ndb/src/common/transporter/Transporter.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ class Transporter {
132132
NdbSocket socket(fd, NdbSocket::From::Existing);
133133
return connect_client(socket);
134134
}
135+
bool connect_client_mgm(int);
135136
bool connect_server(NdbSocket & socket, BaseString& errormsg);
136137

137138
/**

storage/ndb/src/common/transporter/TransporterRegistry.cpp

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3724,7 +3724,8 @@ bool TransporterRegistry::connect_client(NdbMgmHandle *h)
37243724
}
37253725
require(!t->isMultiTransporter());
37263726
require(!t->isPartOfMultiTransporter());
3727-
bool res = t->connect_client(connect_ndb_mgmd(h));
3727+
NdbSocket secureSocket = connect_ndb_mgmd(h);
3728+
bool res = t->connect_client(secureSocket);
37283729
if (res == true)
37293730
{
37303731
DEBUG_FPRINTF((stderr, "(%u)performStates[%u] = DISCONNECTING,"
@@ -3776,55 +3777,52 @@ bool TransporterRegistry::report_dynamic_ports(NdbMgmHandle h) const
37763777
* Given a connected NdbMgmHandle, turns it into a transporter
37773778
* and returns the socket.
37783779
*/
3779-
ndb_socket_t TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle *h)
3780+
NdbSocket TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle *h)
37803781
{
3781-
ndb_socket_t sockfd;
3782-
37833782
DBUG_ENTER("TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle)");
37843783

37853784
if ( h==nullptr || *h == nullptr )
37863785
{
37873786
g_eventLogger->error("Mgm handle is NULL (%s:%d)", __FILE__, __LINE__);
3788-
DBUG_RETURN(sockfd);
3787+
DBUG_RETURN(NdbSocket{}); // an invalid socket, newly created on the stack
37893788
}
37903789

37913790
if (!report_dynamic_ports(*h))
37923791
{
37933792
ndb_mgm_destroy_handle(h);
3794-
DBUG_RETURN(sockfd);
3793+
DBUG_RETURN(NdbSocket{}); // an invalid socket, newly created on the stack
37953794
}
37963795

37973796
/**
37983797
* convert_to_transporter also disposes of the handle (i.e. we don't leak
3799-
* memory here.
3798+
* memory here).
38003799
*/
38013800
DBUG_PRINT("info", ("Converting handle to transporter"));
3802-
sockfd= ndb_mgm_convert_to_transporter(h);
3803-
if (!ndb_socket_valid(sockfd))
3801+
NdbSocket socket = ndb_mgm_convert_to_transporter(h);
3802+
if (! socket.is_valid())
38043803
{
38053804
g_eventLogger->error("Failed to convert to transporter (%s: %d)",
38063805
__FILE__, __LINE__);
38073806
ndb_mgm_destroy_handle(h);
38083807
}
3809-
DBUG_RETURN(sockfd);
3808+
DBUG_RETURN(socket);
38103809
}
38113810

38123811
/**
38133812
* Given a SocketClient, creates a NdbMgmHandle, turns it into a transporter
38143813
* and returns the socket.
38153814
*/
3816-
ndb_socket_t
3815+
NdbSocket
38173816
TransporterRegistry::connect_ndb_mgmd(const char* server_name,
38183817
unsigned short server_port)
38193818
{
38203819
NdbMgmHandle h= ndb_mgm_create_handle();
3821-
ndb_socket_t s;
38223820

38233821
DBUG_ENTER("TransporterRegistry::connect_ndb_mgmd(SocketClient)");
38243822

38253823
if ( h == nullptr )
38263824
{
3827-
DBUG_RETURN(s);
3825+
DBUG_RETURN(NdbSocket());
38283826
}
38293827

38303828
/**
@@ -3845,7 +3843,7 @@ TransporterRegistry::connect_ndb_mgmd(const char* server_name,
38453843
{
38463844
DBUG_PRINT("info", ("connection to mgmd failed"));
38473845
ndb_mgm_destroy_handle(&h);
3848-
DBUG_RETURN(s);
3846+
DBUG_RETURN(NdbSocket());
38493847
}
38503848

38513849
DBUG_RETURN(connect_ndb_mgmd(&h));

storage/ndb/src/mgmapi/mgmapi.cpp

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3631,43 +3631,36 @@ ndb_mgm_get_connection_int_parameter(NdbMgmHandle handle,
36313631
DBUG_RETURN(res);
36323632
}
36333633

3634-
ndb_socket_t
3634+
NdbSocket
36353635
ndb_mgm_convert_to_transporter(NdbMgmHandle *handle)
36363636
{
3637-
DBUG_ENTER("ndb_mgm_convert_to_transporter");
3638-
ndb_socket_t s;
3639-
36403637
if(handle == nullptr)
36413638
{
36423639
SET_ERROR(*handle, NDB_MGM_ILLEGAL_SERVER_HANDLE, "");
3643-
ndb_socket_invalidate(&s);
3644-
DBUG_RETURN(s);
3640+
return {};
36453641
}
36463642

36473643
if ((*handle)->connected != 1)
36483644
{
36493645
SET_ERROR(*handle, NDB_MGM_SERVER_NOT_CONNECTED , "");
3650-
ndb_socket_invalidate(&s);
3651-
DBUG_RETURN(s);
3646+
return {};
36523647
}
36533648

3649+
// FIXME: Decide whether to keep this
36543650
if ((*handle)->socket.has_tls())
36553651
{
36563652
SET_ERROR(*handle, NDB_MGM_CANNOT_CONVERT_TO_TRANSPORTER, "");
3657-
ndb_socket_invalidate(&s);
3658-
DBUG_RETURN(s);
3653+
return {};
36593654
}
36603655

3661-
(*handle)->connected= 0; // we pretend we're disconnected
3662-
s= (*handle)->socket.ndb_socket();
3663-
3664-
SocketOutputStream s_output(s, (*handle)->timeout);
3656+
NdbSocket s = std::move((*handle)->socket);
3657+
SecureSocketOutputStream s_output(s, (*handle)->timeout);
36653658
s_output.println("transporter connect");
36663659
s_output.println("%s", "");
36673660

3661+
(*handle)->connected= 0; // The handle no longer owns the connection
36683662
ndb_mgm_destroy_handle(handle); // set connected=0, so won't disconnect
3669-
3670-
DBUG_RETURN(s);
3663+
return s;
36713664
}
36723665

36733666
extern "C"

storage/ndb/src/mgmapi/mgmapi_internal.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#define MGMAPI_INTERNAL_H
2727

2828
#include "portlib/ndb_socket.h"
29+
#include "util/NdbSocket.h"
2930

3031

3132
/**
@@ -86,11 +87,10 @@ int ndb_mgm_get_connection_int_parameter(NdbMgmHandle handle,
8687
* Convert connection to transporter
8788
* @param handle NDB management handle.
8889
*
89-
* @return socket
90-
*
9190
* @note the socket is now able to be used as a transporter connection
91+
* @note the management handle is no longer valid after this call
9292
*/
93-
ndb_socket_t ndb_mgm_convert_to_transporter(NdbMgmHandle *handle);
93+
NdbSocket ndb_mgm_convert_to_transporter(NdbMgmHandle *handle);
9494

9595
int ndb_mgm_disconnect_quiet(NdbMgmHandle handle);
9696

storage/ndb/src/mgmsrv/MgmtSrvr.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5123,14 +5123,14 @@ MgmtSrvr::getConnectionDbParameter(int node1, int node2,
51235123

51245124

51255125
bool
5126-
MgmtSrvr::transporter_connect(ndb_socket_t sockfd,
5126+
MgmtSrvr::transporter_connect(NdbSocket & socket,
51275127
BaseString& msg,
51285128
bool& close_with_reset,
51295129
bool& log_failure)
51305130
{
51315131
DBUG_ENTER("MgmtSrvr::transporter_connect");
51325132
TransporterRegistry* tr= theFacade->get_registry();
5133-
if (!tr->connect_server(sockfd, msg, close_with_reset, log_failure))
5133+
if (!tr->connect_server(socket, msg, close_with_reset, log_failure))
51345134
DBUG_RETURN(false);
51355135

51365136
/**

storage/ndb/src/mgmsrv/MgmtSrvr.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ class MgmtSrvr : private ConfigSubscriber, public trp_client {
356356
int getConnectionDbParameter(int node1, int node2, int param,
357357
int *value, BaseString& msg);
358358

359-
bool transporter_connect(ndb_socket_t sockfd,
359+
bool transporter_connect(NdbSocket & socket,
360360
BaseString& errormsg,
361361
bool& close_with_reset,
362362
bool& log_failure);

storage/ndb/src/mgmsrv/Services.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1895,8 +1895,8 @@ MgmApiSession::transporter_connect(Parser_t::Context &ctx,
18951895
bool close_with_reset = true;
18961896
bool log_failure = false;
18971897
BaseString errormsg;
1898-
if (!m_mgmsrv.transporter_connect(m_secure_socket.ndb_socket(), errormsg,
1899-
close_with_reset, log_failure))
1898+
if (!m_mgmsrv.transporter_connect(m_secure_socket,
1899+
errormsg, close_with_reset, log_failure))
19001900
{
19011901
// Connection not allowed or failed
19021902
if (log_failure)
@@ -1918,7 +1918,7 @@ MgmApiSession::transporter_connect(Parser_t::Context &ctx,
19181918
but don't close the socket, it's been taken over
19191919
by the transporter
19201920
*/
1921-
m_secure_socket.invalidate(); // so nobody closes it
1921+
NdbSocket s = std::move(m_secure_socket);
19221922
}
19231923

19241924
m_stop= true; // Stop the session

storage/ndb/test/include/NdbMgmd.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ class NdbMgmd {
105105
return m_handle;
106106
}
107107

108+
NdbSocket convert_to_transporter() {
109+
return ndb_mgm_convert_to_transporter(& m_handle);
110+
}
111+
108112
ndb_socket_t socket(void) const {
109113
return _ndb_mgm_get_socket(m_handle);
110114
}

0 commit comments

Comments
 (0)