bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] File name too long causing failure to open temporary head file i


From: jiaying.song.cn
Subject: [PATCH] File name too long causing failure to open temporary head file in dlltool
Date: Mon, 12 Aug 2024 17:28:27 +0800

From: Jiaying Song <jiaying.song.cn@windriver.com>

During the execution of the command: i686-w64-mingw32-dlltool
--input-def $def_filepath --output-delaylib $filepath --dllname qemu.exe
An error occurred:
i686-w64-mingw32-dlltool: failed to open temporary head file: 
..._w64_mingw32_nativesdk_qemu_8_2_2_build_plugins_libqemu_plugin_api_a_h.s

Due to the path length exceeding the Linux system's file name length
limit (NAME_MAX=255), the temporary file name generated by the
i686-w64-mingw32-dlltool command becomes too long to open. To address
this, a new temporary file name prefix is generated using tmp_prefix =
prefix_encode ("d", getpid()), ensuring that the file name does not
exceed the system's length limit.

Signed-off-by: Jiaying Song <jiaying.song.cn@windriver.com>
---
 binutils/dlltool.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/binutils/dlltool.c b/binutils/dlltool.c
index 066c99a4..acaeb5a7 100644
--- a/binutils/dlltool.c
+++ b/binutils/dlltool.c
@@ -4099,11 +4099,18 @@ main (int ac, char **av)
       if (imp_name || delayimp_name)
         {
           const char *input = imp_name ? imp_name : delayimp_name;
-          tmp_prefix = xmalloc (strlen (input) + 2);
-          sprintf (tmp_prefix, "%s_", input);
-          for (i = 0; tmp_prefix[i]; i++)
-            if (!ISALNUM (tmp_prefix[i]))
-              tmp_prefix[i] = '_';
+          if ((strlen(input) + 2) > NAME_MAX)
+            {
+              tmp_prefix = prefix_encode ("d", getpid ());
+            }
+          else
+            {
+              tmp_prefix = xmalloc (strlen (input) + 2);
+              sprintf (tmp_prefix, "%s_", input);
+              for (i = 0; tmp_prefix[i]; i++)
+              if (!ISALNUM (tmp_prefix[i]))
+                tmp_prefix[i] = '_';
+            }
         }
       else
         {
-- 
2.25.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]