aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsoranoba <[email protected]>2015-03-14 15:03:49 +0900
committersoranoba <[email protected]>2015-03-14 15:03:49 +0900
commitfa2b944f13fc85bdee593e1896c61ca2e3a7def9 (patch)
tree7596c3a25db1d2e51f74b469c60476c7493f0c6a
parent425668272206a0f2e4b383aef0e2364e35046686 (diff)
downloadotp-fa2b944f13fc85bdee593e1896c61ca2e3a7def9.tar.gz
otp-fa2b944f13fc85bdee593e1896c61ca2e3a7def9.tar.bz2
otp-fa2b944f13fc85bdee593e1896c61ca2e3a7def9.zip
Fix file:position (not raw mode)
When it called the "file:position", it subtract the size that was read into the buffer, and returns the value. However, it has been discarded buffer and correct position is lost, if "file:postion" returns error.
-rw-r--r--lib/kernel/src/file_io_server.erl7
-rw-r--r--lib/kernel/test/file_SUITE.erl16
2 files changed, 21 insertions, 2 deletions
diff --git a/lib/kernel/src/file_io_server.erl b/lib/kernel/src/file_io_server.erl
index 0e9ff5bc0f..d0ad43afbf 100644
--- a/lib/kernel/src/file_io_server.erl
+++ b/lib/kernel/src/file_io_server.erl
@@ -256,7 +256,12 @@ file_request(close,
{stop,normal,?PRIM_FILE:close(Handle),State#state{buf= <<>>}};
file_request({position,At},
#state{handle=Handle,buf=Buf}=State) ->
- std_reply(position(Handle, At, Buf), State);
+ case position(Handle, At, Buf) of
+ {error, _Reason}=Reply ->
+ {error,Reply,State};
+ Reply ->
+ {reply,Reply,State#state{buf= <<>>}}
+ end;
file_request(truncate,
#state{handle=Handle}=State) ->
case ?PRIM_FILE:truncate(Handle) of
diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl
index 2ce2303ba3..2911635db7 100644
--- a/lib/kernel/test/file_SUITE.erl
+++ b/lib/kernel/test/file_SUITE.erl
@@ -47,7 +47,7 @@
-export([cur_dir_0/1, cur_dir_1/1, make_del_dir/1,
list_dir/1,list_dir_error/1,
untranslatable_names/1, untranslatable_names_error/1,
- pos1/1, pos2/1]).
+ pos1/1, pos2/1, pos3/1]).
-export([close/1, consult1/1, path_consult/1, delete/1]).
-export([ eval1/1, path_eval/1, script1/1, path_script/1,
open1/1,
@@ -1219,6 +1219,20 @@ pos2(Config) when is_list(Config) ->
?line test_server:timetrap_cancel(Dog),
ok.
+pos3(suite) -> [];
+pos3(doc) -> ["When it does not use raw mode, file:postiion had a bug."];
+pos3(Config) when is_list(Config) ->
+ ?line Dog = test_server:timetrap(test_server:seconds(5)),
+ ?line RootDir = ?config(data_dir, Config),
+ ?line Name = filename:join(RootDir, "realmen.html.gz"),
+
+ ?line {ok, Fd} = ?FILE_MODULE:open(Name, [read, binary]),
+ ?line {ok, _} = ?FILE_MODULE:read(Fd, 5),
+ ?line {error, einval} = ?FILE_MODULE:position(Fd, {bof, -1}),
+ %% Here ok had returned =(
+ ?line {error, einval} = ?FILE_MODULE:position(Fd, {cur, -10}),
+ ?line test_server:timetrap_cancel(Dog),
+ ok.
file_info_basic_file(suite) -> [];
file_info_basic_file(doc) -> [];