File 1198-snmp-replace-size-1-by-xxx_size-1.patch of Package erlang

From 4a5e5e489221fd40f7b119af66cb7a7895b1262e Mon Sep 17 00:00:00 2001
From: Kiko Fernandez-Reyes <kiko@erlang.org>
Date: Thu, 2 Feb 2023 14:22:23 +0100
Subject: [PATCH] snmp: replace size/1 by xxx_size/1

The <c>size/1</c> BIF is not optimized by the JIT, and its use can
result in worse types for Dialyzer.

When one knows that the value being tested must be a tuple,
<c>tuple_size/1</c> should always be preferred.

When one knows that the value being tested must be a binary,
<c>byte_size/1</c> should be preferred. However, <c>byte_size/1</c> also
accepts a bitstring (rounding up size to a whole number of bytes), so
one must make sure that the call to <c>byte_size/</c> is preceded by a
call to <c>is_binary/1</c> to ensure that bitstrings are rejected. Note
that the compiler removes redundant calls to <c>is_binary/1</c>, so if
one is not sure whether previous code had made sure that the argument is
a binary, it does not harm to add an <c>is_binary/1</c> test immediately
before the call to <c>byte_size/1</c>.
---
 lib/snmp/src/agent/snmp_generic_mnesia.erl |  4 ++--
 lib/snmp/src/agent/snmp_index.erl          |  2 +-
 lib/snmp/src/agent/snmpa_local_db.erl      |  2 +-
 lib/snmp/src/agent/snmpa_mib_data_ttln.erl | 16 ++++++++--------
 lib/snmp/src/agent/snmpa_mib_data_tttn.erl | 16 ++++++++--------
 lib/snmp/src/agent/snmpa_mpd.erl           |  9 +++++----
 lib/snmp/src/manager/snmpm_net_if.erl      |  2 +-
 lib/snmp/src/misc/snmp_pdus.erl            |  4 ++--
 8 files changed, 28 insertions(+), 27 deletions(-)

diff --git a/lib/snmp/src/agent/snmp_generic_mnesia.erl b/lib/snmp/src/agent/snmp_generic_mnesia.erl
index e2e8bba8c5..77e6190435 100644
--- a/lib/snmp/src/agent/snmp_generic_mnesia.erl
+++ b/lib/snmp/src/agent/snmp_generic_mnesia.erl
@@ -185,8 +185,8 @@ make_row2(RowList, 1) -> RowList;
 make_row2([_OtherIndex | RowList], N) ->
     make_row2(RowList, N-1).
 
-make_row_list(Row) ->
-    make_row_list(size(Row), Row, []).
+make_row_list(Row) when is_tuple(Row) ->
+    make_row_list(tuple_size(Row), Row, []).
 make_row_list(N, Row, Acc) when N > 2 ->
     make_row_list(N-1, Row, [element(N, Row) | Acc]);
 make_row_list(2, Row, Acc) ->
diff --git a/lib/snmp/src/agent/snmp_index.erl b/lib/snmp/src/agent/snmp_index.erl
index 38b39a9b7e..cddb49bd7a 100644
--- a/lib/snmp/src/agent/snmp_index.erl
+++ b/lib/snmp/src/agent/snmp_index.erl
@@ -155,7 +155,7 @@ is_snmp_type(_) -> false.
 key_to_oid_i(Key, _Type) when is_integer(Key) -> [Key];
 key_to_oid_i(Key, fix_string) -> Key;
 key_to_oid_i(Key, _Type) when is_list(Key) -> [length(Key) | Key];
-key_to_oid_i(Key, Types) -> keys_to_oid(size(Key), Key, [], Types).
+key_to_oid_i(Key, Types) when is_tuple(Key) -> keys_to_oid(tuple_size(Key), Key, [], Types).
 
 keys_to_oid(0, _Key, Oid, _Types) -> Oid;
 keys_to_oid(N, Key, Oid, Types) ->
diff --git a/lib/snmp/src/agent/snmpa_local_db.erl b/lib/snmp/src/agent/snmpa_local_db.erl
index 63879f1acb..27af3c5498 100644
--- a/lib/snmp/src/agent/snmpa_local_db.erl
+++ b/lib/snmp/src/agent/snmpa_local_db.erl
@@ -1031,7 +1031,7 @@ table_get_elements(NameDb, RowIndex, Cols, _FirstOwnIndex) ->
 
 get_elements(_Cols, undefined) -> 
     undefined;
-get_elements([Col | Cols], Row) when is_tuple(Row) and (size(Row) >= Col) ->
+get_elements([Col | Cols], Row) when tuple_size(Row) >= Col ->
     [element(Col, Row) | get_elements(Cols, Row)];
 get_elements([], _Row) -> 
     [];
diff --git a/lib/snmp/src/agent/snmpa_mib_data_ttln.erl b/lib/snmp/src/agent/snmpa_mib_data_ttln.erl
index 0c39489852..bd5a9ea52a 100644
--- a/lib/snmp/src/agent/snmpa_mib_data_ttln.erl
+++ b/lib/snmp/src/agent/snmpa_mib_data_ttln.erl
@@ -777,10 +777,10 @@ next_node(_D, undefined_node, _Oid, _RevOidSoFar, _MibView) ->
 
 next_node(_D, {tree, Tree, {table_entry, _Id}}, [Int | _Oid], 
 	  _RevOidSoFar, _MibView)
-  when Int+1 > size(Tree) ->
+  when Int+1 > tuple_size(Tree) ->
     ?vtrace("next_node(tree,table_entry) -> entry when not found within"
 	"~n   Int:        ~p"
-	"~n   size(Tree): ~p", [Int, size(Tree)]),
+	"~n   size(Tree): ~p", [Int, tuple_size(Tree)]),
     false;
 next_node(D, {tree, Tree, {table_entry, _MibName}},
 	  Oid, RevOidSoFar, MibView) ->
@@ -788,7 +788,7 @@ next_node(D, {tree, Tree, {table_entry, _MibName}},
 	"~n   size(Tree):  ~p"
 	"~n   Oid:         ~p"
 	"~n   RevOidSoFar: ~p"
-	"~n   MibView:     ~p", [size(Tree), Oid, RevOidSoFar, MibView]),
+	"~n   MibView:     ~p", [tuple_size(Tree), Oid, RevOidSoFar, MibView]),
     OidSoFar = lists:reverse(RevOidSoFar),
     case snmpa_acm:is_definitely_not_in_mib_view(OidSoFar, MibView) of
 	true -> 
@@ -809,14 +809,14 @@ next_node(D, {tree, Tree, {table_entry, _MibName}},
     end;
 
 next_node(D, {tree, Tree, _Info}, [Int | RestOfOid], RevOidSoFar, MibView) 
-  when (Int < size(Tree)) andalso (Int >= 0) ->
+  when (Int < tuple_size(Tree)) andalso (Int >= 0) ->
     ?vtrace("next_node(tree) -> entry when"
 	"~n   size(Tree):  ~p"
 	"~n   Int:         ~p"
 	"~n   RestOfOid:   ~p"
 	"~n   RevOidSoFar: ~p"
 	"~n   MibView:     ~p", 
-	[size(Tree), Int, RestOfOid, RevOidSoFar, MibView]),
+	[tuple_size(Tree), Int, RestOfOid, RevOidSoFar, MibView]),
     case next_node(D, element(Int+1,Tree), 
 		   RestOfOid, [Int|RevOidSoFar], MibView) of
 	false -> 
@@ -830,11 +830,11 @@ next_node(D, {tree, Tree, _Info}, [], RevOidSoFar, MibView) ->
 	"~n   size(Tree):  ~p"
 	"~n   RevOidSoFar: ~p"
 	"~n   MibView:     ~p", 
-	[size(Tree), RevOidSoFar, MibView]),
+	[tuple_size(Tree), RevOidSoFar, MibView]),
     find_next(D, {tree, Tree, _Info}, 0, RevOidSoFar, MibView);
 next_node(_D, {tree, Tree, _Info}, _RestOfOid, _RevOidSoFar, _MibView) ->
     ?vtrace("next_node(tree) -> entry when"
-	"~n   size(Tree):  ~p", [size(Tree)]),
+	"~n   size(Tree):  ~p", [tuple_size(Tree)]),
     false;
 
 next_node(D, {node, subagent}, Oid, RevOidSoFar, MibView) ->
@@ -896,7 +896,7 @@ next_node(_D, {node, {variable, _MibName}}, _Oid, _RevOidSoFar, _MibView) ->
 %%      node.
 %%-----------------------------------------------------------------
 find_next(D, {tree, Tree, internal}, Idx, RevOidSoFar, MibView) 
-  when Idx < size(Tree) ->
+  when Idx < tuple_size(Tree) ->
     case find_next(D, element(Idx+1, Tree), 0, [Idx| RevOidSoFar], MibView) of
 	false -> 
 	    find_next(D, {tree, Tree, internal}, Idx+1, RevOidSoFar, MibView);
diff --git a/lib/snmp/src/agent/snmpa_mib_data_tttn.erl b/lib/snmp/src/agent/snmpa_mib_data_tttn.erl
index b0d5312e2c..f626e50b6a 100644
--- a/lib/snmp/src/agent/snmpa_mib_data_tttn.erl
+++ b/lib/snmp/src/agent/snmpa_mib_data_tttn.erl
@@ -804,10 +804,10 @@ next_node(_D, undefined_node, _Oid, _RevOidSoFar, _MibView) ->
 
 next_node(_D, {tree, Tree, {table_entry, _Id}}, [Int | _Oid], 
 	  _RevOidSoFar, _MibView)
-  when Int+1 > size(Tree) ->
+  when Int+1 > tuple_size(Tree) ->
     ?vtrace("next_node(tree,table_entry) -> entry when not found within"
 	"~n   Int:        ~p"
-	"~n   size(Tree): ~p", [Int, size(Tree)]),
+	"~n   size(Tree): ~p", [Int, tuple_size(Tree)]),
     false;
 next_node(D, {tree, Tree, {table_entry, _MibName}},
 	  Oid, RevOidSoFar, MibView) ->
@@ -815,7 +815,7 @@ next_node(D, {tree, Tree, {table_entry, _MibName}},
 	"~n   size(Tree):  ~p"
 	"~n   Oid:         ~p"
 	"~n   RevOidSoFar: ~p"
-	"~n   MibView:     ~p", [size(Tree), Oid, RevOidSoFar, MibView]),
+	"~n   MibView:     ~p", [tuple_size(Tree), Oid, RevOidSoFar, MibView]),
     OidSoFar = lists:reverse(RevOidSoFar),
     case snmpa_acm:is_definitely_not_in_mib_view(OidSoFar, MibView) of
 	true -> 
@@ -836,14 +836,14 @@ next_node(D, {tree, Tree, {table_entry, _MibName}},
     end;
 
 next_node(D, {tree, Tree, _Info}, [Int | RestOfOid], RevOidSoFar, MibView) 
-  when (Int < size(Tree)) andalso (Int >= 0) ->
+  when (Int < tuple_size(Tree)) andalso (Int >= 0) ->
     ?vtrace("next_node(tree) -> entry when"
 	"~n   size(Tree):  ~p"
 	"~n   Int:         ~p"
 	"~n   RestOfOid:   ~p"
 	"~n   RevOidSoFar: ~p"
 	"~n   MibView:     ~p", 
-	[size(Tree), Int, RestOfOid, RevOidSoFar, MibView]),
+	[tuple_size(Tree), Int, RestOfOid, RevOidSoFar, MibView]),
     case next_node(D, element(Int+1,Tree), 
 		   RestOfOid, [Int|RevOidSoFar], MibView) of
 	false -> 
@@ -857,11 +857,11 @@ next_node(D, {tree, Tree, _Info}, [], RevOidSoFar, MibView) ->
 	"~n   size(Tree):  ~p"
 	"~n   RevOidSoFar: ~p"
 	"~n   MibView:     ~p", 
-	[size(Tree), RevOidSoFar, MibView]),
+	[tuple_size(Tree), RevOidSoFar, MibView]),
     find_next(D, {tree, Tree, _Info}, 0, RevOidSoFar, MibView);
 next_node(_D, {tree, Tree, _Info}, _RestOfOid, _RevOidSoFar, _MibView) ->
     ?vtrace("next_node(tree) -> entry when"
-	"~n   size(Tree):  ~p", [size(Tree)]),
+	"~n   size(Tree):  ~p", [tuple_size(Tree)]),
     false;
 
 next_node(D, {node, subagent}, Oid, RevOidSoFar, MibView) ->
@@ -924,7 +924,7 @@ next_node(_D, {node, {variable, _MibName}}, _Oid, _RevOidSoFar, _MibView) ->
 %%      node.
 %%-----------------------------------------------------------------
 find_next(D, {tree, Tree, internal}, Idx, RevOidSoFar, MibView) 
-  when Idx < size(Tree) ->
+  when Idx < tuple_size(Tree) ->
     case find_next(D, element(Idx+1, Tree), 0, [Idx| RevOidSoFar], MibView) of
 	false -> 
 	    find_next(D, {tree, Tree, internal}, Idx+1, RevOidSoFar, MibView);
diff --git a/lib/snmp/src/agent/snmpa_mpd.erl b/lib/snmp/src/agent/snmpa_mpd.erl
index 248b8aa3aa..4c94ea9de7 100644
--- a/lib/snmp/src/agent/snmpa_mpd.erl
+++ b/lib/snmp/src/agent/snmpa_mpd.erl
@@ -673,7 +673,7 @@ generate_response_msg(Vsn, RePdu, Type,
 			{discarded, Reason};
 		    Packet ->
 			MMS = get_engine_max_message_size(LocalEngineID),
-			case size(Packet) of
+			case byte_size(Packet) of
 			    Len when Len =< MMS ->
 				Log(Type, Packet),
 				inc_snmp_cnt_vars(Type, RePdu),
@@ -742,7 +742,7 @@ generate_response_msg(Vsn, RePdu, Type,
 		    %% because of the calculation we do when we
 		    %% receive the bulk-request.
 		    Packet = list_to_binary(OutMsg),
-		    case size(Packet) of
+		    case byte_size(Packet) of
 			Len when Len =< AgentMS ->
 			    if
 				SecLevel =:= 3 -> 
@@ -932,7 +932,7 @@ generate_msg(Vsn, _NoteStore, Pdu, {community, Community}, LocalEngineID, To) ->
 	    {discarded, Reason};
 	Packet ->
 	    AgentMax = get_engine_max_message_size(LocalEngineID),
-	    case size(Packet) of
+	    case byte_size(Packet) of
 		Len when Len =< AgentMax ->
 		    {ok, mk_v1_v2_packet_list(To, Packet, Len, Pdu)};
 		Len ->
@@ -1321,7 +1321,7 @@ mk_v3_packet_entry(NoteStore, Domain, Addr,
 	    %% Store in cache for 150 sec.
 	    Packet = list_to_binary(OutMsg),
 	    ?vdebug("mk_v3_packet_entry -> generated: ~w bytes", 
-		    [size(Packet)]),
+		    [byte_size(Packet)]),
 	    Data = 
 		if
 		    SecLevel =:= 3 -> 
@@ -1560,3 +1560,4 @@ user_err(F, A) ->
 
 config_err(F, A) ->
     snmpa_error:config_err(F, A).
+
diff --git a/lib/snmp/src/manager/snmpm_net_if.erl b/lib/snmp/src/manager/snmpm_net_if.erl
index 7a7c8852a2..4153646e88 100644
--- a/lib/snmp/src/manager/snmpm_net_if.erl
+++ b/lib/snmp/src/manager/snmpm_net_if.erl
@@ -814,7 +814,7 @@ maybe_handle_recv_msg_mt(
     
 
 handle_recv_msg(Domain, Addr, Bytes, #state{server = Pid})
-  when is_binary(Bytes) andalso (size(Bytes) =:= 0) ->
+  when is_binary(Bytes) andalso (byte_size(Bytes) =:= 0) ->
     Pid ! {snmp_error, {empty_message, Domain, Addr}, Domain, Addr};
 %%
 handle_recv_msg(
diff --git a/lib/snmp/src/misc/snmp_pdus.erl b/lib/snmp/src/misc/snmp_pdus.erl
index 93f06749fd..d4f30a5c3b 100644
--- a/lib/snmp/src/misc/snmp_pdus.erl
+++ b/lib/snmp/src/misc/snmp_pdus.erl
@@ -828,8 +828,8 @@ enint(N, Acc) ->
  
 enc_oct_str_tag(OStr) when is_list(OStr) ->
     lists:append([4|elength(length(OStr))],OStr);
-enc_oct_str_tag(OBin) ->
-    [4 | elength(size(OBin))] ++ binary_to_list(OBin).
+enc_oct_str_tag(OBin) when is_binary(OBin) ->
+    [4 | elength(byte_size(OBin))] ++ binary_to_list(OBin).
 
 
 enc_oct_str_notag(OStr) -> OStr.
-- 
2.35.3

openSUSE Build Service is sponsored by