[PATCH] nscd: nscd.h: fix off-by-one buffer overflow in init_traced_file
Anton Moryakov
ant.v.moryakov@gmail.com
Wed Oct 29 14:16:06 GMT 2025
Report of the static analyzer:
Accessing an element of array 'file->dname' of size 1024 at nscd.h:111 can
lead to a buffer overflow, since the index 'len' can have an out of range
value 1024, as indicated by the conditional check at nscd.h:108.
Correct explained:
The function init_traced_file copies the directory portion of a path into
file->dname[PATH_MAX] (1024 bytes). It checks if (len > sizeof(file->dname))
before copying, but this allows len == PATH_MAX to pass. In this case,
memcpy writes 1024 bytes, and then a null terminator is written to
file->dname[len], which is out of bounds (valid indices are 0..1023).
This off-by-one error can lead to a stack-based buffer overflow, potentially
corrupting adjacent memory or causing undefined behavior.
Fix by changing the condition to 'if (len >= sizeof(file->dname)) abort();'
to properly reject paths where the directory length equals PATH_MAX.
Signed-off-by: Anton V. Moryakov <ant.v.moryakov@gmail.com>
---
nscd/nscd.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/nscd/nscd.h b/nscd/nscd.h
index 1ea0f08bdf..eb833b8411 100644
--- a/nscd/nscd.h
+++ b/nscd/nscd.h
@@ -105,7 +105,7 @@ init_traced_file(struct traced_file *file, const char *fname, int crinit)
if (dname != NULL)
{
size_t len = (size_t)(dname - fname);
- if (len > sizeof (file->dname))
+ if (len >= sizeof (file->dname))
abort ();
memcpy (file->dname, file->fname, len);
file->dname[len] = '\0';
--
2.39.2
More information about the Libc-alpha
mailing list