]> git.ipfire.org Git - thirdparty/make.git/commitdiff
Check for snprintf truncation on W32
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 5 Aug 2024 08:39:18 +0000 (01:39 -0700)
committerPaul Smith <psmith@gnu.org>
Mon, 2 Sep 2024 18:43:24 +0000 (14:43 -0400)
* src/main.c (find_and_set_default_shell) [MK_OS_W32]:
Do not use a buffer that snprintf truncated.

src/main.c

index e8d19382c7edfa2401d73cff403d31ca6aa7f219..78084d09575df8874949c2c354c7b9fb586ff15d 100644 (file)
@@ -1080,12 +1080,15 @@ find_and_set_default_shell (const char *token)
 
           while (ep && *ep)
             {
+              int sh_pathlen;
               PATH_VAR (sh_path);
 
               *ep = '\0';
 
-              snprintf (sh_path, GET_PATH_MAX, "%s/%s", p, search_token);
-              if (_access (sh_path, 0) == 0)
+              sh_pathlen = snprintf (sh_path, GET_PATH_MAX, "%s/%s",
+                                     p, search_token);
+              if (0 <= sh_pathlen && sh_pathlen < GET_PATH_MAX
+                  && _access (sh_path, 0) == 0)
                 {
                   default_shell = xstrdup (w32ify (sh_path, 0));
                   sh_found = 1;
@@ -1106,9 +1109,13 @@ find_and_set_default_shell (const char *token)
           /* be sure to check last element of Path */
           if (p && *p)
             {
+              int sh_pathlen;
+
               PATH_VAR (sh_path);
-              snprintf (sh_path, GET_PATH_MAX, "%s/%s", p, search_token);
-              if (_access (sh_path, 0) == 0)
+              sh_pathlen = snprintf (sh_path, GET_PATH_MAX, "%s/%s",
+                                     p, search_token);
+              if (0 <= sh_pathlen && sh_pathlen < GET_PATH_MAX
+                  && _access (sh_path, 0) == 0)
                 {
                   default_shell = xstrdup (w32ify (sh_path, 0));
                   sh_found = 1;