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]

Reply via email to