提交 595b2a42 编写于 作者: R Rich Salz

Check fflush on BIO_ctrl call

Bug found and fix suggested by Julian Rüth.
Push error if fflush fails
Reviewed-by: NRichard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/3266)
上级 5cc97761
...@@ -190,6 +190,7 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr) ...@@ -190,6 +190,7 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr)
FILE *fp = (FILE *)b->ptr; FILE *fp = (FILE *)b->ptr;
FILE **fpp; FILE **fpp;
char p[4]; char p[4];
int st;
switch (cmd) { switch (cmd) {
case BIO_C_FILE_SEEK: case BIO_C_FILE_SEEK:
...@@ -317,10 +318,14 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr) ...@@ -317,10 +318,14 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr)
b->shutdown = (int)num; b->shutdown = (int)num;
break; break;
case BIO_CTRL_FLUSH: case BIO_CTRL_FLUSH:
if (b->flags & BIO_FLAGS_UPLINK) st = b->flags & BIO_FLAGS_UPLINK
UP_fflush(b->ptr); ? UP_fflush(b->ptr) : fflush((FILE *)b->ptr);
else if (st == EOF) {
fflush((FILE *)b->ptr); 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; break;
case BIO_CTRL_DUP: case BIO_CTRL_DUP:
ret = 1; ret = 1;
......
...@@ -82,6 +82,7 @@ static ERR_STRING_DATA ERR_str_functs[] = { ...@@ -82,6 +82,7 @@ static ERR_STRING_DATA ERR_str_functs[] = {
{ERR_PACK(0, SYS_F_GETSOCKOPT, 0), "getsockopt"}, {ERR_PACK(0, SYS_F_GETSOCKOPT, 0), "getsockopt"},
{ERR_PACK(0, SYS_F_GETSOCKNAME, 0), "getsockname"}, {ERR_PACK(0, SYS_F_GETSOCKNAME, 0), "getsockname"},
{ERR_PACK(0, SYS_F_GETHOSTBYNAME, 0), "gethostbyname"}, {ERR_PACK(0, SYS_F_GETHOSTBYNAME, 0), "gethostbyname"},
{ERR_PACK(0, SYS_F_FFLUSH, 0), "fflush"},
{0, NULL}, {0, NULL},
}; };
......
...@@ -159,6 +159,7 @@ typedef struct err_state_st { ...@@ -159,6 +159,7 @@ typedef struct err_state_st {
# define SYS_F_GETSOCKOPT 15 # define SYS_F_GETSOCKOPT 15
# define SYS_F_GETSOCKNAME 16 # define SYS_F_GETSOCKNAME 16
# define SYS_F_GETHOSTBYNAME 17 # define SYS_F_GETHOSTBYNAME 17
# define SYS_F_FFLUSH 18
/* reasons */ /* reasons */
# define ERR_R_SYS_LIB ERR_LIB_SYS/* 2 */ # define ERR_R_SYS_LIB ERR_LIB_SYS/* 2 */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册