Commit f2aa4bcd authored by unknown's avatar unknown
Browse files

Bug #9249 NDBD crashes when mapping SHM segment w/o correct permission


ndb/include/mgmapi/ndbd_exit_codes.h:
  Bug #9249  	NDBD crashes when mapping SHM segment w/o correct permission
  - added new exit code for connection setup failure
ndb/include/transporter/TransporterCallback.hpp:
  Bug #9249  	NDBD crashes when mapping SHM segment w/o correct permission
  - corrected transporter callback error codes to have consistant usage of 0x8000 flag for flagging call to do disconnect
ndb/src/common/transporter/SHM_Transporter.cpp:
  Bug #9249  	NDBD crashes when mapping SHM segment w/o correct permission
  - added error info to errors
ndb/src/common/transporter/SHM_Transporter.unix.cpp:
  Bug #9249  	NDBD crashes when mapping SHM segment w/o correct permission
  - added more error info to errors
ndb/src/common/transporter/Transporter.hpp:
  Bug #9249  	NDBD crashes when mapping SHM segment w/o correct permission
  - added more info to report error
ndb/src/kernel/blocks/qmgr/QmgrMain.cpp:
  Bug #9249  	NDBD crashes when mapping SHM segment w/o correct permission
  - added error reporting on connect failure
ndb/src/kernel/error/ndbd_exit_codes.c:
  Bug #9249  	NDBD crashes when mapping SHM segment w/o correct permission
  - new exit code
ndb/src/kernel/vm/FastScheduler.cpp:
  Bug #9249  	NDBD crashes when mapping SHM segment w/o correct permission
  - corrected stack overflow issues
ndb/src/kernel/vm/TransporterCallback.cpp:
  Bug #9249  	NDBD crashes when mapping SHM segment w/o correct permission
  - added error info
  - corrected stak overflow issues
ndb/src/kernel/vm/VMSignal.hpp:
  Bug #9249  	NDBD crashes when mapping SHM segment w/o correct permission
  - added struct to allocate smaller Signal
ndb/src/mgmsrv/ConfigInfo.cpp:
  Bug #9249  	NDBD crashes when mapping SHM segment w/o correct permission
  - enable usage of SHM default section
ndb/src/ndbapi/TransporterFacade.cpp:
  Bug #9249  	NDBD crashes when mapping SHM segment w/o correct permission
  - minor syntax changes
parent f6943edb
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -100,6 +100,7 @@ typedef ndbd_exit_classification_enum ndbd_exit_classification;
#define NDBD_EXIT_SIGNAL_LOST                 6051
#define NDBD_EXIT_SIGNAL_LOST_SEND_BUFFER_FULL 6052
#define NDBD_EXIT_ILLEGAL_SIGNAL              6053
#define NDBD_EXIT_CONNECTION_SETUP_FAILED     6054

/* NDBCNTR 6100-> */
#define NDBD_EXIT_RESTART_TIMEOUT             6100
+41 −31
Original line number Diff line number Diff line
@@ -82,6 +82,8 @@ void
reportDisconnect(void * callbackObj,
		 NodeId nodeId, Uint32 errNo); 

#define TE_DO_DISCONNECT 0x8000

enum TransporterError { 
  TE_NO_ERROR = 0,
  /** 
@@ -111,7 +113,7 @@ enum TransporterError {
   * 
   * Recommended behavior: setPerformState(PerformDisconnect) 
   */ 
  TE_INVALID_MESSAGE_LENGTH = 0x8003, 
  TE_INVALID_MESSAGE_LENGTH = 0x3 | TE_DO_DISCONNECT, 
   
  /** 
   * TE_INVALID_CHECKSUM 
@@ -120,7 +122,7 @@ enum TransporterError {
   * 
   * Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  TE_INVALID_CHECKSUM = 0x8004, 
  TE_INVALID_CHECKSUM = 0x4 | TE_DO_DISCONNECT, 
 
  /** 
   * TE_COULD_NOT_CREATE_SOCKET 
@@ -129,7 +131,7 @@ enum TransporterError {
   * 
   * Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  TE_COULD_NOT_CREATE_SOCKET = 0x8005, 
  TE_COULD_NOT_CREATE_SOCKET = 0x5, 
 
  /** 
   * TE_COULD_NOT_BIND_SOCKET 
@@ -138,7 +140,7 @@ enum TransporterError {
   * 
   * Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  TE_COULD_NOT_BIND_SOCKET = 0x8006, 
  TE_COULD_NOT_BIND_SOCKET = 0x6, 
 
  /** 
   * TE_LISTEN_FAILED 
@@ -147,7 +149,7 @@ enum TransporterError {
   * 
   * Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  TE_LISTEN_FAILED = 0x8007, 
  TE_LISTEN_FAILED = 0x7, 
 
  /** 
   * TE_ACCEPT_RETURN_ERROR 
@@ -158,7 +160,7 @@ enum TransporterError {
   * Recommended behavior: Ignore  
   *   (or possible do setPerformState(PerformDisconnect) 
   */ 
  TE_ACCEPT_RETURN_ERROR = 0x8008 
  TE_ACCEPT_RETURN_ERROR = 0x8 
 
  /** 
   * TE_SHM_DISCONNECT  
@@ -167,7 +169,7 @@ enum TransporterError {
   * 
   * Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  ,TE_SHM_DISCONNECT = 0x800b 
  ,TE_SHM_DISCONNECT = 0xb | TE_DO_DISCONNECT
 
  /** 
   * TE_SHM_IPC_STAT 
@@ -178,7 +180,12 @@ enum TransporterError {
   * 
   * Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  ,TE_SHM_IPC_STAT = 0x800c 
  ,TE_SHM_IPC_STAT = 0xc | TE_DO_DISCONNECT

  /**
   * Permanent error
   */
  ,TE_SHM_IPC_PERMANENT = 0x21 
 
  /** 
   * TE_SHM_UNABLE_TO_CREATE_SEGMENT 
@@ -188,7 +195,7 @@ enum TransporterError {
   * 
   * Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  ,TE_SHM_UNABLE_TO_CREATE_SEGMENT = 0x800d 
  ,TE_SHM_UNABLE_TO_CREATE_SEGMENT = 0xd 
 
  /** 
   * TE_SHM_UNABLE_TO_ATTACH_SEGMENT 
@@ -198,7 +205,7 @@ enum TransporterError {
   * 
   * Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  ,TE_SHM_UNABLE_TO_ATTACH_SEGMENT = 0x800e 
  ,TE_SHM_UNABLE_TO_ATTACH_SEGMENT = 0xe 
 
  /** 
   * TE_SHM_UNABLE_TO_REMOVE_SEGMENT 
@@ -208,12 +215,12 @@ enum TransporterError {
   * Recommended behavior: Ignore (not much to do) 
   *                       Print warning to logfile 
   */ 
  ,TE_SHM_UNABLE_TO_REMOVE_SEGMENT = 0x800f 
  ,TE_SHM_UNABLE_TO_REMOVE_SEGMENT = 0xf 
 
  ,TE_TOO_SMALL_SIGID = 0x0010 
  ,TE_TOO_LARGE_SIGID = 0x0011 
  ,TE_WAIT_STACK_FULL = 0x8012 
  ,TE_RECEIVE_BUFFER_FULL = 0x8013 
  ,TE_TOO_SMALL_SIGID = 0x10 
  ,TE_TOO_LARGE_SIGID = 0x11 
  ,TE_WAIT_STACK_FULL = 0x12 | TE_DO_DISCONNECT
  ,TE_RECEIVE_BUFFER_FULL = 0x13 | TE_DO_DISCONNECT
 
  /** 
   * TE_SIGNAL_LOST_SEND_BUFFER_FULL 
@@ -222,7 +229,7 @@ enum TransporterError {
   *   a signal is dropped!! very bad very bad 
   * 
   */ 
  ,TE_SIGNAL_LOST_SEND_BUFFER_FULL = 0x8014 
  ,TE_SIGNAL_LOST_SEND_BUFFER_FULL = 0x14 | TE_DO_DISCONNECT
 
  /** 
   * TE_SIGNAL_LOST 
@@ -231,14 +238,14 @@ enum TransporterError {
   *   a signal is dropped!! very bad very bad 
   * 
   */ 
  ,TE_SIGNAL_LOST = 0x8015 
  ,TE_SIGNAL_LOST = 0x15 
 
  /** 
   * TE_SEND_BUFFER_FULL 
   *  
   *   The send buffer was full, but sleeping for a while solved it 
   */ 
  ,TE_SEND_BUFFER_FULL = 0x0016 
  ,TE_SEND_BUFFER_FULL = 0x16 
 
  /** 
   * TE_SCI_UNABLE_TO_CLOSE_CHANNEL 
@@ -246,7 +253,7 @@ enum TransporterError {
   *  Unable to close the sci channel and the resources allocated by  
   *  the sisci api. 
   */ 
  ,TE_SCI_UNABLE_TO_CLOSE_CHANNEL = 0x8016 
  ,TE_SCI_UNABLE_TO_CLOSE_CHANNEL = 0x22 
 
  /** 
   * TE_SCI_LINK_ERROR 
@@ -255,7 +262,7 @@ enum TransporterError {
   *  No point in continuing. Must check the connections. 
   * Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  ,TE_SCI_LINK_ERROR = 0x8017 
  ,TE_SCI_LINK_ERROR = 0x0017 
 
  /** 
   * TE_SCI_UNABLE_TO_START_SEQUENCE 
@@ -264,14 +271,14 @@ enum TransporterError {
   *  are exumed or no sequence has been created. 
   *  Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  ,TE_SCI_UNABLE_TO_START_SEQUENCE = 0x8018 
  ,TE_SCI_UNABLE_TO_START_SEQUENCE = 0x18 | TE_DO_DISCONNECT
   
  /** 
   * TE_SCI_UNABLE_TO_REMOVE_SEQUENCE 
   *  
   *  Could not remove a sequence 
   */ 
  ,TE_SCI_UNABLE_TO_REMOVE_SEQUENCE = 0x8019 
  ,TE_SCI_UNABLE_TO_REMOVE_SEQUENCE = 0x19 | TE_DO_DISCONNECT
 
  /** 
   * TE_SCI_UNABLE_TO_CREATE_SEQUENCE 
@@ -280,7 +287,7 @@ enum TransporterError {
   *  exempted. Must reboot. 
   *  Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  ,TE_SCI_UNABLE_TO_CREATE_SEQUENCE = 0x801a 
  ,TE_SCI_UNABLE_TO_CREATE_SEQUENCE = 0x1a | TE_DO_DISCONNECT
 
  /** 
   * TE_SCI_UNRECOVERABLE_DATA_TFX_ERROR 
@@ -288,7 +295,7 @@ enum TransporterError {
   *  Tried to send data on redundant link but failed. 
   *  Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  ,TE_SCI_UNRECOVERABLE_DATA_TFX_ERROR = 0x801b 
  ,TE_SCI_UNRECOVERABLE_DATA_TFX_ERROR = 0x1b | TE_DO_DISCONNECT
 
  /** 
   * TE_SCI_CANNOT_INIT_LOCALSEGMENT 
@@ -297,7 +304,7 @@ enum TransporterError {
   *  gone wrong (no system resources). Must reboot. 
   *  Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  ,TE_SCI_CANNOT_INIT_LOCALSEGMENT = 0x801c 
  ,TE_SCI_CANNOT_INIT_LOCALSEGMENT = 0x1c | TE_DO_DISCONNECT
 
  /** 
   * TE_SCI_CANNOT_MAP_REMOTESEGMENT 
@@ -306,7 +313,7 @@ enum TransporterError {
   *  Must reboot system. 
   *  Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  ,TE_SCI_CANNOT_MAP_REMOTESEGMENT = 0x801d 
  ,TE_SCI_CANNOT_MAP_REMOTESEGMENT = 0x1d | TE_DO_DISCONNECT
 
   /** 
   * TE_SCI_UNABLE_TO_UNMAP_SEGMENT 
@@ -314,7 +321,7 @@ enum TransporterError {
   *  Cannot free the resources used by this segment (step 1). 
   *  Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  ,TE_SCI_UNABLE_TO_UNMAP_SEGMENT = 0x801e 
  ,TE_SCI_UNABLE_TO_UNMAP_SEGMENT = 0x1e | TE_DO_DISCONNECT
 
   /** 
   * TE_SCI_UNABLE_TO_REMOVE_SEGMENT 
@@ -324,7 +331,7 @@ enum TransporterError {
   *  to map more segment 
   *  Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  ,TE_SCI_UNABLE_TO_REMOVE_SEGMENT = 0x801f 
  ,TE_SCI_UNABLE_TO_REMOVE_SEGMENT = 0x1f  | TE_DO_DISCONNECT
 
   /** 
   * TE_SCI_UNABLE_TO_DISCONNECT_SEGMENT 
@@ -332,15 +339,18 @@ enum TransporterError {
   *  Cannot disconnect from a remote segment. 
   *  Recommended behavior: setPerformState(PerformDisonnect) 
   */ 
  ,TE_SCI_UNABLE_TO_DISCONNECT_SEGMENT = 0x8020 
  ,TE_SCI_UNABLE_TO_DISCONNECT_SEGMENT = 0x20 | TE_DO_DISCONNECT
 
  /* Used 0x21 */
  /* Used 0x22 */
}; 
 
/** 
 * Report error 
 */ 
void 
reportError(void * callbackObj, NodeId nodeId, TransporterError errorCode); 
reportError(void * callbackObj, NodeId nodeId, TransporterError errorCode,
	    const char *info = 0);

void
transporter_recv_from(void* callbackObj, NodeId node);
+13 −9
Original line number Diff line number Diff line
@@ -47,6 +47,9 @@ SHM_Transporter::SHM_Transporter(TransporterRegistry &t_reg,
  shmKey(_shmKey),
  shmSize(_shmSize)
{
#ifndef NDB_WIN32
  shmId= 0;
#endif
  _shmSegCreated = false;
  _attached = false;

@@ -202,7 +205,8 @@ SHM_Transporter::connect_server_impl(NDB_SOCKET_TYPE sockfd)
  // Create
  if(!_shmSegCreated){
    if (!ndb_shm_create()) {
      report_error(TE_SHM_UNABLE_TO_CREATE_SEGMENT);
      make_error_info(buf, sizeof(buf));
      report_error(TE_SHM_UNABLE_TO_CREATE_SEGMENT, buf);
      NDB_CLOSE_SOCKET(sockfd);
      DBUG_RETURN(false);
    }
@@ -212,7 +216,8 @@ SHM_Transporter::connect_server_impl(NDB_SOCKET_TYPE sockfd)
  // Attach
  if(!_attached){
    if (!ndb_shm_attach()) {
      report_error(TE_SHM_UNABLE_TO_ATTACH_SEGMENT);
      make_error_info(buf, sizeof(buf));
      report_error(TE_SHM_UNABLE_TO_ATTACH_SEGMENT, buf);
      NDB_CLOSE_SOCKET(sockfd);
      DBUG_RETURN(false);
    }
@@ -224,7 +229,8 @@ SHM_Transporter::connect_server_impl(NDB_SOCKET_TYPE sockfd)
		   m_transporter_registry.m_shm_own_pid);
  
  // Wait for ok from client
  if (s_input.gets(buf, 256) == 0) 
  DBUG_PRINT("info", ("Wait for ok from client"));
  if (s_input.gets(buf, sizeof(buf)) == 0) 
  {
    NDB_CLOSE_SOCKET(sockfd);
    DBUG_RETURN(false);
@@ -262,10 +268,8 @@ SHM_Transporter::connect_client_impl(NDB_SOCKET_TYPE sockfd)
  SocketOutputStream s_output(sockfd);
  char buf[256];

#if 1
#endif

  // Wait for server to create and attach
  DBUG_PRINT("info", ("Wait for server to create and attach"));
  if (s_input.gets(buf, 256) == 0) {
    NDB_CLOSE_SOCKET(sockfd);
    DBUG_PRINT("error", ("Server id %d did not attach",
@@ -293,7 +297,8 @@ SHM_Transporter::connect_client_impl(NDB_SOCKET_TYPE sockfd)
  // Attach
  if(!_attached){
    if (!ndb_shm_attach()) {
      report_error(TE_SHM_UNABLE_TO_ATTACH_SEGMENT);
      make_error_info(buf, sizeof(buf));
      report_error(TE_SHM_UNABLE_TO_ATTACH_SEGMENT, buf);
      NDB_CLOSE_SOCKET(sockfd);
      DBUG_PRINT("error", ("Failed attach of shm seg to node %d",
                  remoteNodeId));
@@ -310,6 +315,7 @@ SHM_Transporter::connect_client_impl(NDB_SOCKET_TYPE sockfd)
  
  if (r) {
    // Wait for ok from server
    DBUG_PRINT("info", ("Wait for ok from server"));
    if (s_input.gets(buf, 256) == 0) {
      NDB_CLOSE_SOCKET(sockfd);
      DBUG_PRINT("error", ("No ok from server node %d",
@@ -330,8 +336,6 @@ bool
SHM_Transporter::connect_common(NDB_SOCKET_TYPE sockfd)
{
  if (!checkConnected()) {
    DBUG_PRINT("error", ("Already connected to node %d",
                remoteNodeId));
    return false;
  }
  
+2 −0
Original line number Diff line number Diff line
@@ -170,6 +170,8 @@ private:
  bool hasDataToRead() const {
    return reader->empty() == false;
  }

  void make_error_info(char info[], int sz);
};

#endif
+27 −1
Original line number Diff line number Diff line
@@ -26,6 +26,12 @@
#include <sys/ipc.h>
#include <sys/shm.h>

void SHM_Transporter::make_error_info(char info[], int sz)
{
  snprintf(info,sz,"Shm key=%d sz=%d id=%d",
	   shmKey, shmSize, shmId);
}

bool
SHM_Transporter::ndb_shm_create()
{
@@ -64,12 +70,30 @@ SHM_Transporter::checkConnected(){
  struct shmid_ds info;
  const int res = shmctl(shmId, IPC_STAT, &info);
  if(res == -1){
    report_error(TE_SHM_IPC_STAT);
    char buf[128];
    int r= snprintf(buf, sizeof(buf),
		    "shmctl(%d, IPC_STAT) errno: %d(%s). ", shmId,
		    errno, strerror(errno));
    make_error_info(buf+r, sizeof(buf)-r);
    DBUG_PRINT("error",(buf));
    switch (errno)
    {
    case EACCES:
      report_error(TE_SHM_IPC_PERMANENT, buf);
      break;
    default:
      report_error(TE_SHM_IPC_STAT, buf);
      break;
    }
    return false;
  }
 
  if(info.shm_nattch != 2){
    char buf[128];
    make_error_info(buf, sizeof(buf));
    report_error(TE_SHM_DISCONNECT);
    DBUG_PRINT("error", ("Already connected to node %d",
                remoteNodeId));
    return false;
  }
  return true;
@@ -91,6 +115,8 @@ SHM_Transporter::disconnectImpl(){
  if(isServer && _shmSegCreated){
    const int res = shmctl(shmId, IPC_RMID, 0);
    if(res == -1){
      char buf[64];
      make_error_info(buf, sizeof(buf));
      report_error(TE_SHM_UNABLE_TO_REMOVE_SEGMENT);
      return;
    }
Loading