decoder not working on ARM
Brought to you by:
devolve
Due to (my guess) char being unsigned by default on ARM platforms (Symbian - Nokia E72 in my case) the decoder does not work as expected. I replaced 'char' with 'signed char' as argument to 'base64_decode_value' and 'fragment', which made it work for me.
View and moderate all "bugs Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Bugs"
Some more information about the signed vs unsigned issue http://www.network-theory.co.uk/docs/gccintro/gccintro_71.html
Confirming bug and workaround. I am using CodeSourcery compiler for Arm Cortex M3. Decoded strings seemed to get 0x0F 0xBE appended to the tail end. Changing "char" to "signed char" works and doesn't seem to break the x86 code. Below is a diff of the changes:
diff --git a/cdecode.c b/cdecode.c
index 3f0d62d..7b2aad0 100755
--- a/cdecode.c
+++ b/cdecode.c
@@ -7,7 +7,7 @@ For details, see http://sourceforge.net/projects/libb64
#include <cdecode.h>
-int base64_decode_value(signed char value_in)
+int base64_decode_value(char value_in)
{
static const char decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51};
static const char decoding_size = sizeof(decoding);
@@ -26,7 +26,7 @@ int base64_decode_block(const char* code_in, const int length_in, char* plaintex
{
const char* codechar = code_in;
char* plainchar = plaintext_out;
- signed char fragment;
+ char fragment;
*plainchar = state_in->plainchar;
diff --git a/cdecode.h b/cdecode.h
index 2f65f8c..d0d7f48 100755
--- a/cdecode.h
+++ b/cdecode.h
@@ -21,7 +21,7 @@ typedef struct
void base64_init_decodestate(base64_decodestate* state_in);
-int base64_decode_value(signed char value_in);
+int base64_decode_value(char value_in);
int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in);