I made Curl_done() take a pointer-pointer in the first argument instead, and
authorDaniel Stenberg <daniel@haxx.se>
Mon, 17 May 2004 08:05:46 +0000 (08:05 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 17 May 2004 08:05:46 +0000 (08:05 +0000)
if the connection is killed it blanks the pointer it points to, to make it
easier to detect usage problems whereever Curl_done() is used.

lib/transfer.c
lib/url.c
lib/url.h

index ac343e8..b8ccfe2 100644 (file)
@@ -1969,7 +1969,7 @@ CURLcode Curl_perform(struct SessionHandle *data)
          to the new URL */
       urlchanged = data->change.url_changed;
       if ((CURLE_OK == res) && urlchanged) {
-        res = Curl_done(conn, res);
+        res = Curl_done(&conn, res);
         if(CURLE_OK == res) {
           char *gotourl = strdup(data->change.url);
           res = Curl_follow(data, gotourl);
@@ -2026,14 +2026,14 @@ CURLcode Curl_perform(struct SessionHandle *data)
 
         /* Always run Curl_done(), even if some of the previous calls
            failed, but return the previous (original) error code */
-        res2 = Curl_done(conn, res);
+        res2 = Curl_done(&conn, res);
 
         if(CURLE_OK == res)
           res = res2;
       }
       else
         /* Curl_do() failed, clean up left-overs in the done-call */
-        res2 = Curl_done(conn, res);
+        res2 = Curl_done(&conn, res);
 
       /*
        * Important: 'conn' cannot be used here, since it may have been closed
index 9c4769d..53d37ba 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -3367,12 +3367,13 @@ CURLcode Curl_async_resolved(struct connectdata *conn)
 }
 
 
-CURLcode Curl_done(struct connectdata *conn,
+CURLcode Curl_done(struct connectdata **connp,
                    CURLcode status) /* an error if this is called after an
                                        error was detected */
 {
-  struct SessionHandle *data=conn->data;
   CURLcode result;
+  struct connectdata *conn = *connp;
+  struct SessionHandle *data=conn->data;
 
   /* cleanups done even if the connection is re-used */
 
@@ -3416,6 +3417,9 @@ CURLcode Curl_done(struct connectdata *conn,
     CURLcode res2;
     res2 = Curl_disconnect(conn); /* close the connection */
 
+    *connp = NULL; /* to make the caller of this function better detect that
+                      this was actually killed here */
+
     /* If we had an error already, make sure we return that one. But
        if we got a new error, return that. */
     if(!result && res2)
@@ -3452,9 +3456,9 @@ CURLcode Curl_do(struct connectdata **connp)
       infof(data, "Re-used connection seems dead, get a new one\n");
 
       conn->bits.close = TRUE; /* enforce close of this connection */
-      result = Curl_done(conn, result); /* we are so done with this */
+      result = Curl_done(&conn, result); /* we are so done with this */
 
-      /* conn is no longer a good pointer */
+      /* conn may no longer be a good pointer */
 
       if(CURLE_OK == result) {
         bool async;
index ff79513..8fd4795 100644 (file)
--- a/lib/url.h
+++ b/lib/url.h
@@ -1,10 +1,10 @@
 #ifndef __URL_H
 #define __URL_H
 /***************************************************************************
- *                                  _   _ ____  _     
- *  Project                     ___| | | |  _ \| |    
- *                             / __| | | | |_) | |    
- *                            | (__| |_| |  _ <| |___ 
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al.
@@ -12,7 +12,7 @@
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
  * are also available at http://curl.haxx.se/docs/copyright.html.
- * 
+ *
  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
  * copies of the Software, and permit persons to whom the Software is
  * furnished to do so, under the terms of the COPYING file.
@@ -35,7 +35,7 @@ CURLcode Curl_connect(struct SessionHandle *, struct connectdata **,
 CURLcode Curl_async_resolved(struct connectdata *conn);
 CURLcode Curl_do(struct connectdata **);
 CURLcode Curl_do_more(struct connectdata *);
-CURLcode Curl_done(struct connectdata *, CURLcode);
+CURLcode Curl_done(struct connectdata **, CURLcode);
 CURLcode Curl_disconnect(struct connectdata *);
 CURLcode Curl_protocol_connect(struct connectdata *conn);
 bool Curl_ssl_config_matches(struct ssl_config_data* data,