File 1261-asn1-Fix-encoding-of-negative-numbers-greater-than-1.patch of Package erlang
From 667cb36db2bbf680f6bf9bcce0c531ebdd305c9d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bjo=CC=88rn=20Gustavsson?= <bgustavsson@gmail.com>
Date: Mon, 31 Mar 2025 13:58:03 +0200
Subject: [PATCH] asn1: Fix encoding of negative numbers greater than -1
When encoding negative numbers greater than -1 (such as -0.7)
as REALs, the minus sign would be lost.
---
lib/asn1/src/asn1rtt_real_common.erl | 27 ++++++++++++++++-----------
lib/asn1/test/testPrim.erl | 9 +++++++++
2 files changed, 25 insertions(+), 11 deletions(-)
diff --git a/lib/asn1/src/asn1rtt_real_common.erl b/lib/asn1/src/asn1rtt_real_common.erl
index 2de51c564e..37103bfc67 100644
--- a/lib/asn1/src/asn1rtt_real_common.erl
+++ b/lib/asn1/src/asn1rtt_real_common.erl
@@ -36,7 +36,7 @@ encode_real('PLUS-INFINITY') ->
encode_real('MINUS-INFINITY') ->
<<2#0100_0001>>;
encode_real(Val) when is_tuple(Val); is_list(Val) ->
- encode_real([], Val).
+ do_encode_real(Val).
%%%%%%%%%%%%%%
%% only base 2 encoding!
@@ -72,7 +72,7 @@ encode_real(Val) when is_tuple(Val); is_list(Val) ->
%% bit shifted until it is an odd number. Thus, do this for BER as
%% well.
-encode_real(_C, {Mantissa, Base, Exponent}) when Base =:= 2 ->
+do_encode_real({Mantissa, Base, Exponent}) when Base =:= 2 ->
%% io:format("Mantissa: ~w Base: ~w, Exp: ~w~n",[Man, Base, Exp]),
{Man,ExpAdd} = truncate_zeros(Mantissa), %% DER adjustment
Exp = Exponent + ExpAdd,
@@ -103,7 +103,7 @@ encode_real(_C, {Mantissa, Base, Exponent}) when Base =:= 2 ->
end,
%% ok = io:format("LenMask: ~w EOctets: ~w~nFirstOctet: ~w OctMantissa: ~w OctExpLen: ~w~n", [LenMask, EOctets, FirstOctet, OctMantissa, OctExpLen]),
<<FirstOctet/binary, EOctets/binary, OctMantissa/binary>>;
-encode_real(C, {Mantissa,Base,Exponent})
+do_encode_real({Mantissa,Base,Exponent})
when Base =:= 10, is_integer(Mantissa), is_integer(Exponent) ->
%% always encode as NR3 due to DER on the format
%% mmmm.Eseeee where
@@ -114,11 +114,11 @@ encode_real(C, {Mantissa,Base,Exponent})
%% ex: 1234.E-5679
ManStr = integer_to_list(Mantissa),
- encode_real_as_string(C,ManStr,Exponent);
-encode_real(_C, {_,Base,_}) ->
+ encode_real_as_string(ManStr, Exponent);
+do_encode_real({_,Base,_}) ->
exit({error,{asn1, {encode_real_non_supported_encoding, Base}}});
%% base 10
-encode_real(C, Real) when is_list(Real) ->
+do_encode_real(Real) when is_list(Real) ->
%% The Real string may come in as a NR1, NR2 or NR3 string.
{Mantissa, Exponent} =
case string:lexemes(Real,"Ee") of
@@ -142,18 +142,18 @@ encode_real(C, Real) when is_list(Real) ->
_ ->
case string:lexemes(Mantissa,",.") of
[Num] -> %% No decimal-mark
- {integer_to_list(list_to_integer(Num)),0};
+ {remove_plus_and_leading_zeros(Num),0};
[Num,Dec] ->
NewDec = ZeroDecimal(remove_trailing_zeros(Dec)),
- NewMan = integer_to_list(list_to_integer(Num)) ++ NewDec,
- {integer_to_list(list_to_integer(NewMan)),
+ NewMan = remove_plus_and_leading_zeros(Num) ++ NewDec,
+ {remove_plus_and_leading_zeros(NewMan),
length(NewDec)}
end
end,
- encode_real_as_string(C, NewMantissa, Exponent - LenDecimal).
+ encode_real_as_string(NewMantissa, Exponent - LenDecimal).
-encode_real_as_string(_C, Mantissa, Exponent)
+encode_real_as_string(Mantissa, Exponent)
when is_list(Mantissa), is_integer(Exponent) ->
%% Remove trailing zeros in Mantissa and add this to Exponent
TruncMant = remove_trailing_zeros(Mantissa),
@@ -174,6 +174,11 @@ encode_real_as_string(_C, Mantissa, Exponent)
NR3 = 3,
<<NR3,ManBin/binary,$.,ExpBin/binary>>.
+remove_plus_and_leading_zeros("-0") ->
+ "-0";
+remove_plus_and_leading_zeros(IntStr) ->
+ integer_to_list(list_to_integer(IntStr)).
+
remove_trailing_zeros(IntStr) ->
case lists:dropwhile(fun($0)-> true;
(_) -> false
diff --git a/lib/asn1/test/testPrim.erl b/lib/asn1/test/testPrim.erl
index b728c93ba1..f3094e1a9e 100644
--- a/lib/asn1/test/testPrim.erl
+++ b/lib/asn1/test/testPrim.erl
@@ -254,6 +254,7 @@ real(_Rules) ->
%% Base 10, string format NR3
real_roundtrip('AngleInRadians', "123.123E123", "123123.E120"),
+ real_roundtrip('AngleInRadians', "+123.123E123", "123123.E120"),
real_roundtrip('AngleInRadians', "0.0E0", "0.E+0"),
real_roundtrip('AngleInRadians', "0.0123", "123.E-4"),
real_roundtrip('AngleInRadians', "0", "0.E+0"),
@@ -262,6 +263,14 @@ real(_Rules) ->
"123456789.E123456789"),
real_roundtrip('AngleInRadians', "01.000E1", "1.E1"),
real_roundtrip('AngleInRadians', "120.0001", "1200001.E-4"),
+ real_roundtrip('AngleInRadians', "5", "5.E+0"),
+ real_roundtrip('AngleInRadians', "53", "53.E+0"),
+
+ real_roundtrip('AngleInRadians', "-123.123E123", "-123123.E120"),
+ real_roundtrip('AngleInRadians', "-0.0123", "-123.E-4"),
+ real_roundtrip('AngleInRadians', "-0.73", "-73.E-2"),
+ real_roundtrip('AngleInRadians', "-5", "-5.E+0"),
+ real_roundtrip('AngleInRadians', "-53", "-53.E+0"),
ok.
--
2.43.0