Merge "Fix potential segfaults and double free corruption"
authorThoralf Czichy <thoralf.czichy@nokia.com>
Fri, 14 Apr 2023 06:17:02 +0000 (06:17 +0000)
committerGerrit Code Review <gerrit@o-ran-sc.org>
Fri, 14 Apr 2023 06:17:02 +0000 (06:17 +0000)
1  2 
RIC-E2-TERMINATION/sctpThread.cpp

@@@ -59,7 -59,7 +59,7 @@@ static void catch_function(int signal) 
  BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(my_logger, src::logger_mt)
  
  boost::shared_ptr<sinks::synchronous_sink<sinks::text_file_backend>> boostLogger;
 -double cpuClock = 0.0;
 +// double cpuClock = 0.0;
  bool jsonTrace = false;
  
  char* getinterfaceip()
@@@ -289,26 -289,23 +289,26 @@@ void init_log() 
      dynamic_log_level_change();
      mdclog_attr_destroy(attr);
  }
 -auto start_time = std::chrono::high_resolution_clock::now();
 -typedef std::chrono::duration<double, std::ratio<1,1>> seconds_t;
 +//auto start_time = std::chrono::high_resolution_clock::now();
 +//typedef std::chrono::duration<double, std::ratio<1,1>> seconds_t;
  
 -double age() {
 -    return seconds_t(std::chrono::high_resolution_clock::now() - start_time).count();
 -}
 +//double age() {
 +//    return seconds_t(std::chrono::high_resolution_clock::now() - start_time).count();
 +//}
  
 -double approx_CPU_MHz(unsigned sleepTime) {
 -    using namespace std::chrono_literals;
 -    uint32_t aux = 0;
 -    uint64_t cycles_start = rdtscp(aux);
 -    double time_start = age();
 -    std::this_thread::sleep_for(sleepTime * 1ms);
 -    uint64_t elapsed_cycles = rdtscp(aux) - cycles_start;
 -    double elapsed_time = age() - time_start;
 -    return elapsed_cycles / elapsed_time;
 -}
 +// If model name in "/proc/cpuinfo" is happens to be "Common KVM processor" then
 +// approx_CPU_MHz() results in "SIGILL - Illegal Instruction" signal.
 +//
 +// double approx_CPU_MHz(unsigned sleepTime) {
 +//    using namespace std::chrono_literals;
 +//    uint32_t aux = 0;
 +//    uint64_t cycles_start = rdtscp(aux);
 +//    double time_start = age();
 +//    std::this_thread::sleep_for(sleepTime * 1ms);
 +//    uint64_t elapsed_cycles = rdtscp(aux) - cycles_start;
 +//    double elapsed_time = age() - time_start;
 +//    return elapsed_cycles / elapsed_time;
 +//}
  
  //std::atomic<int64_t> rmrCounter{0};
  std::atomic<int64_t> num_of_messages{0};
@@@ -603,9 -600,9 +603,9 @@@ int main(const int argc, char **argv) 
          exit(1);
      }
  
 -    cpuClock = approx_CPU_MHz(100);
 +//    cpuClock = approx_CPU_MHz(100);
  
 -    mdclog_write(MDCLOG_DEBUG, "CPU speed %11.11f", cpuClock);
 +//    mdclog_write(MDCLOG_DEBUG, "CPU speed %11.11f", cpuClock);
  
      auto result = parse(argc, argv, sctpParams);
  
@@@ -921,14 -918,16 +921,16 @@@ void listener(sctp_params_t *params) 
  #if !(defined(UNIT_TEST) || defined(MODULE_TEST))
                          if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
                              /* We have processed all incoming connections. */
-                             if(peerInfo)
+                             if(peerInfo) {
                                  free(peerInfo);
                                  peerInfo = nullptr;
+                             }
                              break;
                          } else {
-                             if(peerInfo)
+                             if(peerInfo) {
                                  free(peerInfo);
                                  peerInfo = nullptr;
+                             }
                              mdclog_write(MDCLOG_ERR, "Accept error, errno = %s", strerror(errno));
                              break;
                          }
                      if (setSocketNoBlocking(peerInfo->fileDescriptor) == -1) {
                          mdclog_write(MDCLOG_ERR, "setSocketNoBlocking failed to set new connection %s on port %s\n", hostBuff, portBuff);
                          close(peerInfo->fileDescriptor);
-                         if(peerInfo)
+                         if(peerInfo) {
                              free(peerInfo);
                              peerInfo = nullptr;
+                         }
                          break;
  #endif
                      }
                      if (ans < 0) {
                          mdclog_write(MDCLOG_ERR, "Failed to get info on connection request. %s\n", strerror(errno));
                          close(peerInfo->fileDescriptor);
-                         if(peerInfo)
+                         if(peerInfo) {
                              free(peerInfo);
                              peerInfo = nullptr;
+                         }
                          break;
                      }
                      if (mdclog_level_get() >= MDCLOG_DEBUG) {
                                     (EPOLLIN | EPOLLET),
                                     params->sctpMap, nullptr,
                                     0) != 0) {
-                         if(peerInfo)
+                         if(peerInfo) {
                              free(peerInfo);
                              peerInfo = nullptr;
+                         }
                          break;
                      }
                      break;
@@@ -1261,28 -1263,25 +1266,25 @@@ int setSocketNoBlocking(int socket) 
   * @param m
   */
  void cleanHashEntry(ConnectedCU_t *val, Sctp_Map_t *m) {
-     if(val != nullptr)
-     {
-     char *dummy;
-     auto port = (uint16_t) strtol(val->portNumber, &dummy, 10);
-     char searchBuff[2048]{};
+     if(val != nullptr) {
+         char *dummy;
+         auto port = (uint16_t) strtol(val->portNumber, &dummy, 10);
+         char searchBuff[2048]{};
  
-     snprintf(searchBuff, sizeof searchBuff, "host:%s:%d", val->hostName, port);
-     if(m->find(searchBuff))
-     {
-     m->erase(searchBuff);
-     }
+         snprintf(searchBuff, sizeof searchBuff, "host:%s:%d", val->hostName, port);
+         if(m->find(searchBuff)) {
+             m->erase(searchBuff);
+         }
  
-     if(m->find(val->enodbName))
-     {
-     mdclog_write(MDCLOG_DEBUG, "remove key enodbName = %s from %s at line %d", val->enodbName, __FUNCTION__, __LINE__);
-     m->erase(val->enodbName);
-     }
+         if(m->find(val->enodbName)) {
+             mdclog_write(MDCLOG_DEBUG, "remove key enodbName = %s from %s at line %d", val->enodbName, __FUNCTION__, __LINE__);
+             m->erase(val->enodbName);
+         }
  #ifndef UNIT_TEST
-     if(val) {
-        free(val);
-        val = nullptr;
-     }
+         if(val) {
+             free(val);
+             val = nullptr;
+         }
  #endif
      }
  }
@@@ -1400,7 -1399,7 +1402,7 @@@ int receiveDataFromSctp(struct epoll_ev
  
      // get the identity of the interface
      if (events->data.ptr != nullptr){
-     message.peerInfo = (ConnectedCU_t *)events->data.ptr;
+         message.peerInfo = (ConnectedCU_t *)events->data.ptr;
      }
  
      struct timespec start{0, 0};
@@@ -2280,12 -2279,12 +2282,12 @@@ case ProcedureCode_id_E2nodeConfigurati
                  mdclog_write(MDCLOG_DEBUG, "Got RICsubscriptionDeleteRequired %s", message.message.enodbName);
              }
          #if !(defined(UNIT_TEST) || defined(MODULE_TEST))
-                     message.peerInfo->counters[IN_INITI][MSG_COUNTER][ProcedureCode_id_RICsubscriptionDeleteRequired]->Increment();
-                     message.peerInfo->counters[IN_INITI][BYTES_COUNTER][ProcedureCode_id_RICsubscriptionDeleteRequired]->Increment((double)message.message.asnLength);
+             message.peerInfo->counters[IN_INITI][MSG_COUNTER][ProcedureCode_id_RICsubscriptionDeleteRequired]->Increment();
+             message.peerInfo->counters[IN_INITI][BYTES_COUNTER][ProcedureCode_id_RICsubscriptionDeleteRequired]->Increment((double)message.message.asnLength);
  
-                     // Update E2T instance level metrics
-                     message.peerInfo->sctpParams->e2tCounters[IN_INITI][MSG_COUNTER][ProcedureCode_id_RICsubscriptionDeleteRequired]->Increment();
-                     message.peerInfo->sctpParams->e2tCounters[IN_INITI][BYTES_COUNTER][ProcedureCode_id_RICsubscriptionDeleteRequired]->Increment((double)message.message.asnLength);
+             // Update E2T instance level metrics
+             message.peerInfo->sctpParams->e2tCounters[IN_INITI][MSG_COUNTER][ProcedureCode_id_RICsubscriptionDeleteRequired]->Increment();
+             message.peerInfo->sctpParams->e2tCounters[IN_INITI][BYTES_COUNTER][ProcedureCode_id_RICsubscriptionDeleteRequired]->Increment((double)message.message.asnLength);
          #endif
              if (sendRequestToXapp(message, RIC_SUB_DEL_REQUIRED, rmrMessageBuffer) != 0) {
                  mdclog_write(MDCLOG_ERR, "Subscription Delete Required message failed to send to xAPP");
@@@ -3240,7 -3239,7 +3242,7 @@@ int modifyToEpoll(int epoll_fd
          if (tmp) {
              free(tmp);
              tmp = nullptr;
-         sctpMap->erase(key);
+             sctpMap->erase(key);
          }
          mdclog_write(MDCLOG_ERR, "epoll_ctl EPOLL_CTL_ADD (may check not to quit here)");
          return -1;