Using the patch by Pan Chen as inspiration, this avoids a memory leak by
using a global BIO_METHOD pointer that doesn't ordinarily need to be
freed.

CC: Pan Chen <[email protected]>

Signed-off-by: Eneas U de Queiroz <[email protected]>

---
Run-tested with a WRT-3200ACM, running uclient_fetch and uhttpd.
I have not run it with valgrind or any other debugger.

diff --git a/ustream-io-openssl.c b/ustream-io-openssl.c
index 606ed4a..26b3ed5 100644
--- a/ustream-io-openssl.c
+++ b/ustream-io-openssl.c
@@ -116,20 +116,23 @@ static long s_ustream_ctrl(BIO *b, int cmd, long num, 
void *ptr)
        };
 }
 
+static BIO_METHOD *methods_ustream = NULL;
+
 static BIO *ustream_bio_new(struct ustream *s)
 {
        BIO *bio;
 
-       BIO_METHOD *methods_ustream;
-
-       methods_ustream = BIO_meth_new(100 | BIO_TYPE_SOURCE_SINK, "ustream");
-       BIO_meth_set_write(methods_ustream, s_ustream_write);
-       BIO_meth_set_read(methods_ustream, s_ustream_read);
-       BIO_meth_set_puts(methods_ustream, s_ustream_puts);
-       BIO_meth_set_gets(methods_ustream, s_ustream_gets);
-       BIO_meth_set_ctrl(methods_ustream, s_ustream_ctrl);
-       BIO_meth_set_create(methods_ustream, s_ustream_new);
-       BIO_meth_set_destroy(methods_ustream, s_ustream_free);
+       if (methods_ustream == NULL) {
+               methods_ustream = BIO_meth_new(100 | BIO_TYPE_SOURCE_SINK,
+                                              "ustream");
+               BIO_meth_set_write(methods_ustream, s_ustream_write);
+               BIO_meth_set_read(methods_ustream, s_ustream_read);
+               BIO_meth_set_puts(methods_ustream, s_ustream_puts);
+               BIO_meth_set_gets(methods_ustream, s_ustream_gets);
+               BIO_meth_set_ctrl(methods_ustream, s_ustream_ctrl);
+               BIO_meth_set_create(methods_ustream, s_ustream_new);
+               BIO_meth_set_destroy(methods_ustream, s_ustream_free);
+       }
        bio = BIO_new(methods_ustream);
        BIO_set_data(bio, s);
 

_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to