]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
examples/multi-uv: fix invalid req->data access
authorBANADDA <mubarakabanadda68@gmail.com>
Sat, 15 Nov 2025 02:08:10 +0000 (02:08 +0000)
committerViktor Szakats <commit@vsz.me>
Wed, 26 Nov 2025 11:52:10 +0000 (12:52 +0100)
The on_uv_timeout callback was trying to access req->data as
a curl_context pointer, but uv.timeout.data was never initialized,
making it always NULL. This rendered the code inside the if(context)
block unreachable.

Fixes #19462
Closes #19538

docs/examples/multi-uv.c

index 190bed3ef475e183cd771e06071007699f5e0837..75fec20199b321302acf3d16087482fc42ab49a6 100644 (file)
@@ -160,12 +160,19 @@ static void on_uv_socket(uv_poll_t *req, int status, int events)
 /* callback from libuv when timeout expires */
 static void on_uv_timeout(uv_timer_t *req)
 {
-  struct curl_context *context = (struct curl_context *) req->data;
-  if(context) {
-    int running_handles;
-    curl_multi_socket_action(context->uv->multi, CURL_SOCKET_TIMEOUT, 0,
-                             &running_handles);
-    check_multi_info(context);
+  /* get the datauv struct from the timer handle */
+  struct datauv *uv = (struct datauv *)req;
+  int running_handles;
+
+  curl_multi_socket_action(uv->multi, CURL_SOCKET_TIMEOUT, 0,
+                           &running_handles);
+
+  /* We do not have a curl_context here, so we need to check messages
+     differently. Create a temporary context just for the check. */
+  if(running_handles) {
+    struct curl_context temp_context;
+    temp_context.uv = uv;
+    check_multi_info(&temp_context);
   }
 }