]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
http: eliminate ssize_t
authorStefan Eissing <stefan@eissing.org>
Wed, 19 Nov 2025 14:09:57 +0000 (15:09 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 19 Nov 2025 15:20:18 +0000 (16:20 +0100)
Use size_t to avoid conversions.

Closes #19610

lib/http1.c
lib/http1.h
lib/http2.c
lib/vquic/curl_ngtcp2.c
lib/vquic/curl_osslq.c
lib/vquic/curl_quiche.c
tests/unit/unit2603.c

index c487597e3492036f7badf1cd75bf8bf34b911103..b1d80976360a9203c1e0143f0d765cefa870065d 100644 (file)
@@ -80,57 +80,58 @@ static CURLcode trim_line(struct h1_req_parser *parser, int options)
   return CURLE_OK;
 }
 
-static ssize_t detect_line(struct h1_req_parser *parser,
-                           const char *buf, const size_t buflen,
-                           CURLcode *err)
+static CURLcode detect_line(struct h1_req_parser *parser,
+                            const char *buf, const size_t buflen,
+                            size_t *pnread)
 {
   const char *line_end;
 
   DEBUGASSERT(!parser->line);
+  *pnread = 0;
   line_end = memchr(buf, '\n', buflen);
-  if(!line_end) {
-    *err = CURLE_AGAIN;
-    return -1;
-  }
+  if(!line_end)
+    return CURLE_AGAIN;
   parser->line = buf;
   parser->line_len = line_end - buf + 1;
-  *err = CURLE_OK;
-  return (ssize_t)parser->line_len;
+  *pnread = parser->line_len;
+  return CURLE_OK;
 }
 
-static ssize_t next_line(struct h1_req_parser *parser,
-                         const char *buf, const size_t buflen, int options,
-                         CURLcode *err)
+static CURLcode next_line(struct h1_req_parser *parser,
+                          const char *buf, const size_t buflen, int options,
+                          size_t *pnread)
 {
-  ssize_t nread = 0;
+  CURLcode result;
 
+  *pnread = 0;
   if(parser->line) {
     parser->line = NULL;
     parser->line_len = 0;
     curlx_dyn_reset(&parser->scratch);
   }
 
-  nread = detect_line(parser, buf, buflen, err);
-  if(nread >= 0) {
+  result = detect_line(parser, buf, buflen, pnread);
+  if(!result) {
     if(curlx_dyn_len(&parser->scratch)) {
       /* append detected line to scratch to have the complete line */
-      *err = curlx_dyn_addn(&parser->scratch, parser->line, parser->line_len);
-      if(*err)
-        return -1;
+      result = curlx_dyn_addn(&parser->scratch, parser->line,
+                              parser->line_len);
+      if(result)
+        return result;
       parser->line = curlx_dyn_ptr(&parser->scratch);
       parser->line_len = curlx_dyn_len(&parser->scratch);
     }
-    *err = trim_line(parser, options);
-    if(*err)
-      return -1;
+    result = trim_line(parser, options);
+    if(result)
+      return result;
   }
-  else if(*err == CURLE_AGAIN) {
+  else if(result == CURLE_AGAIN) {
     /* no line end in `buf`, add it to our scratch */
-    *err = curlx_dyn_addn(&parser->scratch, (const unsigned char *)buf,
-                          buflen);
-    nread = (*err) ? -1 : (ssize_t)buflen;
+    result = curlx_dyn_addn(&parser->scratch, (const unsigned char *)buf,
+                            buflen);
+    *pnread = buflen;
   }
-  return nread;
+  return result;
 }
 
 static CURLcode start_req(struct h1_req_parser *parser,
@@ -264,29 +265,28 @@ out:
   return result;
 }
 
-ssize_t Curl_h1_req_parse_read(struct h1_req_parser *parser,
-                               const char *buf, size_t buflen,
-                               const char *scheme_default,
-                               const char *custom_method,
-                               int options, CURLcode *err)
+CURLcode Curl_h1_req_parse_read(struct h1_req_parser *parser,
+                                const char *buf, size_t buflen,
+                                const char *scheme_default,
+                                const char *custom_method,
+                                int options, size_t *pnread)
 {
-  ssize_t nread = 0, n;
+  CURLcode result = CURLE_OK;
+  size_t nread;
 
-  *err = CURLE_OK;
+  *pnread = 0;
   while(!parser->done) {
-    n = next_line(parser, buf, buflen, options, err);
-    if(n < 0) {
-      if(*err != CURLE_AGAIN) {
-        nread = -1;
-      }
-      *err = CURLE_OK;
+    result = next_line(parser, buf, buflen, options, &nread);
+    if(result) {
+      if(result == CURLE_AGAIN)
+        result = CURLE_OK;
       goto out;
     }
 
     /* Consume this line */
-    nread += (size_t)n;
-    buf += (size_t)n;
-    buflen -= (size_t)n;
+    *pnread += nread;
+    buf += nread;
+    buflen -= nread;
 
     if(!parser->line) {
       /* consumed bytes, but line not complete */
@@ -294,17 +294,14 @@ ssize_t Curl_h1_req_parse_read(struct h1_req_parser *parser,
         goto out;
     }
     else if(!parser->req) {
-      *err = start_req(parser, scheme_default, custom_method, options);
-      if(*err) {
-        nread = -1;
+      result = start_req(parser, scheme_default, custom_method, options);
+      if(result)
         goto out;
-      }
     }
     else if(parser->line_len == 0) {
       /* last, empty line, we are finished */
       if(!parser->req) {
-        *err = CURLE_URL_MALFORMAT;
-        nread = -1;
+        result = CURLE_URL_MALFORMAT;
         goto out;
       }
       parser->done = TRUE;
@@ -312,17 +309,15 @@ ssize_t Curl_h1_req_parse_read(struct h1_req_parser *parser,
       /* last chance adjustments */
     }
     else {
-      *err = Curl_dynhds_h1_add_line(&parser->req->headers,
-                                     parser->line, parser->line_len);
-      if(*err) {
-        nread = -1;
+      result = Curl_dynhds_h1_add_line(&parser->req->headers,
+                                       parser->line, parser->line_len);
+      if(result)
         goto out;
-      }
     }
   }
 
 out:
-  return nread;
+  return result;
 }
 
 CURLcode Curl_h1_req_write_head(struct httpreq *req, int http_minor,
index 94b5a44e3143a185960cc7e6913d1058d08b9d50..944e9038dd986083084baa4cc196dffefa17e684 100644 (file)
@@ -48,11 +48,11 @@ struct h1_req_parser {
 void Curl_h1_req_parse_init(struct h1_req_parser *parser, size_t max_line_len);
 void Curl_h1_req_parse_free(struct h1_req_parser *parser);
 
-ssize_t Curl_h1_req_parse_read(struct h1_req_parser *parser,
-                               const char *buf, size_t buflen,
-                               const char *scheme_default,
-                               const char *custom_method,
-                               int options, CURLcode *err);
+CURLcode Curl_h1_req_parse_read(struct h1_req_parser *parser,
+                                const char *buf, size_t buflen,
+                                const char *scheme_default,
+                                const char *custom_method,
+                                int options, size_t *pnread);
 
 CURLcode Curl_h1_req_dprint(const struct httpreq *req,
                             struct dynbuf *dbuf);
index 1565e0b9ead36661a58cfff4ce30dac25fb9678c..a1caa2020f7cf8a47d151edb43d260723216061e 100644 (file)
@@ -2237,7 +2237,6 @@ static CURLcode h2_submit(struct h2_stream_ctx **pstream,
   nghttp2_data_provider data_prd;
   int32_t stream_id;
   nghttp2_priority_spec pri_spec;
-  ssize_t rc;
   size_t nwritten;
   CURLcode result = CURLE_OK;
 
@@ -2248,11 +2247,11 @@ static CURLcode h2_submit(struct h2_stream_ctx **pstream,
   if(result)
     goto out;
 
-  rc = Curl_h1_req_parse_read(&stream->h1, buf, len, NULL,
-                              !data->state.http_ignorecustom ?
-                              data->set.str[STRING_CUSTOMREQUEST] : NULL,
-                              0, &result);
-  if(!curlx_sztouz(rc, &nwritten))
+  result = Curl_h1_req_parse_read(&stream->h1, buf, len, NULL,
+                                  !data->state.http_ignorecustom ?
+                                  data->set.str[STRING_CUSTOMREQUEST] : NULL,
+                                  0, &nwritten);
+  if(result)
     goto out;
   *pnwritten = nwritten;
   if(!stream->h1.done) {
index ce5786ca83e8841d91bc6ffd6f611511cbee5a0a..ecfa895a2eaf509c266f3b40bd8639ff8d07b1b4 100644 (file)
@@ -1513,7 +1513,6 @@ static CURLcode h3_stream_open(struct Curl_cfilter *cf,
   nghttp3_nv *nva = NULL;
   int rc = 0;
   unsigned int i;
-  ssize_t nwritten = -1;
   nghttp3_data_reader reader;
   nghttp3_data_reader *preader = NULL;
   CURLcode result;
@@ -1531,13 +1530,12 @@ static CURLcode h3_stream_open(struct Curl_cfilter *cf,
     goto out;
   }
 
-  nwritten = Curl_h1_req_parse_read(&stream->h1, buf, len, NULL,
-                                    !data->state.http_ignorecustom ?
-                                    data->set.str[STRING_CUSTOMREQUEST] : NULL,
-                                    0, &result);
-  if(nwritten < 0)
+  result = Curl_h1_req_parse_read(&stream->h1, buf, len, NULL,
+                                  !data->state.http_ignorecustom ?
+                                  data->set.str[STRING_CUSTOMREQUEST] : NULL,
+                                  0, pnwritten);
+  if(result)
     goto out;
-  *pnwritten = (size_t)nwritten;
 
   if(!stream->h1.done) {
     /* need more data */
index f328c08e35b5f5ea18896f9bd6a37bb36dc9ccac..68666d591505e3fd471df63c1d810353f463444c 100644 (file)
@@ -1872,10 +1872,10 @@ out:
   return result;
 }
 
-static ssize_t h3_stream_open(struct Curl_cfilter *cf,
-                              struct Curl_easy *data,
-                              const void *buf, size_t len,
-                              CURLcode *err)
+static CURLcode h3_stream_open(struct Curl_cfilter *cf,
+                               struct Curl_easy *data,
+                               const void *buf, size_t len,
+                               size_t *pnwritten)
 {
   struct cf_osslq_ctx *ctx = cf->ctx;
   struct h3_stream_ctx *stream = NULL;
@@ -1884,27 +1884,27 @@ static ssize_t h3_stream_open(struct Curl_cfilter *cf,
   nghttp3_nv *nva = NULL;
   int rc = 0;
   unsigned int i;
-  ssize_t nwritten = -1;
   nghttp3_data_reader reader;
   nghttp3_data_reader *preader = NULL;
+  CURLcode result;
 
   Curl_dynhds_init(&h2_headers, 0, DYN_HTTP_REQUEST);
 
-  *err = h3_data_setup(cf, data);
-  if(*err)
+  result = h3_data_setup(cf, data);
+  if(result)
     goto out;
   stream = H3_STREAM_CTX(ctx, data);
   DEBUGASSERT(stream);
   if(!stream) {
-    *err = CURLE_FAILED_INIT;
+    result = CURLE_FAILED_INIT;
     goto out;
   }
 
-  nwritten = Curl_h1_req_parse_read(&stream->h1, buf, len, NULL,
-                                    !data->state.http_ignorecustom ?
-                                    data->set.str[STRING_CUSTOMREQUEST] : NULL,
-                                    0, err);
-  if(nwritten < 0)
+  result = Curl_h1_req_parse_read(&stream->h1, buf, len, NULL,
+                                  !data->state.http_ignorecustom ?
+                                  data->set.str[STRING_CUSTOMREQUEST] : NULL,
+                                  0, pnwritten);
+  if(result)
     goto out;
   if(!stream->h1.done) {
     /* need more data */
@@ -1912,19 +1912,16 @@ static ssize_t h3_stream_open(struct Curl_cfilter *cf,
   }
   DEBUGASSERT(stream->h1.req);
 
-  *err = Curl_http_req_to_h2(&h2_headers, stream->h1.req, data);
-  if(*err) {
-    nwritten = -1;
+  result = Curl_http_req_to_h2(&h2_headers, stream->h1.req, data);
+  if(result)
     goto out;
-  }
   /* no longer needed */
   Curl_h1_req_parse_free(&stream->h1);
 
   nheader = Curl_dynhds_count(&h2_headers);
   nva = malloc(sizeof(nghttp3_nv) * nheader);
   if(!nva) {
-    *err = CURLE_OUT_OF_MEMORY;
-    nwritten = -1;
+    result = CURLE_OUT_OF_MEMORY;
     goto out;
   }
 
@@ -1938,11 +1935,11 @@ static ssize_t h3_stream_open(struct Curl_cfilter *cf,
   }
 
   DEBUGASSERT(stream->s.id == -1);
-  *err = cf_osslq_stream_open(&stream->s, ctx->tls.ossl.ssl, 0,
-                              &ctx->stream_bufcp, data);
-  if(*err) {
+  result = cf_osslq_stream_open(&stream->s, ctx->tls.ossl.ssl, 0,
+                                &ctx->stream_bufcp, data);
+  if(result) {
     failf(data, "cannot get bidi streams");
-    *err = CURLE_SEND_ERROR;
+    result = CURLE_SEND_ERROR;
     goto out;
   }
 
@@ -1983,8 +1980,7 @@ static ssize_t h3_stream_open(struct Curl_cfilter *cf,
                   stream->s.id, rc, nghttp3_strerror(rc));
       break;
     }
-    *err = CURLE_SEND_ERROR;
-    nwritten = -1;
+    result = CURLE_SEND_ERROR;
     goto out;
   }
 
@@ -2002,7 +1998,7 @@ static ssize_t h3_stream_open(struct Curl_cfilter *cf,
 out:
   free(nva);
   Curl_dynhds_free(&h2_headers);
-  return nwritten;
+  return result;
 }
 
 static CURLcode cf_osslq_send(struct Curl_cfilter *cf, struct Curl_easy *data,
@@ -2012,7 +2008,6 @@ static CURLcode cf_osslq_send(struct Curl_cfilter *cf, struct Curl_easy *data,
   struct cf_osslq_ctx *ctx = cf->ctx;
   struct h3_stream_ctx *stream = NULL;
   struct cf_call_data save;
-  ssize_t nwritten;
   CURLcode result = CURLE_OK;
 
   (void)eos; /* use to end stream */
@@ -2032,13 +2027,12 @@ static CURLcode cf_osslq_send(struct Curl_cfilter *cf, struct Curl_easy *data,
 
   stream = H3_STREAM_CTX(ctx, data);
   if(!stream || stream->s.id < 0) {
-    nwritten = h3_stream_open(cf, data, buf, len, &result);
-    if(nwritten < 0) {
+    result = h3_stream_open(cf, data, buf, len, pnwritten);
+    if(result) {
       CURL_TRC_CF(data, cf, "failed to open stream -> %d", result);
       goto out;
     }
     stream = H3_STREAM_CTX(ctx, data);
-    *pnwritten = (size_t)nwritten;
   }
   else if(stream->closed) {
     if(stream->resp_hds_complete) {
index 02b679ab8431375ceb1a40df1f0b246353a72b73..0ab7e0c296d0494421752857158f2edd85ca79ed 100644 (file)
@@ -977,7 +977,6 @@ static CURLcode h3_open_stream(struct Curl_cfilter *cf,
   struct dynhds h2_headers;
   quiche_h3_header *nva = NULL;
   CURLcode result = CURLE_OK;
-  ssize_t nwritten;
 
   *pnwritten = 0;
   if(!stream) {
@@ -991,11 +990,12 @@ static CURLcode h3_open_stream(struct Curl_cfilter *cf,
   Curl_dynhds_init(&h2_headers, 0, DYN_HTTP_REQUEST);
 
   DEBUGASSERT(stream);
-  nwritten = Curl_h1_req_parse_read(&stream->h1, buf, blen, NULL,
+
+  result = Curl_h1_req_parse_read(&stream->h1, buf, blen, NULL,
                                     !data->state.http_ignorecustom ?
                                     data->set.str[STRING_CUSTOMREQUEST] : NULL,
-                                    0, &result);
-  if(nwritten < 0)
+                                    0, pnwritten);
+  if(result)
     goto out;
   if(!stream->h1.done) {
     /* need more data */
@@ -1025,7 +1025,6 @@ static CURLcode h3_open_stream(struct Curl_cfilter *cf,
     nva[i].value_len = e->valuelen;
   }
 
-  *pnwritten = (size_t)nwritten;
   buf += *pnwritten;
   blen -= *pnwritten;
 
index a8ed09f1c2b5e1009d61fc18f7d9a33f8dd79f00..61295de37e1ddfc15aa2430f789701325e50f6c8 100644 (file)
@@ -66,7 +66,7 @@ static void parse_success(const struct tcase *t)
   const char *buf;
   size_t buflen, i, in_len, in_consumed;
   CURLcode err;
-  ssize_t nread;
+  size_t nread;
 
   Curl_h1_req_parse_init(&p, 1024);
   in_len = in_consumed = 0;
@@ -74,14 +74,14 @@ static void parse_success(const struct tcase *t)
     buf = t->input[i];
     buflen = strlen(buf);
     in_len += buflen;
-    nread = Curl_h1_req_parse_read(&p, buf, buflen, t->default_scheme,
-                                   t->custom_method, 0, &err);
-    if(nread < 0) {
+    err = Curl_h1_req_parse_read(&p, buf, buflen, t->default_scheme,
+                                 t->custom_method, 0, &nread);
+    if(err) {
       curl_mfprintf(stderr, "got err %d parsing: '%s'\n", err, buf);
       fail("error consuming");
     }
     in_consumed += (size_t)nread;
-    if((size_t)nread != buflen) {
+    if(nread != buflen) {
       if(!p.done) {
         curl_mfprintf(stderr, "only %zd/%zu consumed for: '%s'\n",
                       nread, buflen, buf);