From 8d5801f6cde2a44535239431fa597f1456bcdcf2 Mon Sep 17 00:00:00 2001 From: pnezis Date: Mon, 9 Mar 2026 21:17:24 +0200 Subject: [PATCH] Fix `Integer.undigits/`2 to validate negative out-of-range digits The validation was asymmetric - it rejected positive digits >= base but silently accepted negative digits <= -base. This fix adds the missing check for negative out-of-range digits. --- lib/elixir/lib/integer.ex | 5 +++-- lib/elixir/test/elixir/integer_test.exs | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/elixir/lib/integer.ex b/lib/elixir/lib/integer.ex index 3b5da375168..7dd894d6860 100644 --- a/lib/elixir/lib/integer.ex +++ b/lib/elixir/lib/integer.ex @@ -297,8 +297,9 @@ defmodule Integer do defp undigits([], _base, acc), do: acc - defp undigits([digit | _], base, _) when is_integer(digit) and digit >= base, - do: raise(ArgumentError, "invalid digit #{digit} in base #{base}") + defp undigits([digit | _], base, _) + when is_integer(digit) and (digit >= base or digit <= -base), + do: raise(ArgumentError, "invalid digit #{digit} in base #{base}") defp undigits([digit | tail], base, acc) when is_integer(digit), do: undigits(tail, base, acc * base + digit) diff --git a/lib/elixir/test/elixir/integer_test.exs b/lib/elixir/test/elixir/integer_test.exs index 5069eb58da0..db94d6b07a9 100644 --- a/lib/elixir/test/elixir/integer_test.exs +++ b/lib/elixir/test/elixir/integer_test.exs @@ -144,6 +144,14 @@ defmodule IntegerTest do assert_raise ArgumentError, "invalid digit 17 in base 16", fn -> Integer.undigits([1, 2, 17], 16) end + + assert_raise ArgumentError, "invalid digit -10 in base 10", fn -> + Integer.undigits([-10], 10) + end + + assert_raise ArgumentError, "invalid digit -17 in base 16", fn -> + Integer.undigits([1, 2, -17], 16) + end end test "parse/2" do