Commit 913d3a64 authored by Rich Salz's avatar Rich Salz
Browse files

Check fflush on BIO_ctrl call



Bug found and fix suggested by Julian Rüth.
Push error if fflush fails

Reviewed-by: default avatarRichard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/3266)
(cherry picked from commit 595b2a42)
parent c4a53021
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -186,6 +186,7 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr)
    FILE *fp = (FILE *)b->ptr;
    FILE **fpp;
    char p[4];
    int st;

    switch (cmd) {
    case BIO_C_FILE_SEEK:
@@ -313,10 +314,14 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr)
        b->shutdown = (int)num;
        break;
    case BIO_CTRL_FLUSH:
        if (b->flags & BIO_FLAGS_UPLINK)
            UP_fflush(b->ptr);
        else
            fflush((FILE *)b->ptr);
        st = b->flags & BIO_FLAGS_UPLINK
                ? UP_fflush(b->ptr) : fflush((FILE *)b->ptr);
        if (st == EOF) {
            SYSerr(SYS_F_FFLUSH, get_last_sys_error());
            ERR_add_error_data(1, "fflush()");
            BIOerr(BIO_F_FILE_CTRL, ERR_R_SYS_LIB);
            ret = 0;
        }
        break;
    case BIO_CTRL_DUP:
        ret = 1;
+1 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ static ERR_STRING_DATA ERR_str_functs[] = {
    {ERR_PACK(0, SYS_F_GETSOCKOPT, 0), "getsockopt"},
    {ERR_PACK(0, SYS_F_GETSOCKNAME, 0), "getsockname"},
    {ERR_PACK(0, SYS_F_GETHOSTBYNAME, 0), "gethostbyname"},
    {ERR_PACK(0, SYS_F_FFLUSH, 0), "fflush"},
    {0, NULL},
};

+1 −0
Original line number Diff line number Diff line
@@ -159,6 +159,7 @@ typedef struct err_state_st {
# define SYS_F_GETSOCKOPT        15
# define SYS_F_GETSOCKNAME       16
# define SYS_F_GETHOSTBYNAME     17
# define SYS_F_FFLUSH            18

/* reasons */
# define ERR_R_SYS_LIB   ERR_LIB_SYS/* 2 */