[erlang-questions] file:position/2 hangs up whole enode
Michael Santos
michael.santos@REDACTED
Sat Jan 29 17:27:21 CET 2011
On Thu, Jan 27, 2011 at 05:02:37PM +0200, Alex Morarash wrote:
> Hi all!
>
> Just another way to completely hang up a whole erlang node:
> open compressed file for read and move file position after
> actual size of uncompressed data.
>
> Stable reproduce in at least from R12B5 till R14B1.
>
> Here is the example.
>
>
The gzio driver is spinning on the end of the file. This patch just
checks if the file offset changes after reading from the stream:
$ touch test.gz
$ bin/erl
1> {ok,H} = file:open("test.gz", [read,compressed]).
{ok,<0.34.0>}
2> file:position(H,10).
{ok,0}
diff --git a/erts/emulator/drivers/common/gzio.c b/erts/emulator/drivers/common/gzio.c
index 5531a27..2b33f74 100644
--- a/erts/emulator/drivers/common/gzio.c
+++ b/erts/emulator/drivers/common/gzio.c
@@ -633,4 +633,5 @@ erts_gzseek(gzFile file, int offset, int whence)
char buf[512];
int n;
+ int cur = s->position;
n = pos - s->position;
@@ -644,4 +645,5 @@ erts_gzseek(gzFile file, int offset, int whence)
erts_gzwrite(file, buf, n);
}
+ if (cur == s->position) break;
}
More information about the erlang-questions
mailing list