Commit 49580f25 authored by Matt Caswell's avatar Matt Caswell
Browse files

Add an SSL_has_pending() function



This is similar to SSL_pending() but just returns a 1 if there is data
pending in the internal OpenSSL buffers or 0 otherwise (as opposed to
SSL_pending() which returns the number of bytes available). Unlike
SSL_pending() this will work even if "read_ahead" is set (which is the
case if you are using read pipelining, or if you are doing DTLS). A 1
return value means that we have unprocessed data. It does *not* necessarily
indicate that there will be application data returned from a call to
SSL_read(). The unprocessed data may not be application data or there
could be errors when we attempt to parse the records.

Reviewed-by: default avatarTim Hudson <tjh@openssl.org>
parent dad78fb1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1408,6 +1408,7 @@ __owur const char *SSL_get_cipher_list(const SSL *s, int n);
__owur char *SSL_get_shared_ciphers(const SSL *s, char *buf, int len);
__owur int SSL_get_read_ahead(const SSL *s);
__owur int SSL_pending(const SSL *s);
__owur int SSL_has_pending(const SSL *s);
# ifndef OPENSSL_NO_SOCK
__owur int SSL_set_fd(SSL *s, int fd);
__owur int SSL_set_rfd(SSL *s, int fd);
+2 −2
Original line number Diff line number Diff line
@@ -186,12 +186,12 @@ void RECORD_LAYER_release(RECORD_LAYER *rl)
    SSL3_RECORD_release(rl->rrec, SSL_MAX_PIPELINES);
}

int RECORD_LAYER_read_pending(RECORD_LAYER *rl)
int RECORD_LAYER_read_pending(const RECORD_LAYER *rl)
{
    return SSL3_BUFFER_get_left(&rl->rbuf) != 0;
}

int RECORD_LAYER_write_pending(RECORD_LAYER *rl)
int RECORD_LAYER_write_pending(const RECORD_LAYER *rl)
{
    return (rl->numwpipes > 0)
            && SSL3_BUFFER_get_left(&rl->wbuf[rl->numwpipes-1]) != 0;
+2 −2
Original line number Diff line number Diff line
@@ -322,8 +322,8 @@ typedef struct record_layer_st {
void RECORD_LAYER_init(RECORD_LAYER *rl, SSL *s);
void RECORD_LAYER_clear(RECORD_LAYER *rl);
void RECORD_LAYER_release(RECORD_LAYER *rl);
int RECORD_LAYER_read_pending(RECORD_LAYER *rl);
int RECORD_LAYER_write_pending(RECORD_LAYER *rl);
int RECORD_LAYER_read_pending(const RECORD_LAYER *rl);
int RECORD_LAYER_write_pending(const RECORD_LAYER *rl);
int RECORD_LAYER_set_data(RECORD_LAYER *rl, const unsigned char *buf, int len);
void RECORD_LAYER_reset_read_sequence(RECORD_LAYER *rl);
void RECORD_LAYER_reset_write_sequence(RECORD_LAYER *rl);
+16 −0
Original line number Diff line number Diff line
@@ -1310,6 +1310,22 @@ int SSL_pending(const SSL *s)
    return (s->method->ssl_pending(s));
}

int SSL_has_pending(const SSL *s)
{
    /*
     * Similar to SSL_pending() but returns a 1 to indicate that we have
     * unprocessed data available or 0 otherwise (as opposed to the number of
     * bytes available). Unlike SSL_pending() this will take into account
     * read_ahead data. A 1 return simply indicates that we have unprocessed
     * data. That data may not result in any application data, or we may fail
     * to parse the records for some reason.
     */
    if (SSL_pending(s))
        return 1;

    return RECORD_LAYER_read_pending(&s->rlayer);
}

X509 *SSL_get_peer_certificate(const SSL *s)
{
    X509 *r;
+1 −0
Original line number Diff line number Diff line
@@ -383,3 +383,4 @@ SSL_CTX_set_ct_validation_callback 382 1_1_0 EXIST::FUNCTION:CT
SSL_CTX_get_ct_validation_callback      383	1_1_0	EXIST::FUNCTION:CT
SSL_set_default_read_buffer_len         384	1_1_0	EXIST::FUNCTION:
SSL_CTX_set_default_read_buffer_len     385	1_1_0	EXIST::FUNCTION:
SSL_has_pending                         386	1_1_0	EXIST::FUNCTION:
Loading