]> granicus.if.org Git - curl/commitdiff
docs: multi-uv: don't use CURLMsg after cleanup
authorAndrei Sedoi <bsnote@gmail.com>
Wed, 2 Nov 2016 09:00:20 +0000 (09:00 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 3 Nov 2016 11:32:14 +0000 (12:32 +0100)
docs/examples/multi-uv.c

index f74ae28804b408fef0c6ee1d402e8f696ec4c66a..aece4011a956e6ee7819f0925a7041988da08c2e 100644 (file)
@@ -104,18 +104,25 @@ static void check_multi_info(void)
   char *done_url;
   CURLMsg *message;
   int pending;
+  CURL *easy_handle;
   FILE *file;
 
   while((message = curl_multi_info_read(curl_handle, &pending))) {
     switch(message->msg) {
     case CURLMSG_DONE:
-      curl_easy_getinfo(message->easy_handle, CURLINFO_EFFECTIVE_URL,
-                        &done_url);
-      curl_easy_getinfo(message->easy_handle, CURLINFO_PRIVATE, &file);
+      /* Do not use message data after calling curl_multi_remove_handle() and
+         curl_easy_cleanup(). As per curl_multi_info_read() docs:
+         "WARNING: The data the returned pointer points to will not survive
+         calling curl_multi_cleanup, curl_multi_remove_handle or
+         curl_easy_cleanup." */
+      easy_handle = message->easy_handle;
+
+      curl_easy_getinfo(easy_handle, CURLINFO_EFFECTIVE_URL, &done_url);
+      curl_easy_getinfo(easy_handle, CURLINFO_PRIVATE, &file);
       printf("%s DONE\n", done_url);
 
-      curl_multi_remove_handle(curl_handle, message->easy_handle);
-      curl_easy_cleanup(message->easy_handle);
+      curl_multi_remove_handle(curl_handle, easy_handle);
+      curl_easy_cleanup(easy_handle);
       if(file) {
         fclose(file);
       }