From 7db77fbf36b7f8c77ea7e5dc91c6477b65a628ff Mon Sep 17 00:00:00 2001 From: Tomasz Kojm Date: Mon, 11 Feb 2008 10:21:03 +0000 Subject: [PATCH] improve I/O error handling in cli_filetype2 (bb#818) git-svn: trunk@3605 --- ChangeLog | 4 ++++ libclamav/filetypes.c | 9 ++++++--- libclamav/scanners.c | 4 ++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index dd9741b6d..63da559e1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Mon Feb 11 11:09:10 CET 2008 (tk) +--------------------------------- + * libclamav/filetypes.c: improve I/O error handling in cli_filetype2 (bb#818) + Sun Feb 10 10:28:55 EET 2008 (edwin) ------------------------------------ * configure, configure.in: don't use EXIT_SUCCESS if is not diff --git a/libclamav/filetypes.c b/libclamav/filetypes.c index 554a40130..88461f565 100644 --- a/libclamav/filetypes.c +++ b/libclamav/filetypes.c @@ -149,8 +149,11 @@ cli_file_t cli_filetype2(int desc, const struct cl_engine *engine) } memset(smallbuff, 0, sizeof(smallbuff)); - if((bread = read(desc, smallbuff, MAGIC_BUFFER_SIZE)) > 0) - ret = cli_filetype(smallbuff, bread, engine); + bread = cli_readn(desc, smallbuff, MAGIC_BUFFER_SIZE); + if(bread == -1) + return CL_TYPE_ERROR; + + ret = cli_filetype(smallbuff, bread, engine); if(ret >= CL_TYPE_TEXT_ASCII && ret <= CL_TYPE_BINARY_DATA) { /* HTML files may contain special characters and could be @@ -230,7 +233,7 @@ cli_file_t cli_filetype2(int desc, const struct cl_engine *engine) return ret; lseek(desc, 0, SEEK_SET); - if((bread = read(desc, bigbuff, 37638)) > 0) { + if((bread = cli_readn(desc, bigbuff, 37638)) > 0) { bigbuff[bread] = 0; diff --git a/libclamav/scanners.c b/libclamav/scanners.c index 73f189bcc..8964855dd 100644 --- a/libclamav/scanners.c +++ b/libclamav/scanners.c @@ -1838,6 +1838,10 @@ int cli_magic_scandesc(int desc, cli_ctx *ctx) lseek(desc, 0, SEEK_SET); type = cli_filetype2(desc, ctx->engine); + if(type == CL_TYPE_ERROR) { + cli_dbgmsg("cli_magic_scandesc: cli_filetype2 returned CL_TYPE_ERROR\n"); + return CL_EIO; + } lseek(desc, 0, SEEK_SET); if(type != CL_TYPE_IGNORED && ctx->engine->sdb) {