File 0356-kernel-stdlib-Fix-io-puts_char-error-with-invalid-bi.patch of Package erlang
From 68c12f6834a78d0d5886fe31eb59f39e0e98835f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonatan=20M=C3=A4nnchen?= <jonatan@maennchen.ch>
Date: Wed, 13 Apr 2022 11:55:07 +0800
Subject: [PATCH] kernel|stdlib: Fix io:puts_char error with invalid binary
Makes sure that io:puts_char/2 emits a no_translation error
when called with an incomplete binary and adds detail to the
resulting error message.
---
lib/kernel/src/file_io_server.erl | 4 ++++
lib/stdlib/src/erl_stdlib_errors.erl | 6 ++++++
lib/stdlib/test/io_SUITE.erl | 7 +++++++
3 files changed, 17 insertions(+)
diff --git a/lib/kernel/src/file_io_server.erl b/lib/kernel/src/file_io_server.erl
index 691fc00b14..57e3e87106 100644
--- a/lib/kernel/src/file_io_server.erl
+++ b/lib/kernel/src/file_io_server.erl
@@ -443,6 +443,10 @@ put_chars(Chars, InEncoding, #state{handle=Handle, unic=OutEncoding}=State) ->
{reply,Reply,NewState}
end;
{error,_,_} ->
+ {stop,no_translation,
+ {error,{no_translation, InEncoding, OutEncoding}},
+ NewState};
+ {incomplete,_,_} ->
{stop,no_translation,
{error,{no_translation, InEncoding, OutEncoding}},
NewState}
diff --git a/lib/stdlib/src/erl_stdlib_errors.erl b/lib/stdlib/src/erl_stdlib_errors.erl
index e625d53852..3298ee0f95 100644
--- a/lib/stdlib/src/erl_stdlib_errors.erl
+++ b/lib/stdlib/src/erl_stdlib_errors.erl
@@ -399,6 +399,12 @@ format_unicode_error(characters_to_nfkd_list, [_]) ->
unicode_char_data(Chars) ->
try unicode:characters_to_binary(Chars) of
+ {error,_,_} ->
+ bad_char_data;
+
+ {incomplete,_,_} ->
+ bad_char_data;
+
_ ->
[]
catch
diff --git a/lib/stdlib/test/io_SUITE.erl b/lib/stdlib/test/io_SUITE.erl
index cabde512d3..36d89c14ed 100644
--- a/lib/stdlib/test/io_SUITE.erl
+++ b/lib/stdlib/test/io_SUITE.erl
@@ -3004,6 +3004,11 @@ error_info(Config) ->
Dev
end,
+ UnicodeDev = fun() ->
+ {ok, Dev} = file:open(TmpFile, [read, write, {encoding, unicode}]),
+ Dev
+ end,
+
DeadDev = spawn(fun() -> ok end),
UserDev = fun() -> whereis(user) end,
@@ -3025,6 +3030,8 @@ error_info(Config) ->
{put_chars,["test"], [{gl,FullDev()},{general,"no space left on device"}]},
{put_chars,[Latin1Dev(),"Спутник-1"], [{1,"transcode"}]},
{put_chars,[a], [{1,"not valid character data"}]},
+ {put_chars,[UnicodeDev(), <<222>>], [{1,"transcode"}]},
+ {put_chars,[<<1:1>>], [{1,"not valid character data"}]},
{put_chars,[UnknownDev(),"test"], [{general,"unknown error: 'Спутник-1'"}]},
{put_chars,["test"], [{gl,UnknownDev()},{general,"unknown error: 'Спутник-1'"}]},
--
2.34.1