Error using `ns` instead of `accept_socket` and `tid` instead of `pfilekey`

version

urbackup-server-2.5.37

context

GCC 15, glibc 2.42OS: Fedora Linux 43 (Workstation Edition) x86_64Locale: es_ES.UTF-8

problem and proposal #1

Hi, I think there’s an error using the ns instance instead of accept_socket, and it could lead to some malfunctions. I’ve written a proposal for review:

AcceptThread.cpp:212

#ifdef _WIN32
        SOCKET accept_socket = n == 0 ? s : s_v6;
        if (accept_socket == SOCKET_ERROR)
          continue;
        if (!FD_ISSET(accept_socket, &fdset))
          continue;
#else
        if (conn[n].revents == 0)
          continue;
        SOCKET accept_socket = conn[n].fd;
#endif

        sockaddr_in naddr;
        int ns = ACCEPT_CLOEXEC(accept_socket, (sockaddr *)&naddr, &addrsize);
        if (ns != -1)
        {

#ifdef __APPLE__
          int optval = 1;
          setsockopt(accept_socket, SOL_SOCKET, SO_NOSIGPIPE, (void *)&optval, sizeof(optval));
#endif
          // Server->Log("New Connection incomming", LL_INFO);

          OutputCallback *output = new OutputCallback(accept_socket);
          FCGIProtocolDriver *driver = new FCGIProtocolDriver(*output);

          CClient *client = new CClient();
          client->set(accept_socket, output, driver);

          AddToSelectThread(client);
        }

ServiceAcceptor.cpp:204

#ifdef _WIN32
        SOCKET accept_socket = n == 0 ? s : s_v6;
        if (accept_socket == SOCKET_ERROR)
          continue;
        if (!FD_ISSET(accept_socket, &fdset))
          continue;
#else
        if (n == 1)
          continue;
        if (conn[n].revents == 0)
          continue;
        SOCKET accept_socket = conn[n].fd;
#endif
        if (do_exit)
          break;

        union
        {
          sockaddr_in naddr_v4;
          sockaddr_in6 naddr_v6;
        } naddr;
        socklen_t addrsize;
        if (accept_socket == s_v6)
          addrsize = sizeof(naddr.naddr_v6);
        else
          addrsize = sizeof(naddr.naddr_v4);

        sockaddr* paddr = (sockaddr*)&naddr;
        int ns= ACCEPT_CLOEXEC(accept_socket, paddr, &addrsize);
        if(ns!=-1)
        {
#ifdef __APPLE__
          int optval = 1;
          setsockopt(accept_socket);
#endif
          //Server->Log(name+": New Connection incomming "+convert(Server->getTimeMS())+" s: "+convert((int)accept_socket), LL_DEBUG);

  #ifdef _WIN32
          int window_size=Server->getSendWindowSize();
          if(window_size>0)
            setsockopt(accept_socket, SOL_SOCKET, SO_SNDBUF, (char *) &window_size, sizeof(window_size));

          window_size = Server->getRecvWindowSize();
          if(window_size>0)
            setsockopt(accept_socket);
  #endif
          char buf[100];
          const char* endpoint = inet_ntop(paddr->sa_family,
            accept_socket == s_v6 ? (void*)&naddr.naddr_v6.sin6_addr : (void*)&naddr.naddr_v4.sin_addr,
            buf, sizeof(buf));

          AddToWorker(accept_socketns, endpoint!=NULL ? endpoint : "");
        }
      }
    }

fileservplugin/CTCPFileServ.cpp:284

#ifdef _WIN32
      SOCKET accept_socket = s == 0 ? mSocket : mSocketv6;
      if (accept_socket == SOCKET_ERROR)
        continue;
      if (!FD_ISSET(accept_socket, &fdset))
        continue;
#else
      if (conn[s].revents == 0)
        continue;
      SOCKET accept_socket = conn[s].fd;
#endif
      int ns;
      if (accept_socket == mSocket)
      {
        sockaddr_in naddr;
        socklen_t addrsize = sizeof(naddr);
        ns = ACCEPT_CLOEXEC(accept_socket, (sockaddr*)&naddr, &addrsize);
      }
      else
      {
        sockaddr_in6 naddr;
        socklen_t addrsize = sizeof(naddr);
        ns = ACCEPT_CLOEXEC(accept_socket, (sockaddr*)&naddr, &addrsize);
      }
      if (ns != -1)
      {
#ifdef __APPLE__
        int optval = 1;
        setsockopt(accept_socket, SOL_SOCKET, SO_NOSIGPIPE, (void*)&optval, sizeof(optval));
#endif
        cs.Enter();
        //Log("New Connection incomming", LL_DEBUG);
        CClientThread *clientthread = new CClientThread(accept_socket, this);
        Server->createThread(clientthread, "file server");
        clientthreads.push_back(clientthread);
        cs.Leave();
      }
    }
  }

problem and proposal #2

Maybe a wrong type is used tid instead of pfilekey:

httpserver/HTTPClient.cpp:163

      http_g_state=HTTP_STATE_DONE;
      if(fileupload)
      {
        Server->clearPostFiles(pfilekey);
      }

Also, wrong logical types for iter1 and iter2 are used here:
Server.cpp:1892

SPostfile CServer::getPostFile(POSTFILE_KEY pfkey, const std::string &name)
{
  IScopedLock lock(postfiles_mutex);
  const auto iter1=postfiles.find(pfkey);
  if(iter1!=postfiles.end())
  {
    const auto iter2=iter1->second.find(name);
    if(iter2!=iter1->second.end() )
    {
      return iter2->second;
    }
  }
  return SPostfile();
}

void CServer::clearPostFiles(POSTFILE_KEY pfkey)
{
  IScopedLock lock(postfiles_mutex);

  auto iter1=postfiles.find(pfkey);
  if(iter1!=postfiles.end())
  {
    for(std::map<std::string, SPostfile >::iterator iter2=iter1->second.begin();iter2!=iter1->second.end();++iter2)
    {
      destroy(iter2->second.file);
    }
    postfiles.erase(iter1);
  }
}

Thanks!