diff options
author | Sverker Eriksson <[email protected]> | 2012-03-15 12:13:28 +0100 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2012-03-15 12:30:34 +0100 |
commit | 2fbe8cc9b3f6f443ccccfaa485b05966aacc65d9 (patch) | |
tree | 2cc1d689b84b2025b66c9223c615ab014a3753e2 /erts/emulator/drivers/common | |
parent | 7484721f847e95380e66456b4a55e08481b570d8 (diff) | |
download | otp-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/drivers/common')
-rw-r--r-- | erts/emulator/drivers/common/zlib_drv.c | 10 |
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) { |