aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2012-03-15 12:13:28 +0100
committerSverker Eriksson <[email protected]>2012-03-15 12:30:34 +0100
commit2fbe8cc9b3f6f443ccccfaa485b05966aacc65d9 (patch)
tree2cc1d689b84b2025b66c9223c615ab014a3753e2 /erts/emulator
parent7484721f847e95380e66456b4a55e08481b570d8 (diff)
downloadotp-2fbe8cc9b3f6f443ccccfaa485b05966aacc65d9.tar.gz
otp-2fbe8cc9b3f6f443ccccfaa485b05966aacc65d9.tar.bz2
otp-2fbe8cc9b3f6f443ccccfaa485b05966aacc65d9.zip
Fix port leaks in zlib
zip,unzip,gzip,gunzip,compress and uncompress did not close the port when given invalid data argument. Fixed by putting close in "try-after". A closed port could in same cases get stuck in limbo due to data in io-queue. Fixed by adding a flush callback.
Diffstat (limited to 'erts/emulator')
-rw-r--r--erts/emulator/drivers/common/zlib_drv.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/erts/emulator/drivers/common/zlib_drv.c b/erts/emulator/drivers/common/zlib_drv.c
index da4a17db1a..a4b02b845e 100644
--- a/erts/emulator/drivers/common/zlib_drv.c
+++ b/erts/emulator/drivers/common/zlib_drv.c
@@ -64,6 +64,7 @@
static int zlib_init(void);
static ErlDrvData zlib_start(ErlDrvPort port, char* buf);
static void zlib_stop(ErlDrvData e);
+static void zlib_flush(ErlDrvData e);
static ErlDrvSSizeT zlib_ctl(ErlDrvData drv_data, unsigned int command, char *buf,
ErlDrvSizeT len, char **rbuf, ErlDrvSizeT rlen);
static void zlib_outputv(ErlDrvData drv_data, ErlIOVec *ev);
@@ -82,7 +83,7 @@ ErlDrvEntry zlib_driver_entry = {
NULL, /* timeout */
zlib_outputv,
NULL, /* read_async */
- NULL, /* flush */
+ zlib_flush,
NULL, /* call */
NULL, /* event */
ERL_DRV_EXTENDED_MARKER,
@@ -410,6 +411,13 @@ static void zlib_stop(ErlDrvData e)
driver_free(d);
}
+static void zlib_flush(ErlDrvData drv_data)
+{
+ ZLibData* d = (ZLibData*) drv_data;
+
+ driver_deq(d->port, driver_sizeq(d->port));
+}
+
static ErlDrvSSizeT zlib_ctl(ErlDrvData drv_data, unsigned int command, char *buf,
ErlDrvSizeT len, char **rbuf, ErlDrvSizeT rlen)
{