diff mbox series

[dunfell,1.46,1/2] utils: Handle lockfile filenames that are too long for filesystems

Message ID 30d42ef030d03e11322b6b05ea7bbb64ab3d6f21.1668880159.git.steve@sakoman.com
State Accepted, archived
Commit 30d42ef030d03e11322b6b05ea7bbb64ab3d6f21
Headers show
Series [dunfell,1.46,1/2] utils: Handle lockfile filenames that are too long for filesystems | expand

Commit Message

Steve Sakoman Nov. 19, 2022, 5:51 p.m. UTC
From: Richard Purdie <richard.purdie@linuxfoundation.org>

The fetcher mirror code can go crazy creating lock filenames which exceed the
filesystem limits. When this happens, the code will loop/hang.

Handle the filename too long exception correctly but also truncate lockfile
lengths to under 256 since the worst case situation is lockfile overlap
and lack of parallelism.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit 63baf3440b16e41ac6601de21ced94a94bdf1509)
Signed-off-by: Steve Sakoman <steve@sakoman.com>
---
 lib/bb/utils.py | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/lib/bb/utils.py b/lib/bb/utils.py
index 6592eb00..210e535f 100644
--- a/lib/bb/utils.py
+++ b/lib/bb/utils.py
@@ -461,6 +461,10 @@  def lockfile(name, shared=False, retry=True, block=False):
     consider the possibility of sending a signal to the process to break
     out - at which point you want block=True rather than retry=True.
     """
+    if len(name) > 255:
+        root, ext = os.path.splitext(name)
+        name = root[:255 - len(ext)] + ext
+
     dirname = os.path.dirname(name)
     mkdirhier(dirname)
 
@@ -497,7 +501,7 @@  def lockfile(name, shared=False, retry=True, block=False):
                     return lf
             lf.close()
         except OSError as e:
-            if e.errno == errno.EACCES:
+            if e.errno == errno.EACCES or e.errno == errno.ENAMETOOLONG:
                 logger.error("Unable to acquire lock '%s', %s",
                              e.strerror, name)
                 sys.exit(1)