Skip to content

Commit bc021f3

Browse files
committed
Better port validation
1 parent 9fe08d3 commit bc021f3

File tree

4 files changed

+25
-8
lines changed

4 files changed

+25
-8
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## v0.1.7 (TBA)
2+
3+
- The specified port is checked to ensure is in valid range
4+
15
## v0.1.6 (2022-09-22)
26

37
- Added suspended routes and web socket handlers to error messages

lib/test_server.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ defmodule TestServer do
7272

7373
defp raise_start_failure({:error, error}) do
7474
raise """
75-
EXIT when starting #{__MODULE__.Instance}:
75+
EXIT when starting #{inspect(__MODULE__.Instance)}:
7676
7777
#{Exception.format_exit(error)}
7878
"""

lib/test_server/plug_cowboy.ex

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,17 @@ defmodule TestServer.Plug.Cowboy do
4949
port -> {port, []}
5050
end
5151

52-
unless is_integer(port), do: raise("Invalid port, got: #{inspect(port)}")
53-
54-
{:ok, socket} = :gen_tcp.listen(port, options)
55-
{:ok, port} = :inet.port(socket)
56-
true = :erlang.port_close(socket)
57-
58-
port
52+
unless is_integer(port) and port >= 0 and port <= 65_535,
53+
do: raise("Invalid port, got: #{inspect(port)}")
54+
55+
with {:ok, socket} <- :gen_tcp.listen(port, options),
56+
{:ok, port} <- :inet.port(socket),
57+
true <- :erlang.port_close(socket) do
58+
port
59+
else
60+
{:error, error} ->
61+
raise("Could not listen to port #{inspect(port)}, because: #{inspect(error)}")
62+
end
5963
end
6064

6165
@impl true

test/test_server_test.exs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ defmodule TestServerTest do
1111
assert_raise RuntimeError, ~r/Invalid port, got: :invalid/, fn ->
1212
TestServer.start(port: :invalid)
1313
end
14+
15+
assert_raise RuntimeError, ~r/Invalid port, got: 65536/, fn ->
16+
TestServer.start(port: 65_536)
17+
end
18+
19+
assert_raise RuntimeError, ~r/Could not listen to port 4444, because: :eaddrinuse/, fn ->
20+
TestServer.start(port: 4444)
21+
TestServer.start(port: 4444)
22+
end
1423
end
1524

1625
test "with invalid scheme" do

0 commit comments

Comments
 (0)