about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2023-10-04 09:29:49 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2023-10-05 10:12:42 -0300
commit8cd6203288cfadc4408bd1aff985e48c9d71f563 (patch)
tree47d7bc432b47c341086b6146d40462899b1625bc
parent3552e1dc2b6ba98a718b3f050e9cbfb9abda1768 (diff)
downloadglibc-8cd6203288cfadc4408bd1aff985e48c9d71f563.tar.gz
glibc-8cd6203288cfadc4408bd1aff985e48c9d71f563.tar.xz
glibc-8cd6203288cfadc4408bd1aff985e48c9d71f563.zip
elf: Do not process invalid tunable format
Tunables string with with more than one '=' on its definition are
parsed and enabled, and any subsequent '=' are ignored.  It means
that tunables in the form 'tunable=tunable=value' or
'tunable=value=value' are handled 'tunable=value'.  This inputs are
most likely user input error, which should not be accepted.

Checked on x86_64-linux-gnu.
-rw-r--r--elf/dl-tunables.c6
-rw-r--r--elf/tst-tunables.c22
2 files changed, 21 insertions, 7 deletions
diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c
index a83bd2b8bc..59bee61124 100644
--- a/elf/dl-tunables.c
+++ b/elf/dl-tunables.c
@@ -192,10 +192,12 @@ parse_tunables (char *valstring)
 
       const char *value = p;
 
-      while (*p != ':' && *p != '\0')
+      while (*p != '=' && *p != ':' && *p != '\0')
 	p++;
 
-      if (*p == '\0')
+      if (*p == '=')
+	break;
+      else if (*p == '\0')
 	done = true;
       else
 	*p++ = '\0';
diff --git a/elf/tst-tunables.c b/elf/tst-tunables.c
index 0a9381ba1f..8e9df38564 100644
--- a/elf/tst-tunables.c
+++ b/elf/tst-tunables.c
@@ -159,24 +159,36 @@ static const struct test_t
     0,
     0,
   },
-  /* The ill-formatted tunable is also skipped.  */
+  /* If there is a ill-formatted key=value, everything after is also ignored.  */
   {
     "glibc.malloc.mmap_threshold=glibc.malloc.mmap_threshold=4096:glibc.malloc.check=2",
-    2,
+    0,
     0,
     0,
   },
-  /* For an integer tunable, parse will stop on non number character.  */
   {
     "glibc.malloc.check=2=2",
-    2,
+    0,
     0,
     0,
   },
   {
     "glibc.malloc.check=2=2:glibc.malloc.mmap_threshold=4096",
+    0,
+    0,
+    0,
+  },
+  {
+    "glibc.malloc.check=2=2:glibc.malloc.check=2",
+    0,
+    0,
+    0,
+  },
+  /* Valid tunables set before ill-formatted ones are set.  */
+  {
+    "glibc.malloc.check=2:glibc.malloc.mmap_threshold=4096=4096",
     2,
-    4096,
+    0,
     0,
   }
 };