summaryrefslogtreecommitdiffstats
path: root/src/base64.c
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2016-12-14 02:32:47 +0100
committerGravatar Nikias Bassen2016-12-14 02:32:47 +0100
commitae8b7a0f1a5cf569f52f35fc1f113d0c4f354f6e (patch)
tree786305d69ec6a23442adbce187d826eb14848c02 /src/base64.c
parent5e8fb617b8f7857693e7b41f56eaa6767ed6a54d (diff)
downloadlibplist-ae8b7a0f1a5cf569f52f35fc1f113d0c4f354f6e.tar.gz
libplist-ae8b7a0f1a5cf569f52f35fc1f113d0c4f354f6e.tar.bz2
base64: Prevent use of strlen() in base64decode when input buffer size is known
Diffstat (limited to 'src/base64.c')
-rw-r--r--src/base64.c15
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
106unsigned char *base64decode(const char *buf, size_t *size) 106unsigned 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 }