Use snprintf() instead of sprintf() when building the full config path
to prevent potential buffer overflow.

The function previously used sprintf() to concatenate SRCTREE environment
variable with the expanded config name into a fixed-size buffer
fullname[PATH_MAX+1]. Since getenv() can return arbitrarily long strings,
this could lead to writing beyond the buffer boundary (CWE-120).

Changes:
- Replace sprintf() with snprintf() with proper size checking
- Add validation of snprintf() return value to detect truncation
- Emit conf_warning() if the resulting path exceeds PATH_MAX
- Return the unprefixed name as fallback on error, preserving behavior

This fixes the static analyzer warning:
  confdata.c:119: buffer overflow via getenv() tainted input

Reported-by: static analyzer Svace
Signed-off-by: Anton Moryakov <[email protected]>
---
 scripts/kconfig/confdata.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index d587b10d7f8..756e613fa47 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -152,7 +152,11 @@ char *conf_get_default_confname(void)
        name = expand_string(conf_defname);
        env = getenv(SRCTREE);
        if (env) {
-               sprintf(fullname, "%s/%s", env, name);
+               int ret = snprintf(fullname, sizeof(fullname), "%s/%s", env, 
name);
+               if (ret < 0 || ret >= (int)sizeof(fullname)) {
+                       conf_warning("configuration path too long");
+                       return name;
+               }
                if (is_present(fullname))
                        return fullname;
        }
-- 
2.39.2

Reply via email to