changed CHANGELOG.md
 
@@ -1,5 +1,10 @@
1
1
## Changelog
2
2
3
+ ## v1.0.5
4
+
5
+ * Bug fixes
6
+ * Support improper lists, bitstrings and structs in safe_binary_to_term
7
+
3
8
## v1.0.4
4
9
5
10
* Bug fixes
changed hex_metadata.config
 
@@ -38,4 +38,4 @@
38
38
{<<"name">>,<<"cowboy">>},
39
39
{<<"optional">>,true},
40
40
{<<"requirement">>,<<"~> 1.0">>}]]}.
41
- {<<"version">>,<<"1.0.4">>}.
41
+ {<<"version">>,<<"1.0.5">>}.
changed lib/plug/crypto.ex
 
@@ -14,7 +14,7 @@ defmodule Plug.Crypto do
14
14
end
15
15
16
16
defp safe_terms(list) when is_list(list) do
17
- for item <- list, do: safe_terms(item)
17
+ safe_list(list)
18
18
list
19
19
end
20
20
defp safe_terms(tuple) when is_tuple(tuple) do
 
@@ -22,13 +22,13 @@ defmodule Plug.Crypto do
22
22
tuple
23
23
end
24
24
defp safe_terms(map) when is_map(map) do
25
- for {key, value} <- map do
25
+ :maps.fold(fn key, value, acc ->
26
26
safe_terms(key)
27
27
safe_terms(value)
28
- end
29
- map
28
+ acc
29
+ end, map, map)
30
30
end
31
- defp safe_terms(other) when is_atom(other) or is_number(other) or is_binary(other) or
31
+ defp safe_terms(other) when is_atom(other) or is_number(other) or is_bitstring(other) or
32
32
is_pid(other) or is_reference(other) do
33
33
other
34
34
end
 
@@ -36,6 +36,16 @@ defmodule Plug.Crypto do
36
36
raise ArgumentError, "cannot deserialize #{inspect other}, the term is not safe for deserialization"
37
37
end
38
38
39
+ defp safe_list([]), do: :ok
40
+ defp safe_list([h | t]) when is_list(t) do
41
+ safe_terms(h)
42
+ safe_list(t)
43
+ end
44
+ defp safe_list([h | t]) do
45
+ safe_terms(h)
46
+ safe_terms(t)
47
+ end
48
+
39
49
defp safe_tuple(_tuple, 0), do: :ok
40
50
defp safe_tuple(tuple, n) do
41
51
safe_terms(:erlang.element(n, tuple))
changed mix.exs
 
@@ -1,7 +1,7 @@
1
1
defmodule Plug.Mixfile do
2
2
use Mix.Project
3
3
4
- @version "1.0.4"
4
+ @version "1.0.5"
5
5
6
6
def project do
7
7
[app: :plug,