]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
Change approach to SSL_pending API
authorHugo Landau <hlandau@openssl.org>
Fri, 29 Mar 2024 14:51:35 +0000 (14:51 +0000)
committerTomas Mraz <tomas@openssl.org>
Wed, 10 Apr 2024 13:49:00 +0000 (15:49 +0200)
Reviewed-by: Neil Horman <nhorman@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/24040)

(cherry picked from commit 5a13d35f243be66f6ad914aefe99fb708812dff1)

include/internal/quic_stream_map.h
ssl/quic/quic_impl.c

index 55a395de16e7343540f57aa6df0147db7871d3a9..745d9c03d4933c7f7c2ad6bd8bce3b485d6fce17 100644 (file)
@@ -504,10 +504,11 @@ static ossl_inline ossl_unused int ossl_quic_stream_recv_get_final_size(const QU
 }
 
 /*
- * Determines the number of bytes available still to be read, and whether a FIN
- * has yet to be read.
+ * Determines the number of bytes available still to be read, and (if
+ * include_fin is 1) whether a FIN or reset has yet to be read.
  */
-static ossl_inline ossl_unused int ossl_quic_stream_recv_pending(const QUIC_STREAM *s)
+static ossl_inline ossl_unused int ossl_quic_stream_recv_pending(const QUIC_STREAM *s,
+                                                                 int include_fin)
 {
     size_t avail;
     int fin = 0;
@@ -523,13 +524,13 @@ static ossl_inline ossl_unused int ossl_quic_stream_recv_pending(const QUIC_STRE
         if (!ossl_quic_rstream_available(s->rstream, &avail, &fin))
             avail = 0;
 
-        if (avail == 0 && fin)
+        if (avail == 0 && include_fin && fin)
             avail = 1;
 
         return avail;
 
     case QUIC_RSTREAM_STATE_RESET_RECVD:
-        return 1;
+        return include_fin;
 
     case QUIC_RSTREAM_STATE_DATA_READ:
     case QUIC_RSTREAM_STATE_RESET_READ:
index 62ebcd29aa89874505be30ca4d44fd82136ba4e2..c77230a19f0a18320057fced0c3d58f8f86d4716 100644 (file)
@@ -2472,6 +2472,11 @@ static int quic_write_nonblocking_epw(QCTX *ctx, const void *buf, size_t len,
 
     quic_post_write(xso, *written > 0, *written == len, flags,
                     qctx_should_autotick(ctx));
+
+    if (*written == 0)
+        /* SSL_write_ex returns 0 if it didn't read anything. */
+        return QUIC_RAISE_NORMAL_ERROR(ctx, SSL_ERROR_WANT_READ);
+
     return 1;
 }
 
@@ -2874,11 +2879,13 @@ static size_t ossl_quic_pending_int(const SSL *s, int check_channel)
     }
 
     if (check_channel)
-        avail = ossl_quic_stream_recv_pending(ctx.xso->stream)
+        avail = ossl_quic_stream_recv_pending(ctx.xso->stream,
+                                              /*include_fin=*/1)
              || ossl_quic_channel_has_pending(ctx.qc->ch)
              || ossl_quic_channel_is_term_any(ctx.qc->ch);
     else
-        avail = ossl_quic_stream_recv_pending(ctx.xso->stream);
+        avail = ossl_quic_stream_recv_pending(ctx.xso->stream,
+                                              /*include_fin=*/0);
 
 out:
     quic_unlock(ctx.qc);