Author: amassari
Date: Tue Aug 9 01:02:03 2005
New Revision: 231009
URL: http://svn.apache.org/viewcvs?rev=231009&view=rev
Log:
Close the socket even in case of exceptions being thrown (jira#1467)
Modified:
xerces/c/branches/xerces-2.7/src/xercesc/util/NetAccessors/Socket/UnixHTTPURLInputStream.cpp
xerces/c/branches/xerces-2.7/src/xercesc/util/NetAccessors/WinSock/BinHTTPURLInputStream.cpp
Modified:
xerces/c/branches/xerces-2.7/src/xercesc/util/NetAccessors/Socket/UnixHTTPURLInputStream.cpp
URL:
http://svn.apache.org/viewcvs/xerces/c/branches/xerces-2.7/src/xercesc/util/NetAccessors/Socket/UnixHTTPURLInputStream.cpp?rev=231009&r1=231008&r2=231009&view=diff
==============================================================================
---
xerces/c/branches/xerces-2.7/src/xercesc/util/NetAccessors/Socket/UnixHTTPURLInputStream.cpp
(original)
+++
xerces/c/branches/xerces-2.7/src/xercesc/util/NetAccessors/Socket/UnixHTTPURLInputStream.cpp
Tue Aug 9 01:02:03 2005
@@ -45,6 +45,38 @@
XERCES_CPP_NAMESPACE_BEGIN
+class SocketJanitor
+{
+public:
+ // -----------------------------------------------------------------------
+ // Constructors and Destructor
+ // -----------------------------------------------------------------------
+ SocketJanitor(int* toDelete) : fData(toDelete) {}
+ ~SocketJanitor() { reset(); }
+
+ int* get() const { return fData; }
+ int* release() { int* p = fData; fData = 0; return p; }
+
+ void reset(int* p = 0) { if(fData) closesocket(*fData); fData=p; }
+ bool isDataNull() { return (fData == 0); }
+
+private :
+ // -----------------------------------------------------------------------
+ // Unimplemented constructors and operators
+ // -----------------------------------------------------------------------
+ SocketJanitor();
+ SocketJanitor(const SocketJanitor&);
+ SocketJanitor& operator=(const SocketJanitor&);
+
+ // -----------------------------------------------------------------------
+ // Private data members
+ //
+ // fData
+ // This is the pointer to the socket that must be closed when
+ // this object is destroyed.
+ // -----------------------------------------------------------------------
+ int* fData;
+};
UnixHTTPURLInputStream::UnixHTTPURLInputStream(const XMLURL& urlSource, const
XMLNetHTTPInfo* httpInfo/*=0*/)
: fSocket(0)
@@ -248,6 +280,7 @@
ThrowXMLwithMemMgr1(NetAccessorException,
XMLExcepts::NetAcc_CreateSocket, urlSource.getURLText(),
fMemoryManager);
}
+ SocketJanitor janSock(&s);
if (connect(s, (struct sockaddr *) &sa, sizeof(sa)) < 0)
{
@@ -407,7 +440,7 @@
ThrowXMLwithMemMgr1(NetAccessorException,
XMLExcepts::File_CouldNotOpenFile, urlSource.getURLText(), fMemoryManager);
}
- fSocket = s;
+ fSocket = *janSock.release();
}
Modified:
xerces/c/branches/xerces-2.7/src/xercesc/util/NetAccessors/WinSock/BinHTTPURLInputStream.cpp
URL:
http://svn.apache.org/viewcvs/xerces/c/branches/xerces-2.7/src/xercesc/util/NetAccessors/WinSock/BinHTTPURLInputStream.cpp?rev=231009&r1=231008&r2=231009&view=diff
==============================================================================
---
xerces/c/branches/xerces-2.7/src/xercesc/util/NetAccessors/WinSock/BinHTTPURLInputStream.cpp
(original)
+++
xerces/c/branches/xerces-2.7/src/xercesc/util/NetAccessors/WinSock/BinHTTPURLInputStream.cpp
Tue Aug 9 01:02:03 2005
@@ -39,6 +39,39 @@
XERCES_CPP_NAMESPACE_BEGIN
+class SocketJanitor
+{
+public:
+ // -----------------------------------------------------------------------
+ // Constructors and Destructor
+ // -----------------------------------------------------------------------
+ SocketJanitor(SOCKET* toDelete) : fData(toDelete) {}
+ ~SocketJanitor() { reset(); }
+
+ SOCKET* get() const { return fData; }
+ SOCKET* release() { SOCKET* p = fData; fData = 0; return p; }
+
+ void reset(SOCKET* p = 0) { if(fData) closesocket(*fData); fData=p; }
+ bool isDataNull() { return (fData == 0); }
+
+private :
+ // -----------------------------------------------------------------------
+ // Unimplemented constructors and operators
+ // -----------------------------------------------------------------------
+ SocketJanitor();
+ SocketJanitor(const SocketJanitor&);
+ SocketJanitor& operator=(const SocketJanitor&);
+
+ // -----------------------------------------------------------------------
+ // Private data members
+ //
+ // fData
+ // This is the pointer to the socket that must be closed when
+ // this object is destroyed.
+ // -----------------------------------------------------------------------
+ SOCKET* fData;
+};
+
static HMODULE gWinsockLib = NULL;
static LPFN_GETHOSTBYNAME gWSgethostbyname = NULL;
static LPFN_INET_ADDR gWSinet_addr = NULL;
@@ -274,6 +307,7 @@
ThrowXMLwithMemMgr1(NetAccessorException,
XMLExcepts::NetAcc_CreateSocket, urlSource.getURLText(),
fMemoryManager);
}
+ SocketJanitor janSock(&s);
if (connect(s, (struct sockaddr *) &sa, sizeof(sa)) == SOCKET_ERROR)
{
@@ -458,7 +492,7 @@
ThrowXMLwithMemMgr1(NetAccessorException,
XMLExcepts::File_CouldNotOpenFile, urlSource.getURLText(), fMemoryManager);
}
- fSocketHandle = (unsigned int) s;
+ fSocketHandle = (unsigned int) *janSock.release();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]