Source: libu2f-server
Version: 0.0.0-1
Tags: patch

It's a recognisable pattern of failures on architectures with an
unsigned char:

https://buildd.debian.org/status/package.php?p=libu2f-server&suite=sid

The attached patch seems to fix the problem.
diff -ru libu2f-server-0.0.0.orig/u2f-server/cdecode.c libu2f-server-0.0.0/u2f-server/cdecode.c
--- libu2f-server-0.0.0.orig/u2f-server/cdecode.c	2014-11-24 14:29:01.000000000 +0000
+++ libu2f-server-0.0.0/u2f-server/cdecode.c	2015-05-28 21:56:13.270000000 +0000
@@ -9,7 +9,7 @@
 
 int base64_decode_value(char value_in)
 {
-  static const char decoding[] =
+  static const signed char decoding[] =
       { 62, -1, -1, 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,
@@ -35,11 +35,12 @@
 
 int
 base64_decode_block(const char *code_in, const int length_in,
-                    char *plaintext_out, base64_decodestate * state_in)
+                    char *plaintext_out_, base64_decodestate * state_in)
 {
   const char *codechar = code_in;
-  char *plainchar = plaintext_out;
-  char fragment;
+  unsigned char *plaintext_out = (unsigned char *) plaintext_out_;
+  unsigned char *plainchar = plaintext_out;
+  signed char fragment;
 
   *plainchar = state_in->plainchar;
 
@@ -52,7 +53,7 @@
           state_in->plainchar = *plainchar;
           return plainchar - plaintext_out;
         }
-        fragment = (char) base64_decode_value(*codechar++);
+        fragment = (signed char) base64_decode_value(*codechar++);
       }
       while (fragment < 0);
       *plainchar = (fragment & 0x03f) << 2;
@@ -63,7 +64,7 @@
           state_in->plainchar = *plainchar;
           return plainchar - plaintext_out;
         }
-        fragment = (char) base64_decode_value(*codechar++);
+        fragment = (signed char) base64_decode_value(*codechar++);
       }
       while (fragment < 0);
       *plainchar++ |= (fragment & 0x030) >> 4;
@@ -75,7 +76,7 @@
           state_in->plainchar = *plainchar;
           return plainchar - plaintext_out;
         }
-        fragment = (char) base64_decode_value(*codechar++);
+        fragment = (signed char) base64_decode_value(*codechar++);
       }
       while (fragment < 0);
       *plainchar++ |= (fragment & 0x03c) >> 2;
@@ -87,7 +88,7 @@
           state_in->plainchar = *plainchar;
           return plainchar - plaintext_out;
         }
-        fragment = (char) base64_decode_value(*codechar++);
+        fragment = (signed char) base64_decode_value(*codechar++);
       }
       while (fragment < 0);
       *plainchar++ |= (fragment & 0x03f);

Reply via email to