From 7d2e48c193f05efb1a79083e894287dbc9a01c04 Mon Sep 17 00:00:00 2001 From: Ahmed Omar Date: Thu, 27 Oct 2011 15:00:08 +0200 Subject: [PATCH 1/2] Fixes wrong updates of file modification time (mtime) when only access time (atime) should be updated Using file:write_file_info/2 to update atime, results in updating both atime and mtime. mtime is the last time the file was written, so it shouldn't be updated when atime (last time the file was read). The fix changes that behavior such that when mtime field is not give, it's not updated. --- erts/preloaded/src/prim_file.erl | 1 - 1 file changed, 1 deletion(-) diff --git a/erts/preloaded/src/prim_file.erl b/erts/preloaded/src/prim_file.erl index 30b7a5246adc..7ad48f48a4d4 100644 --- a/erts/preloaded/src/prim_file.erl +++ b/erts/preloaded/src/prim_file.erl @@ -740,7 +740,6 @@ write_file_info_int(Port, {Atime, Mtime} = case {Atime0, Mtime0} of {undefined, Mtime0} -> {erlang:localtime(), Mtime0}; - {Atime0, undefined} -> {Atime0, Atime0}; Complete -> Complete end, drv_command(Port, [?FILE_WRITE_INFO, From cbe886c1fdb9db4a639aa911f9c691b4d86ec48b Mon Sep 17 00:00:00 2001 From: Ahmed Omar Date: Thu, 27 Oct 2011 21:44:53 +0200 Subject: [PATCH 2/2] Fixes a crash in file_server_2 when file:change_time/2,3 are called with invalid dates Calling file:change_time/2,3 with invalid dates (e.g {undefined, undefined}) will cause file_server_2 to crash. error_logger will shutdown and the whole VM will stop. The fix validates the given dates before doing the server call, i.e on the boundaries. --- lib/kernel/src/file.erl | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/kernel/src/file.erl b/lib/kernel/src/file.erl index 706c60caaf05..b8df02bebdda 100644 --- a/lib/kernel/src/file.erl +++ b/lib/kernel/src/file.erl @@ -1100,8 +1100,9 @@ change_group(Name, GroupId) Mtime :: date_time(), Reason :: posix() | badarg. -change_time(Name, Time) - when is_tuple(Time) -> +change_time(Name, {{Y, M, D}, {H, Min, Sec}}=Time) + when is_integer(Y), is_integer(M), is_integer(D), + is_integer(H), is_integer(Min), is_integer(Sec)-> write_file_info(Name, #file_info{mtime=Time}). -spec change_time(Filename, Atime, Mtime) -> ok | {error, Reason} when @@ -1110,8 +1111,12 @@ change_time(Name, Time) Mtime :: date_time(), Reason :: posix() | badarg. -change_time(Name, Atime, Mtime) - when is_tuple(Atime), is_tuple(Mtime) -> +change_time(Name, {{AY, AM, AD}, {AH, AMin, ASec}}=Atime, + {{MY, MM, MD}, {MH, MMin, MSec}}=Mtime) + when is_integer(AY), is_integer(AM), is_integer(AD), + is_integer(AH), is_integer(AMin), is_integer(ASec), + is_integer(MY), is_integer(MM), is_integer(MD), + is_integer(MH), is_integer(MMin), is_integer(MSec)-> write_file_info(Name, #file_info{atime=Atime, mtime=Mtime}). %%%-----------------------------------------------------------------