for (i = 0; (i < slen) && (len < blen); i++)
{
- if (src[i] == '%')
- {
- if (((i+2) < slen) && isxdigit(src[i+1]) && isxdigit(src[i+2]))
- {
- buf[len++] = (char)(16 * hex(src[i+1]) + hex(src[i+2]));
- i += 2;
- }
- else
- {
- /* Encoding error: it's hard to think of a
- ** scenario in which returning an incorrect
- ** 'decoding' of the malformed string is
- ** preferable to signaling an error condition. */
- #if 0 /* WORSE_IS_BETTER */
- buf[len++] = '%';
- #else
- return -2;
- #endif
- }
- }
- else
- {
+ if (src[i] != '%') {
buf[len++] = src[i];
+ continue;
}
+
+ if (i + 2 >= slen || !isxdigit(src[i + 1]) || !isxdigit(src[i + 2]))
+ return -2;
+
+ buf[len++] = (char)(16 * hex(src[i+1]) + hex(src[i+2]));
+ i += 2;
}
+ buf[len] = 0;
return (i == slen) ? len : -1;
}
int uh_b64decode(char *buf, int blen, const unsigned char *src, int slen)
{
- int i = 0;
- int len = 0;
-
- unsigned int cin = 0;
unsigned int cout = 0;
-
+ unsigned int cin = 0;
+ int len = 0;
+ int i = 0;
for (i = 0; (i <= slen) && (src[i] != 0); i++)
{
cout = (cout << 6) | cin;
- if ((i % 4) == 3)
- {
- if ((len + 3) < blen)
- {
- buf[len++] = (char)(cout >> 16);
- buf[len++] = (char)(cout >> 8);
- buf[len++] = (char)(cout);
- }
- else
- {
- break;
- }
- }
+ if ((i % 4) != 3)
+ continue;
+
+ if ((len + 3) >= blen)
+ break;
+
+ buf[len++] = (char)(cout >> 16);
+ buf[len++] = (char)(cout >> 8);
+ buf[len++] = (char)(cout);
}
buf[len++] = 0;