diff options
author | Mike Buland <eichlan@xagasoft.com> | 2009-07-31 17:53:02 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2009-07-31 17:53:02 +0000 |
commit | ac5fb6be210b63fd7216541679f513dc97491ede (patch) | |
tree | acbc8a91933f9e200d51f9a58f4f7b05173611ab | |
parent | 6070f3cb3fe44f17114fd58792055e9c91bd3576 (diff) | |
download | libbu++-ac5fb6be210b63fd7216541679f513dc97491ede.tar.gz libbu++-ac5fb6be210b63fd7216541679f513dc97491ede.tar.bz2 libbu++-ac5fb6be210b63fd7216541679f513dc97491ede.tar.xz libbu++-ac5fb6be210b63fd7216541679f513dc97491ede.zip |
Wow, Bu::Base64 had a bug about premature end of stream / not base64 data, now
it throws exceptions. It'll still try to process bad data for a while though.
Also, it turns out that Bu::File never reported EOS, now it does, appropriately.
I'm about to change Bu::Stream::isEOS to be Bu::Stream::isEos, this is your
warning.
-rw-r--r-- | src/base64.cpp | 10 | ||||
-rw-r--r-- | src/base64.h | 3 | ||||
-rw-r--r-- | src/file.cpp | 14 | ||||
-rw-r--r-- | src/file.h | 1 | ||||
-rw-r--r-- | src/tests/base64.cpp | 37 |
5 files changed, 59 insertions, 6 deletions
diff --git a/src/base64.cpp b/src/base64.cpp index c9a6b59..be5fe8d 100644 --- a/src/base64.cpp +++ b/src/base64.cpp | |||
@@ -1,5 +1,7 @@ | |||
1 | #include "bu/base64.h" | 1 | #include "bu/base64.h" |
2 | 2 | ||
3 | namespace Bu { subExceptionDef( Base64Exception ) } | ||
4 | |||
3 | const char Bu::Base64::tblEnc[65] = { | 5 | const char Bu::Base64::tblEnc[65] = { |
4 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" | 6 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" |
5 | }; | 7 | }; |
@@ -106,7 +108,15 @@ size_t Bu::Base64::read( void *pBuf, size_t nBytes ) | |||
106 | for( int j = 0; j < 4; j++ ) | 108 | for( int j = 0; j < 4; j++ ) |
107 | { | 109 | { |
108 | if( rNext.read( &buf[j], 1 ) == 0 ) | 110 | if( rNext.read( &buf[j], 1 ) == 0 ) |
111 | { | ||
112 | if( rNext.isEOS() ) | ||
113 | { | ||
114 | iChars = 0; | ||
115 | bEosIn = true; | ||
116 | throw Base64Exception("Premature end of stream detected while decoding Base64 data."); | ||
117 | } | ||
109 | return sIn; | 118 | return sIn; |
119 | } | ||
110 | if( buf[j] == ' ' || buf[j] == '\t' || | 120 | if( buf[j] == ' ' || buf[j] == '\t' || |
111 | buf[j] == '\n' || buf[j] == '\r' ) | 121 | buf[j] == '\n' || buf[j] == '\r' ) |
112 | { | 122 | { |
diff --git a/src/base64.h b/src/base64.h index c7fb737..a00ed0e 100644 --- a/src/base64.h +++ b/src/base64.h | |||
@@ -2,9 +2,12 @@ | |||
2 | #define BU_BASE64_H | 2 | #define BU_BASE64_H |
3 | 3 | ||
4 | #include "bu/filter.h" | 4 | #include "bu/filter.h" |
5 | #include "bu/exceptionbase.h" | ||
5 | 6 | ||
6 | namespace Bu | 7 | namespace Bu |
7 | { | 8 | { |
9 | subExceptionDecl( Base64Exception ); | ||
10 | |||
8 | /** | 11 | /** |
9 | * | 12 | * |
10 | *@ingroup Streams | 13 | *@ingroup Streams |
diff --git a/src/file.cpp b/src/file.cpp index b22461a..0b9bff2 100644 --- a/src/file.cpp +++ b/src/file.cpp | |||
@@ -16,7 +16,8 @@ | |||
16 | namespace Bu { subExceptionDef( FileException ) } | 16 | namespace Bu { subExceptionDef( FileException ) } |
17 | 17 | ||
18 | Bu::File::File( const Bu::FString &sName, int iFlags ) : | 18 | Bu::File::File( const Bu::FString &sName, int iFlags ) : |
19 | fd( -1 ) | 19 | fd( -1 ), |
20 | bEos( true ) | ||
20 | { | 21 | { |
21 | fd = ::open( sName.getStr(), getPosixFlags( iFlags ), 0666 ); | 22 | fd = ::open( sName.getStr(), getPosixFlags( iFlags ), 0666 ); |
22 | if( fd < 0 ) | 23 | if( fd < 0 ) |
@@ -24,11 +25,13 @@ Bu::File::File( const Bu::FString &sName, int iFlags ) : | |||
24 | throw Bu::FileException( errno, "%s: %s", | 25 | throw Bu::FileException( errno, "%s: %s", |
25 | strerror(errno), sName.getStr() ); | 26 | strerror(errno), sName.getStr() ); |
26 | } | 27 | } |
28 | bEos = false; | ||
27 | } | 29 | } |
28 | 30 | ||
29 | Bu::File::File( int fd ) : | 31 | Bu::File::File( int fd ) : |
30 | fd( fd ) | 32 | fd( fd ) |
31 | { | 33 | { |
34 | bEos = false; | ||
32 | } | 35 | } |
33 | 36 | ||
34 | Bu::File::~File() | 37 | Bu::File::~File() |
@@ -46,6 +49,7 @@ void Bu::File::close() | |||
46 | strerror(errno) ); | 49 | strerror(errno) ); |
47 | } | 50 | } |
48 | fd = -1; | 51 | fd = -1; |
52 | bEos = true; | ||
49 | } | 53 | } |
50 | } | 54 | } |
51 | 55 | ||
@@ -55,7 +59,11 @@ size_t Bu::File::read( void *pBuf, size_t nBytes ) | |||
55 | throw FileException("File not open."); | 59 | throw FileException("File not open."); |
56 | 60 | ||
57 | ssize_t iRead = ::read( fd, pBuf, nBytes ); | 61 | ssize_t iRead = ::read( fd, pBuf, nBytes ); |
58 | if( iRead < 0 ) | 62 | if( iRead == 0 ) |
63 | bEos = true; | ||
64 | else if( iRead == -1 && errno == EAGAIN ) | ||
65 | return 0; | ||
66 | else if( iRead < 0 ) | ||
59 | throw FileException( errno, "%s", strerror( errno ) ); | 67 | throw FileException( errno, "%s", strerror( errno ) ); |
60 | return iRead; | 68 | return iRead; |
61 | } | 69 | } |
@@ -105,7 +113,7 @@ void Bu::File::setPosEnd( long pos ) | |||
105 | 113 | ||
106 | bool Bu::File::isEOS() | 114 | bool Bu::File::isEOS() |
107 | { | 115 | { |
108 | return false; | 116 | return bEos; |
109 | } | 117 | } |
110 | 118 | ||
111 | bool Bu::File::canRead() | 119 | bool Bu::File::canRead() |
@@ -99,6 +99,7 @@ namespace Bu | |||
99 | 99 | ||
100 | private: | 100 | private: |
101 | int fd; | 101 | int fd; |
102 | bool bEos; | ||
102 | }; | 103 | }; |
103 | } | 104 | } |
104 | 105 | ||
diff --git a/src/tests/base64.cpp b/src/tests/base64.cpp index 3122d5c..5e36448 100644 --- a/src/tests/base64.cpp +++ b/src/tests/base64.cpp | |||
@@ -1,4 +1,5 @@ | |||
1 | #include "bu/file.h" | 1 | #include "bu/file.h" |
2 | #include "bu/membuf.h" | ||
2 | #include "bu/base64.h" | 3 | #include "bu/base64.h" |
3 | 4 | ||
4 | int main( int argc, char *argv[] ) | 5 | int main( int argc, char *argv[] ) |
@@ -31,12 +32,42 @@ int main( int argc, char *argv[] ) | |||
31 | Bu::File fOut( argv[1], Bu::File::WriteNew ); | 32 | Bu::File fOut( argv[1], Bu::File::WriteNew ); |
32 | Bu::Base64 bIn( fIn ); | 33 | Bu::Base64 bIn( fIn ); |
33 | 34 | ||
34 | char buf[16]; | 35 | char buf[1024]; |
35 | for(;;) | 36 | for(;;) |
36 | { | 37 | { |
37 | int iRead = bIn.read( buf, 16 ); | 38 | int iRead = bIn.read( buf, 1024 ); |
39 | printf("Read %d bytes.\n", iRead ); | ||
38 | fOut.write( buf, iRead ); | 40 | fOut.write( buf, iRead ); |
39 | if( iRead < 16 ) | 41 | if( iRead == 0 ) |
42 | break; | ||
43 | } | ||
44 | } | ||
45 | else if( argv[0][0] == 'D' ) | ||
46 | { | ||
47 | argv++; | ||
48 | Bu::MemBuf mIn; | ||
49 | { | ||
50 | Bu::File fIn( argv[0], Bu::File::Read ); | ||
51 | char buf[1024]; | ||
52 | for(;;) | ||
53 | { | ||
54 | int iRead = fIn.read( buf, 1024 ); | ||
55 | mIn.write( buf, iRead ); | ||
56 | if( iRead < 1024 ) | ||
57 | break; | ||
58 | } | ||
59 | mIn.setPos( 0 ); | ||
60 | } | ||
61 | Bu::File fOut( argv[1], Bu::File::WriteNew ); | ||
62 | Bu::Base64 bIn( mIn ); | ||
63 | |||
64 | char buf[1024]; | ||
65 | for(;;) | ||
66 | { | ||
67 | int iRead = bIn.read( buf, 1024 ); | ||
68 | printf("Read %d bytes.\n", iRead ); | ||
69 | fOut.write( buf, iRead ); | ||
70 | if( iRead == 0 ) | ||
40 | break; | 71 | break; |
41 | } | 72 | } |
42 | } | 73 | } |