File 3083-erts-Fix-false-positive-valgrind-warning-in-dirty_ni.patch of Package erlang

From 69028926ecaca2275f3c059610d925297f0cab72 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Tue, 9 Jul 2024 17:02:21 +0200
Subject: [PATCH] erts: Fix false positive valgrind warning in
 dirty_nif_SUITE.c

strcmp() can be highly optimized so that it reads and compares
addressable but undefined data in a safe way.

But it fools valgrind.
---
 .../dirty_nif_SUITE_data/dirty_nif_SUITE.c    | 33 ++++++++-----------
 1 file changed, 14 insertions(+), 19 deletions(-)

diff --git a/erts/emulator/test/dirty_nif_SUITE_data/dirty_nif_SUITE.c b/erts/emulator/test/dirty_nif_SUITE_data/dirty_nif_SUITE.c
index 94edd2f29c..1d652fd1bb 100644
--- a/erts/emulator/test/dirty_nif_SUITE_data/dirty_nif_SUITE.c
+++ b/erts/emulator/test/dirty_nif_SUITE_data/dirty_nif_SUITE.c
@@ -45,6 +45,8 @@ static ERL_NIF_TERM atom_ok;
 static ERL_NIF_TERM atom_pid;
 static ERL_NIF_TERM atom_port;
 static ERL_NIF_TERM atom_send;
+static ERL_NIF_TERM atom_set_on_halt_handler;
+static ERL_NIF_TERM atom_delay_halt;
 
 typedef struct {
     int halting;
@@ -176,6 +178,8 @@ static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
     atom_pid = enif_make_atom(env, "pid");
     atom_port = enif_make_atom(env, "port");
     atom_send = enif_make_atom(env, "send");
+    atom_set_on_halt_handler = enif_make_atom(env, "set_on_halt_handler");
+    atom_delay_halt = enif_make_atom(env, "delay_halt");
 
     return 0;
 }
@@ -222,8 +226,7 @@ static ERL_NIF_TERM call_dirty_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM
     char s[10];
     ErlNifBinary b;
     assert(ERL_NIF_THR_NORMAL_SCHEDULER == enif_thread_type());
-    if (argc != 3)
-	return enif_make_badarg(env);
+    assert(argc == 3);
     if (have_dirty_schedulers()) {
 	if (enif_get_int(env, argv[0], &n) &&
 	    enif_get_string(env, argv[1], s, sizeof s, ERL_NIF_LATIN1) &&
@@ -510,8 +513,7 @@ whereis_term(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
     ERL_NIF_TERM ret;
     int type, rc;
 
-    if (argc != 2)  /* allow non-atom name for testing */
-        return enif_make_badarg(env);
+    assert(argc == 2);
 
     if ((type = whereis_type(argv[0])) == WHEREIS_ERROR_TYPE)
         return enif_make_badarg(env);
@@ -527,7 +529,8 @@ whereis_send(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
     whereis_term_data_t to;
     int type, rc;
 
-    if (argc != 3 || !enif_is_atom(env, argv[1]))
+    assert(argc == 3);
+    if (!enif_is_atom(env, argv[1]))
         return enif_make_badarg(env);
 
     if ((type = whereis_type(argv[0])) == WHEREIS_ERROR_TYPE)
@@ -551,8 +554,7 @@ static ERL_NIF_TERM dirty_terminating_literal_access(ErlNifEnv* env, int argc, c
      * A literal term in argv[1]
      */
     
-    if (argc != 2)
-	return enif_make_badarg(env);
+    assert(argc == 2);
     
     if (!enif_get_local_pid(env, argv[0], &to))
 	return enif_make_badarg(env);
@@ -651,8 +653,8 @@ static ERL_NIF_TERM delay_halt(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv
     ErlNifPid receiver, self;
     int res, secs;
 
-    if (argc != 3)
-        return enif_make_badarg(env);
+    assert(argc == 3);
+
     if (!enif_get_int(env, argv[2], &secs))
         return enif_make_badarg(env);
     if (secs < 0 || secs*1000 < 0)
@@ -682,8 +684,7 @@ static ERL_NIF_TERM sync_halt(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[
     PrivData *pdata = enif_priv_data(env);
     if (!pdata)
         return enif_raise_exception(env, enif_make_atom(env, "missing_priv_data"));
-    if (argc != 2)
-        return enif_make_badarg(env);
+    assert(argc == 2);
     if (!enif_self(env, &self))
 	return enif_make_badarg(env);
     if (!enif_get_local_pid(env, argv[0], &receiver))
@@ -701,18 +702,12 @@ static ERL_NIF_TERM sync_halt(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[
 
 static ERL_NIF_TERM set_halt_option_from_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
 {
-    unsigned len;
-    char atom_text[32];
-    if (argc != 1)
-        return enif_make_badarg(env);
-    if (!enif_get_atom(env, argv[0], &atom_text[0], sizeof(atom_text), ERL_NIF_LATIN1))
-        return enif_make_badarg(env);
-    if (strcmp(atom_text, "set_on_halt_handler") == 0) {
+    if (argv[0] == atom_set_on_halt_handler) {
         if (0 == enif_set_option(env, ERL_NIF_OPT_ON_HALT, on_halt))
             return atom_ok;
         return atom_error;
     }
-    else if (strcmp(atom_text, "delay_halt") == 0) {
+    else if (argv[0] == atom_delay_halt) {
         if (0 == enif_set_option(env, ERL_NIF_OPT_DELAY_HALT))
             return atom_ok;
         return atom_error;
-- 
2.35.3

openSUSE Build Service is sponsored by