[erlang-bugs] prim_file bug
Gunilla Arendt
gunilla@REDACTED
Fri Oct 27 09:30:20 CEST 2006
Thanks, Martin.
/ Gunilla
Martin Bjorklund wrote:
> Reading 0 bytes from a raw file returns eof, instead of {ok, []} or
> {ok, <<>>}.
>
> (non-raw file works, and the man page says that it should return {ok,
> ...}.)
>
>
> Eshell V5.5.1 (abort with ^G)
> 1> {ok, F} = file:open("README", [read,raw]).
> {ok,{file_descriptor,prim_file,{#Port<0.101>,5}}}
> 2> file:read(F, 0).
> eof
> 3> {ok, G} = file:open("README", [read]).
> {ok,<0.38.0>}
> 4> file:read(G, 0).
> {ok,[]}
>
>
>
> Tested in R10B-10 and R11B-1.
>
>
> Here's a patch, but I'm not 100% sure it's correct.
>
>
>
> Index: prim_file.erl
> ===================================================================
> --- prim_file.erl (revision 6046)
> +++ prim_file.erl (working copy)
> @@ -296,7 +296,7 @@
> read(#file_descriptor{module = ?MODULE, data = {Port, _}}, Size)
> when is_integer(Size), 0 =< Size, Size < ?LARGEFILESIZE ->
> case drv_command(Port, <<?FILE_READ, Size:64>>) of
> - {ok, {0, _Data}} ->
> + {ok, {0, _Data}} when Size =/= 0 ->
> eof;
> {ok, 0} ->
> eof;
>
>
>
> Index: efile_drv.c
> ===================================================================
> --- efile_drv.c (revision 6046)
> +++ efile_drv.c (working copy)
> @@ -2170,11 +2170,13 @@
> reply_posix_error(desc, EBADF);
> goto done;
> }
> +/*
> if (size == 0) {
> reply_Uint(desc, size);
> goto done;
> }
> - if (desc->read_size >= size) {
> +*/
> + if (desc->read_size > 0 && desc->read_size >= size) {
> /* We already have all data */
> TRACE_C('D');
> reply_data(desc, desc->read_binp, desc->read_offset, size);
>
>
>
> /martin
More information about the erlang-bugs
mailing list