Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-filelock for openSUSE:Factory
checked in at 2026-01-06 17:42:33
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-filelock (Old)
and /work/SRC/openSUSE:Factory/.python-filelock.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-filelock"
Tue Jan 6 17:42:33 2026 rev:27 rq:1325388 version:3.20.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-filelock/python-filelock.changes
2025-11-12 21:42:21.724598284 +0100
+++
/work/SRC/openSUSE:Factory/.python-filelock.new.1928/python-filelock.changes
2026-01-06 17:43:34.087144469 +0100
@@ -1,0 +2,10 @@
+Mon Jan 5 10:10:09 UTC 2026 - Nico Krapp <[email protected]>
+
+- Update to 3.20.2
+ * Support Unix systems without O_NOFOLLOW by @mwilliamson in #463
+ * [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci[bot] in #464
+- Update to 3.20.1 (fixes CVE-2025-68146, bsc#1255244)
+ * CVE-2025-68146: Fix TOCTOU symlink vulnerability in lock file creation
+ by @gaborbernat in #461
+
+-------------------------------------------------------------------
Old:
----
filelock-3.20.0.tar.gz
New:
----
filelock-3.20.2.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-filelock.spec ++++++
--- /var/tmp/diff_new_pack.LgI2IF/_old 2026-01-06 17:43:34.879176329 +0100
+++ /var/tmp/diff_new_pack.LgI2IF/_new 2026-01-06 17:43:34.883176491 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-filelock
#
-# Copyright (c) 2025 SUSE LLC and contributors
+# Copyright (c) 2026 SUSE LLC and contributors
# Copyright (c) 2018 Matthias Fehring <[email protected]>
#
# All modifications and additions to the file contributed by third parties
@@ -27,7 +27,7 @@
%endif
%{?sle15_python_module_pythons}
Name: python-filelock%{?pkg_suffix}
-Version: 3.20.0
+Version: 3.20.2
Release: 0
Summary: Platform Independent File Lock in Python
License: Unlicense
@@ -60,7 +60,7 @@
inter-process communication.
%prep
-%setup -q -n filelock-%{version}
+%autosetup -p1 -n filelock-%{version}
%build
%pyproject_wheel
++++++ filelock-3.20.0.tar.gz -> filelock-3.20.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.20.0/PKG-INFO new/filelock-3.20.2/PKG-INFO
--- old/filelock-3.20.0/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
+++ new/filelock-3.20.2/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: filelock
-Version: 3.20.0
+Version: 3.20.2
Summary: A platform independent file lock.
Project-URL: Documentation, https://py-filelock.readthedocs.io
Project-URL: Homepage, https://github.com/tox-dev/py-filelock
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.20.0/src/filelock/_unix.py
new/filelock-3.20.2/src/filelock/_unix.py
--- old/filelock-3.20.0/src/filelock/_unix.py 2020-02-02 01:00:00.000000000
+0100
+++ new/filelock-3.20.2/src/filelock/_unix.py 2020-02-02 01:00:00.000000000
+0100
@@ -39,6 +39,9 @@
def _acquire(self) -> None:
ensure_directory_exists(self.lock_file)
open_flags = os.O_RDWR | os.O_TRUNC
+ o_nofollow = getattr(os, "O_NOFOLLOW", None)
+ if o_nofollow is not None:
+ open_flags |= o_nofollow
if not Path(self.lock_file).exists():
open_flags |= os.O_CREAT
fd = os.open(self.lock_file, open_flags, self._context.mode)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.20.0/src/filelock/_windows.py
new/filelock-3.20.2/src/filelock/_windows.py
--- old/filelock-3.20.0/src/filelock/_windows.py 2020-02-02
01:00:00.000000000 +0100
+++ new/filelock-3.20.2/src/filelock/_windows.py 2020-02-02
01:00:00.000000000 +0100
@@ -11,7 +11,38 @@
from ._util import ensure_directory_exists, raise_on_not_writable_file
if sys.platform == "win32": # pragma: win32 cover
+ import ctypes
import msvcrt
+ from ctypes import wintypes
+
+ # Windows API constants for reparse point detection
+ FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400
+ INVALID_FILE_ATTRIBUTES = 0xFFFFFFFF
+
+ # Load kernel32.dll
+ _kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
+ _kernel32.GetFileAttributesW.argtypes = [wintypes.LPCWSTR]
+ _kernel32.GetFileAttributesW.restype = wintypes.DWORD
+
+ def _is_reparse_point(path: str) -> bool:
+ """
+ Check if a path is a reparse point (symlink, junction, etc.) on
Windows.
+
+ :param path: Path to check
+ :return: True if path is a reparse point, False otherwise
+ :raises OSError: If GetFileAttributesW fails for reasons other than
file-not-found
+ """
+ attrs = _kernel32.GetFileAttributesW(path)
+ if attrs == INVALID_FILE_ATTRIBUTES:
+ # File doesn't exist yet - that's fine, we'll create it
+ err = ctypes.get_last_error()
+ if err == 2: # noqa: PLR2004 # ERROR_FILE_NOT_FOUND
+ return False
+ if err == 3: # noqa: PLR2004 # ERROR_PATH_NOT_FOUND
+ return False
+ # Some other error - let caller handle it
+ return False
+ return bool(attrs & FILE_ATTRIBUTE_REPARSE_POINT)
class WindowsFileLock(BaseFileLock):
"""Uses the :func:`msvcrt.locking` function to hard lock the lock file
on Windows systems."""
@@ -19,6 +50,13 @@
def _acquire(self) -> None:
raise_on_not_writable_file(self.lock_file)
ensure_directory_exists(self.lock_file)
+
+ # Security check: Refuse to open reparse points (symlinks,
junctions)
+ # This prevents TOCTOU symlink attacks (CVE-TBD)
+ if _is_reparse_point(self.lock_file):
+ msg = f"Lock file is a reparse point (symlink/junction):
{self.lock_file}"
+ raise OSError(msg)
+
flags = (
os.O_RDWR # open for read and write
| os.O_CREAT # create file if not exists
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.20.0/src/filelock/version.py
new/filelock-3.20.2/src/filelock/version.py
--- old/filelock-3.20.0/src/filelock/version.py 2020-02-02 01:00:00.000000000
+0100
+++ new/filelock-3.20.2/src/filelock/version.py 2020-02-02 01:00:00.000000000
+0100
@@ -28,7 +28,7 @@
commit_id: COMMIT_ID
__commit_id__: COMMIT_ID
-__version__ = version = '3.20.0'
-__version_tuple__ = version_tuple = (3, 20, 0)
+__version__ = version = '3.20.2'
+__version_tuple__ = version_tuple = (3, 20, 2)
__commit_id__ = commit_id = None