diff options
Diffstat (limited to 'src/base64.c')
| -rw-r--r-- | src/base64.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/src/base64.c b/src/base64.c index 1595bd0..7870a79 100644 --- a/src/base64.c +++ b/src/base64.c | |||
| @@ -105,22 +105,23 @@ static int base64decode_block(unsigned char *target, const char *data, size_t da | |||
| 105 | 105 | ||
| 106 | unsigned char *base64decode(const char *buf, size_t *size) | 106 | unsigned char *base64decode(const char *buf, size_t *size) |
| 107 | { | 107 | { |
| 108 | if (!buf) return NULL; | 108 | if (!buf || !size) return NULL; |
| 109 | size_t len = strlen(buf); | 109 | size_t len = (*size > 0) ? *size : strlen(buf); |
| 110 | if (len <= 0) return NULL; | 110 | if (len <= 0) return NULL; |
| 111 | unsigned char *outbuf = (unsigned char*)malloc((len/4)*3+3); | 111 | unsigned char *outbuf = (unsigned char*)malloc((len/4)*3+3); |
| 112 | const char *ptr = buf; | 112 | const char *ptr = buf; |
| 113 | int p = 0; | 113 | int p = 0; |
| 114 | size_t l = 0; | ||
| 114 | 115 | ||
| 115 | do { | 116 | do { |
| 116 | ptr += strspn(ptr, "\r\n\t "); | 117 | ptr += strspn(ptr, "\r\n\t "); |
| 117 | if (*ptr == '\0') { | 118 | if (*ptr == '\0' || ptr >= buf+len) { |
| 118 | break; | 119 | break; |
| 119 | } | 120 | } |
| 120 | len = strcspn(ptr, "\r\n\t "); | 121 | l = strcspn(ptr, "\r\n\t "); |
| 121 | if (len > 3) { | 122 | if (l > 3 && ptr+l <= buf+len) { |
| 122 | p+=base64decode_block(outbuf+p, ptr, len); | 123 | p+=base64decode_block(outbuf+p, ptr, l); |
| 123 | ptr += len; | 124 | ptr += l; |
| 124 | } else { | 125 | } else { |
| 125 | break; | 126 | break; |
| 126 | } | 127 | } |
