]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
mqtt: eliminate size_t cast
authorStefan Eissing <stefan@eissing.org>
Thu, 20 Nov 2025 10:40:23 +0000 (11:40 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 20 Nov 2025 16:39:39 +0000 (17:39 +0100)
Use new curlx_sotouz_fits() instead.

Closes #19622

lib/curlx/warnless.c
lib/curlx/warnless.h
lib/mqtt.c

index a0aa5eda13b1ec868bc8cd3353b7ea92c9cd3d2b..5ed27b3e4cbfcb0422a12786e9e29a88c4522137 100644 (file)
@@ -317,6 +317,22 @@ bool curlx_sztouz(ssize_t sznum, size_t *puznum)
   return TRUE;
 }
 
+bool curlx_sotouz_fits(curl_off_t sonum, size_t *puznum)
+{
+  if(sonum < 0) {
+    *puznum = 0;
+    return FALSE;
+  }
+#if SIZEOF_CURL_OFF_T > SIZEOF_SIZE_T
+  if(sonum > SIZE_MAX) {
+    *puznum = 0;
+    return FALSE;
+  }
+#endif
+  *puznum = (size_t)sonum;
+  return TRUE;
+}
+
 curl_off_t curlx_uztoso(size_t uznum)
 {
 #if SIZEOF_SIZE_T >= SIZEOF_CURL_OFF_T
index a128f71488a155e6d648cff163ff2f62959e2014..c8861d8488c3a29a07e2a533d644c1691bea517b 100644 (file)
@@ -69,6 +69,10 @@ curl_off_t curlx_uztoso(size_t uznum);
 /* Convert a ssize_t to size_t, return FALSE if negative and set 0 */
 bool curlx_sztouz(ssize_t sznum, size_t *puznum);
 
+/* Convert a curl_off_t to size_t, return FALSE if negative or
+ * too large and set 0 */
+bool curlx_sotouz_fits(curl_off_t sonum, size_t *puznum);
+
 #ifdef _WIN32
 #undef  read
 #define read(fd, buf, count)  (ssize_t)_read(fd, buf, curlx_uztoui(count))
index 58458a841639b7f5c8972d6a2bd5591bfc7f6c96..9cbe800ded8ecea1406bc4b09775b45006444312 100644 (file)
@@ -192,7 +192,7 @@ static CURLcode mqtt_send(struct Curl_easy *data,
   if(result)
     return result;
   mq->lastTime = curlx_now();
-  Curl_debug(data, CURLINFO_HEADER_OUT, buf, (size_t)n);
+  Curl_debug(data, CURLINFO_HEADER_OUT, buf, n);
   if(len != n) {
     size_t nsend = len - n;
     if(curlx_dyn_len(&mq->sendbuf)) {
@@ -602,10 +602,11 @@ static CURLcode mqtt_publish(struct Curl_easy *data)
     DEBUGF(infof(data, "mqtt_publish without payload, return bad arg"));
     return CURLE_BAD_FUNCTION_ARGUMENT;
   }
-  if(postfieldsize < 0)
+  if(!curlx_sotouz_fits(postfieldsize, &payloadlen)) {
+    if(postfieldsize > 0) /* off_t does not fit into size_t */
+      return CURLE_BAD_FUNCTION_ARGUMENT;
     payloadlen = strlen(payload);
-  else
-    payloadlen = (size_t)postfieldsize;
+  }
 
   result = mqtt_get_topic(data, &topic, &topiclen);
   if(result)