# HG changeset patch # User John W. Eaton # Date 1381372723 14400 # Node ID d41c8f96ed0653fe2639a1bab3e7fa8a4ed8f362 # Parent 83e6baf0bc3f6fbebed081efe7ab9e896fe22cd3 avoid memory leaks in base_64_encode and base_64_decode (bug #40228) * data.cc (Fbase64_encode): Free array allocated by octave_base64_encode. * oct-base64.cc (octave_base64_decode): Free array allocated by base64_decode_alloc. diff -r 83e6baf0bc3f -r d41c8f96ed06 libinterp/corefcn/data.cc --- a/libinterp/corefcn/data.cc Wed Oct 09 12:26:40 2013 -0700 +++ b/libinterp/corefcn/data.cc Wed Oct 09 22:38:43 2013 -0400 @@ -7343,10 +7343,13 @@ reinterpret_cast (in.data ()); \ char* out; \ if (! error_state \ - && octave_base64_encode (inc, inlen, &out)) \ - retval(0) = octave_value (out); \ + && octave_base64_encode (inc, inlen, &out)) \ + { \ + retval(0) = octave_value (out); \ + ::free (out); \ + } \ } - + MAKE_INT_BRANCH(int8) else MAKE_INT_BRANCH(int16) else MAKE_INT_BRANCH(int32) @@ -7370,7 +7373,10 @@ char* out; if (! error_state && octave_base64_encode (inc, inlen, &out)) - retval(0) = octave_value (out); + { + retval(0) = octave_value (out); + ::free (out); + } } else { @@ -7382,7 +7388,10 @@ char* out; if (! error_state && octave_base64_encode (inc, inlen, &out)) - retval(0) = octave_value (out); + { + retval(0) = octave_value (out); + ::free (out); + } } } return retval; diff -r 83e6baf0bc3f -r d41c8f96ed06 liboctave/util/oct-base64.cc --- a/liboctave/util/oct-base64.cc Wed Oct 09 12:26:40 2013 -0700 +++ b/liboctave/util/oct-base64.cc Wed Oct 09 22:38:43 2013 -0400 @@ -82,6 +82,7 @@ retval.resize (dim_vector (1, len)); double *dout = reinterpret_cast (out); std::copy (dout, dout + len, retval.fortran_vec ()); + ::free (out); } }