From cc1979b4cffff41feff8f61ccc99422237f21194 Mon Sep 17 00:00:00 2001 From: ahodgkinson Date: Thu, 8 Feb 2007 21:31:03 +0000 Subject: [PATCH] Added FlmReadFully() and enhanced the base64 decoder. git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@1015 0109f412-320b-0410-ab79-c3e0c5ffbbe6 --- ftk/src/ftk.h | 7 +++- ftk/src/ftkfsys.cpp | 2 +- ftk/src/ftkstrm.cpp | 97 +++++++++++++++++++++++++++++++++++---------- ftk/src/ftkunix.cpp | 4 +- 4 files changed, 85 insertions(+), 25 deletions(-) diff --git a/ftk/src/ftk.h b/ftk/src/ftk.h index 8511c13..6424740 100644 --- a/ftk/src/ftk.h +++ b/ftk/src/ftk.h @@ -2,7 +2,7 @@ // Desc: FLAIM's cross-platform toolkit public definitions and interfaces // Tabs: 3 // -// Copyright (c) 2003-2006 Novell, Inc. All Rights Reserved. +// Copyright (c) 2003-2007 Novell, Inc. All Rights Reserved. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -1470,6 +1470,10 @@ IF_IStream * pIStream, IF_OStream * pOStream); + RCODE FLMAPI FlmReadFully( + IF_IStream * pIStream, + F_DynaBuf * pDynaBuf); + /**************************************************************************** Desc: ****************************************************************************/ @@ -7134,3 +7138,4 @@ #endif #endif // FTK_H + diff --git a/ftk/src/ftkfsys.cpp b/ftk/src/ftkfsys.cpp index 23babd7..7685c51 100644 --- a/ftk/src/ftkfsys.cpp +++ b/ftk/src/ftkfsys.cpp @@ -3338,7 +3338,7 @@ RCODE F_FileHdl::allocFileAsyncClient( *ppAsyncClient = pAsyncClient; pAsyncClient = NULL; - + Exit: if( bMutexLocked) diff --git a/ftk/src/ftkstrm.cpp b/ftk/src/ftkstrm.cpp index bae7d68..df9f7aa 100644 --- a/ftk/src/ftkstrm.cpp +++ b/ftk/src/ftkstrm.cpp @@ -1815,15 +1815,15 @@ Exit: Desc: Reads decoded binary from the base64 ASCII source stream. *****************************************************************************/ RCODE FLMAPI F_Base64DecoderIStream::read( - void * pvBuffer, - FLMUINT uiBytesToRead, - FLMUINT * puiBytesRead) + void * pvBuffer, + FLMUINT uiBytesToRead, + FLMUINT * puiBytesRead) { - RCODE rc = NE_FLM_OK; - FLMBYTE * pucOutBuf = (FLMBYTE *)pvBuffer; - FLMBYTE ucQuadBuffer[ 4]; - FLMUINT uiOffset; - FLMUINT uiBytesToCopy; + RCODE rc = NE_FLM_OK; + FLMBYTE * pucOutBuf = (FLMBYTE *)pvBuffer; + FLMBYTE ucQuadBuffer[ 4]; + FLMUINT uiOffset; + FLMUINT uiBytesToCopy; if( puiBytesRead) { @@ -1847,35 +1847,40 @@ RCODE FLMAPI F_Base64DecoderIStream::read( if( RC_BAD( rc = m_pIStream->read( &ucQuadBuffer[ uiOffset], 1, NULL))) { - if( rc != NE_FLM_EOF_HIT) + if( rc != NE_FLM_EOF_HIT || !uiOffset) { goto Exit; } + + // Handle input that has not been padded correctly - if( uiOffset) - { - rc = RC_SET( NE_FLM_BAD_BASE64_ENCODING); - } - - goto Exit; + ucQuadBuffer[ uiOffset] = ASCII_EQUAL; } if( gv_ucBase64DecodeTable[ ucQuadBuffer[ uiOffset]] == 0xFF) { FLMBYTE ucTmp = ucQuadBuffer[ uiOffset]; - if( ucTmp == ASCII_TAB || ucTmp == ASCII_SPACE || + if( ucTmp == 0 || ucTmp == ASCII_TAB || ucTmp == ASCII_SPACE || ucTmp == ASCII_NEWLINE || ucTmp == ASCII_CR) { continue; } - + rc = RC_SET( NE_FLM_BAD_BASE64_ENCODING); goto Exit; } uiOffset++; } + + // If we didn't get anything except padding, assume we are at the end + // of an incorrectly encoded buffer. + + if( ucQuadBuffer[ 0] == ASCII_EQUAL) + { + goto Exit; + } m_ucBuffer[ 0] = (gv_ucBase64DecodeTable[ ucQuadBuffer[ 0]] << 2) | @@ -3321,7 +3326,6 @@ RCODE FLMAPI FlmWriteToOStream( RCODE rc = NE_FLM_OK; FLMBYTE ucBuffer[ 512]; FLMUINT uiBufferSize = sizeof( ucBuffer); - FLMUINT uiBytesToWrite; FLMUINT uiBytesRead; for (;;) @@ -3331,19 +3335,23 @@ RCODE FLMAPI FlmWriteToOStream( { if( rc != NE_FLM_EOF_HIT) { + if( uiBytesRead) + { + (void)pOStream->write( ucBuffer, uiBytesRead); + } + goto Exit; } rc = NE_FLM_OK; - if (!uiBytesRead) + if( !uiBytesRead) { goto Exit; } } - uiBytesToWrite = uiBytesRead; - if( RC_BAD( rc = pOStream->write( ucBuffer, uiBytesToWrite))) + if( RC_BAD( rc = pOStream->write( ucBuffer, uiBytesRead))) { goto Exit; } @@ -3353,3 +3361,50 @@ Exit: return( rc); } + +/****************************************************************************** +Desc: +******************************************************************************/ +RCODE FLMAPI FlmReadFully( + IF_IStream * pIStream, + F_DynaBuf * pDynaBuf) +{ + RCODE rc = NE_FLM_OK; + FLMBYTE ucBuffer[ 512]; + FLMUINT uiBufferSize = sizeof( ucBuffer); + FLMUINT uiBytesRead; + + for (;;) + { + if( RC_BAD( rc = pIStream->read( + ucBuffer, uiBufferSize, &uiBytesRead))) + { + if( rc != NE_FLM_EOF_HIT) + { + if( uiBytesRead) + { + (void)pDynaBuf->appendData( ucBuffer, uiBytesRead); + } + + goto Exit; + } + + rc = NE_FLM_OK; + + if( !uiBytesRead) + { + goto Exit; + } + } + + if( RC_BAD( rc = pDynaBuf->appendData( ucBuffer, uiBytesRead))) + { + goto Exit; + } + } + +Exit: + + return( rc); +} + diff --git a/ftk/src/ftkunix.cpp b/ftk/src/ftkunix.cpp index a7a0b72..06ad588 100644 --- a/ftk/src/ftkunix.cpp +++ b/ftk/src/ftkunix.cpp @@ -589,7 +589,7 @@ RCODE F_FileHdl::lowLevelRead( if( aio_read( pAIO) != 0) #endif { - if( errno == EAGAIN || errno == ENOSYS) + if( errno == EAGAIN || errno == ENOSYS || errno == EINVAL) { FLMINT iBytesRead; @@ -804,7 +804,7 @@ RCODE F_FileHdl::lowLevelWrite( if( aio_write( pAIO) != 0) #endif { - if( errno == EAGAIN || errno == ENOSYS) + if( errno == EAGAIN || errno == ENOSYS || errno == EINVAL) { FLMINT iBytesWritten;