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!