From e9aa70a0c2592733188fa31edc86595956d4991a Mon Sep 17 00:00:00 2001 From: jisaacstone Date: Sat, 19 Dec 2015 08:16:53 -0800 Subject: [PATCH] Fix issue #4081 UnicodeConversionError would generate invalid strings previously assumed the head of the returned iolist would be an integer. This has been fixed with more recursion fishcakez was right --- lib/elixir/lib/exception.ex | 6 +++++- lib/elixir/test/elixir/list_test.exs | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/elixir/lib/exception.ex b/lib/elixir/lib/exception.ex index 370f52630ce..70792663b0b 100644 --- a/lib/elixir/lib/exception.ex +++ b/lib/elixir/lib/exception.ex @@ -704,9 +704,13 @@ defmodule UnicodeConversionError do "encoding starting at #{inspect rest}" end - defp detail([h|_]) do + defp detail([h|_]) when is_integer(h) do "code point #{h}" end + + defp detail([h|_]) do + detail(h) + end end defmodule Enum.OutOfBoundsError do diff --git a/lib/elixir/test/elixir/list_test.exs b/lib/elixir/test/elixir/list_test.exs index 97df3c43928..0c10dc80311 100644 --- a/lib/elixir/test/elixir/list_test.exs +++ b/lib/elixir/test/elixir/list_test.exs @@ -158,6 +158,10 @@ defmodule ListTest do "invalid code point 57343", fn -> List.to_string([0xDFFF]) end + assert_raise UnicodeConversionError, + "invalid encoding starting at <<216, 0>>", fn -> + List.to_string(["a", "b", <<0xD800 :: size(16)>>]) + end assert_raise ArgumentError, "cannot convert list to string. The list must contain only integers, strings or nested such lists; got: [:a, :b]", fn ->