GitHub

@@ -1478,7 +1478,23 @@ pack_uu(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, int count)

1478147814791479

if (count <= 1) count = 45; /* default line length for UU-encoding */

148014801481-

str_len_ensure(mrb, dst, didx + ((slen * 4 + 2) / 3) + (slen / count + 1) * 2);

1481+

/* Calculate buffer size by accounting for per-line encoding

1482+

* Each line encodes separately, so padding happens per line, not globally

1483+

*/

1484+

mrb_int num_lines = (slen + count - 1) / count; /* Number of lines */

1485+

mrb_int total_encoded = 0;

1486+

mrb_int temp_slen = slen;

1487+1488+

/* Calculate actual encoded size line by line */

1489+

while (temp_slen > 0) {

1490+

mrb_int line_len = (temp_slen > count) ? count : temp_slen;

1491+

total_encoded += ((line_len + 2) / 3) * 4; /* Each line's encoded size */

1492+

temp_slen -= line_len;

1493+

}

1494+1495+

/* Total buffer = encoded data + (length char + newline) per line + terminating line */

1496+

mrb_int buffer_size = total_encoded + num_lines * 2 + 2;

1497+

str_len_ensure(mrb, dst, didx + buffer_size);

14821498

char *dptr = RSTRING_PTR(dst) + didx;

1483149914841500

while (slen > 0) {

Read the original on github.com ↗