The current version of argz_stringify will underflow its size_t argument
if 0 is passed in and then go and change lots of '\0' bytes to something
else.
The patch below fixes that by replacing argz_stringify with the version
from glibc-2.7
David
>From 49d7160e112d6807f891043e51f84f7cce8e8470 Mon Sep 17 00:00:00 2001
From: David Lutterkort <[EMAIL PROTECTED]>
Date: Thu, 29 May 2008 14:35:18 -0700
Subject: Fix underflow and subsequent memory corruption
* lib/argz.c(argz_stringify): sync with glibc-2.7; previous version
would underflow the size_t len when it was 0
* modules/argz: add dependency on strnlen
Signed-off-by: David Lutterkort <[EMAIL PROTECTED]>
---
lib/argz.c | 23 +++++++++++------------
modules/argz | 1 +
2 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/lib/argz.c b/lib/argz.c
index 91d284c..5c8bf57 100644
--- a/lib/argz.c
+++ b/lib/argz.c
@@ -409,19 +409,18 @@ argz_next (char *argz, size_t argz_len, const char *entry)
void
-argz_stringify (char *argz, size_t argz_len, int sep)
+argz_stringify (char *argz, size_t len, int sep)
{
- assert ((argz && argz_len) || (!argz && !argz_len));
-
- if (sep)
- {
- --argz_len; /* don't stringify the terminating EOS */
- while (--argz_len > 0)
- {
- if (argz[argz_len] == EOS_CHAR)
- argz[argz_len] = sep;
- }
- }
+ if (len > 0)
+ while (1)
+ {
+ size_t part_len = strnlen (argz, len);
+ argz += part_len;
+ len -= part_len;
+ if (len-- <= 1) /* includes final '\0' we want to stop at */
+ break;
+ *argz++ = sep;
+ }
}
diff --git a/modules/argz b/modules/argz
index 9898435..e2b148f 100644
--- a/modules/argz
+++ b/modules/argz
@@ -10,6 +10,7 @@ Depends-on:
mempcpy
stpcpy
strndup
+strnlen
configure.ac:
gl_FUNC_ARGZ
--
1.5.4.1