Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP5:GA
tigervnc.10990
U_tigervnc-fix-race-problem-with-detecting-list...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File U_tigervnc-fix-race-problem-with-detecting-listening-inetd-sockets.patch of Package tigervnc.10990
Path-mainline: Upstream Git-commit: fc1599b95f1dbdd33d1c83ab7a13997ea3e81c71 Author: Tristan Schmelcher <tristan_schmelcher@alumni.uwaterloo.ca> Signed-off-by: Michal Srb <msrb@suse.com> Subject: Fix race problem with detecting listening inetd sockets References: bnc#1054300 The previous detection would fail if the socket closed before we had time to inspect it, which got us stuck in a loop as we would try (and fail) to do accept() on a non-listening socket. Index: tigervnc-1.6.0/common/network/TcpSocket.cxx =================================================================== --- tigervnc-1.6.0.orig/common/network/TcpSocket.cxx +++ tigervnc-1.6.0/common/network/TcpSocket.cxx @@ -360,18 +360,14 @@ bool TcpSocket::cork(int sock, bool enab #endif } -bool TcpSocket::isSocket(int sock) +bool TcpSocket::isListening(int sock) { - vnc_sockaddr_t sa; - socklen_t sa_size = sizeof(sa); - return getsockname(sock, &sa.u.sa, &sa_size) >= 0; -} - -bool TcpSocket::isConnected(int sock) -{ - vnc_sockaddr_t sa; - socklen_t sa_size = sizeof(sa); - return getpeername(sock, &sa.u.sa, &sa_size) >= 0; + int listening = 0; + socklen_t listening_size = sizeof(listening); + if (getsockopt(sock, SOL_SOCKET, SO_ACCEPTCONN, + (char *)&listening, &listening_size) < 0) + return false; + return listening != 0; } int TcpSocket::getSockPort(int sock) Index: tigervnc-1.6.0/common/network/TcpSocket.h =================================================================== --- tigervnc-1.6.0.orig/common/network/TcpSocket.h +++ tigervnc-1.6.0/common/network/TcpSocket.h @@ -65,8 +65,7 @@ namespace network { static bool enableNagles(int sock, bool enable); static bool cork(int sock, bool enable); - static bool isSocket(int sock); - static bool isConnected(int sock); + static bool isListening(int sock); static int getSockPort(int sock); private: bool closeFd; Index: tigervnc-1.6.0/unix/xserver/hw/vnc/vncExtInit.cc =================================================================== --- tigervnc-1.6.0.orig/unix/xserver/hw/vnc/vncExtInit.cc +++ tigervnc-1.6.0/unix/xserver/hw/vnc/vncExtInit.cc @@ -169,8 +169,7 @@ void vncExtensionInit(void) std::list<network::TcpListener*> listeners; std::list<network::TcpListener*> httpListeners; if (scr == 0 && vncInetdSock != -1) { - if (network::TcpSocket::isSocket(vncInetdSock) && - !network::TcpSocket::isConnected(vncInetdSock)) + if (network::TcpSocket::isListening(vncInetdSock)) { listeners.push_back(new network::TcpListener(vncInetdSock)); vlog.info("inetd wait");
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor