diff options
Diffstat (limited to 'src/out-limd.c')
| -rw-r--r-- | src/out-limd.c | 12 |
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: |
