summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2026-05-22 15:00:16 +0200
committerGravatar Nikias Bassen2026-05-22 15:00:16 +0200
commit9d4f14a0ba93dc39d516b5e1c1cd107693b81629 (patch)
tree5b11003763da40aff38d607d31a0e7f6f3f013da
parentd35b31d0a2661b6346a1592a5eb7b70e66b2a141 (diff)
downloadlibplist-9d4f14a0ba93dc39d516b5e1c1cd107693b81629.tar.gz
libplist-9d4f14a0ba93dc39d516b5e1c1cd107693b81629.tar.bz2
out-limd: Fix memory buffer allocation size (#313)
Credit to @Bri1987
-rw-r--r--src/out-limd.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/out-limd.c b/src/out-limd.c
index 35247fb..8d42c9d 100644
--- a/src/out-limd.c
+++ b/src/out-limd.c
@@ -190,17 +190,23 @@ static plist_err_t node_to_string(node_t node, bytearray_t **outbuf, uint32_t de
190 } break; 190 } break;
191 case PLIST_DATA: 191 case PLIST_DATA:
192 { 192 {
193 val = (char*)malloc(4096); 193#define BASE64_CHUNK_SIZE 3072
194#define BASE64_BUF_SIZE (4 * ((BASE64_CHUNK_SIZE + 2) / 3) + 4)
195 val = (char*)malloc(BASE64_BUF_SIZE);
196 if (!val) return PLIST_ERR_NO_MEM;
194 size_t done = 0; 197 size_t done = 0;
195 while (done < node_data->length) { 198 while (done < node_data->length) {
196 size_t amount = node_data->length - done; 199 size_t amount = node_data->length - done;
197 if (amount > 3072) { 200 if (amount > BASE64_CHUNK_SIZE) {
198 amount = 3072; 201 amount = BASE64_CHUNK_SIZE;
199 } 202 }
200 size_t bsize = base64encode(val, node_data->buff + done, amount); 203 size_t bsize = base64encode(val, node_data->buff + done, amount);
201 str_buf_append(*outbuf, val, bsize); 204 str_buf_append(*outbuf, val, bsize);
202 done += amount; 205 done += amount;
203 } 206 }
207 free(val);
208#undef BASE64_CHUNK_SIZE
209#undef BASE64_BUF_SIZE
204 } 210 }
205 break; 211 break;
206 case PLIST_DATE: 212 case PLIST_DATE: