WebSafe 3.7github.com
|
|
🏠
Skip to content

gh-81793: Always call linkat() from os.link(), if available#132517

Merged
serhiy-storchaka merged 13 commits intopython:mainfrom
serhiy-storchaka:os-link-follow_symlinks
May 4, 2025
Merged

gh-81793: Always call linkat() from os.link(), if available#132517
serhiy-storchaka merged 13 commits intopython:mainfrom
serhiy-storchaka:os-link-follow_symlinks

Conversation

@serhiy-storchaka
Copy link
Member

@serhiy-storchaka serhiy-storchaka commented Apr 14, 2025

This fixes os.link() on platforms (like Linux and OpenIndiana) where the system link() function does not follow symlinks.

  • On Linux and OpenIndiana, it now follows symlinks by default or if follow_symlinks=True is specified.
  • On Windows, it now raises error if follow_symlinks=True is passed.
  • On macOS, it now raises error if follow_symlinks=False is passed and the system linkat() function is not available at runtime.
  • On other platforms, it now raises error if follow_symlinks is passed with a value that does not match the system link() function behavior if if the behavior is not known.

📚 Documentation preview 📚: https://cpython-previews--132517.org.readthedocs.build/

This fixes os.link() on platforms (like Linux and OpenIndiana) where the
system link() function does not follow symlinks.

* On Linux and OpenIndiana, it now follows symlinks by default and if
  follow_symlinks=True is specified.
* On Windows, it now raises error if follow_symlinks=True is passed.
* On macOS, it now raises error if follow_symlinks=False is passed and
  the system linkat() function is not available at runtime.
* On other platforms, it now raises error if follow_symlinks is passed
  with a value that does not match the system link() function behavior
  if if the behavior is not known.

Co-authored-by: Joachim Henke <37883863+jo-he@users.noreply.github.com>
Co-authored-by: Thomas Kluyver <takowl@gmail.com>
Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com>
Copy link
Member Author

@serhiy-storchaka serhiy-storchaka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for grammar fixes @StanFromIreland.

@StanFromIreland
Copy link
Member

No problem:-)

@serhiy-storchaka serhiy-storchaka merged commit 5a57248 into python:main May 4, 2025
42 checks passed
@serhiy-storchaka serhiy-storchaka deleted the os-link-follow_symlinks branch May 4, 2025 14:24
@bedevere-bot
Copy link

⚠️⚠️⚠️ Buildbot failure ⚠️⚠️⚠️

Hi! The buildbot aarch64 Android 3.x (tier-3) has failed when building commit 5a57248.

What do you need to do:

  1. Don't panic.
  2. Check the buildbot page in the devguide if you don't know what the buildbots are or how they work.
  3. Go to the page of the buildbot that failed (https://buildbot.python.org/#/builders/1594/builds/2228) and take a look at the build logs.
  4. Check if the failure is related to this commit (5a57248) or if it is a false positive.
  5. If the failure is related to this commit, please, reflect that on the issue and make a new Pull Request with a fix.

You can take a look at the buildbot page here:

https://buildbot.python.org/#/builders/1594/builds/2228

Failed tests:

  • test_posix

Failed subtests:

  • test_link_follow_symlinks - test.test_posix.PosixTester.test_link_follow_symlinks

Summary of the results of the build (if available):

==

Click to see traceback logs
Traceback (most recent call last):
  File "/data/user/0/org.python.testbed/files/python/lib/python3.14/test/test_posix.py", line 1548, in test_link_follow_symlinks
    posix.link(symlink, link, follow_symlinks=False)
    ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PermissionError: [Errno 13] Permission denied: '@test_1785_tmpæsymlink' -> '@test_1785_tmpælink_nofollow'


Traceback (most recent call last):
  File "/data/user/0/org.python.testbed/files/python/lib/python3.14/test/test_posix.py", line 1560, in test_link_follow_symlinks
    posix.link(symlink, link, follow_symlinks=True)
    ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PermissionError: [Errno 13] Permission denied: '@test_1785_tmpæsymlink' -> '@test_1785_tmpælink_following'


Traceback (most recent call last):
  File "/data/user/0/org.python.testbed/files/python/lib/python3.14/test/test_posix.py", line 1537, in test_link_follow_symlinks
    posix.link(symlink, link)
    ~~~~~~~~~~^^^^^^^^^^^^^^^
PermissionError: [Errno 13] Permission denied: '@test_1785_tmpæsymlink' -> '@test_1785_tmpælink'
diegorusso added a commit to diegorusso/cpython that referenced this pull request May 4, 2025
* origin/main: (111 commits)
  pythongh-91048: Add filename and line number to external inspection routines (pythonGH-133385)
  pythongh-131178: Add tests for `ast` command-line interface (python#133329)
  Regenerate pcbuild.sln in Visual Studio 2022 (python#133394)
  pythongh-133042: disable HACL* HMAC on Emscripten (python#133064)
  pythongh-133351: Fix remote PDB's multi-line block tab completion (python#133387)
  pythongh-109700: Improve stress tests for interpreter creation (pythonGH-109946)
  pythongh-81793: Skip tests for os.link() to symlink on Android (pythonGH-133388)
  pythongh-126835: Rename `ast_opt.c` to `ast_preprocess.c` and related stuff after moving const folding to the peephole optimizier (python#131830)
  pythongh-91048: Relax test_async_global_awaited_by to fix flakyness (python#133368)
  pythongh-132457: make staticmethod and classmethod generic (python#132460)
  pythongh-132805: annotationlib: Fix handling of non-constant values in FORWARDREF (python#132812)
  pythongh-132426: Add get_annotate_from_class_namespace replacing get_annotate_function (python#132490)
  pythongh-81793: Always call linkat() from os.link(), if available (pythonGH-132517)
  pythongh-122559: Synchronize C and Python implementation of the io module about pickling (pythonGH-122628)
  pythongh-69605: Add PyREPL import autocomplete feature to 'What's New' (python#133358)
  bpo-44172: Keep reference to original window in curses subwindow objects (pythonGH-26226)
  pythonGH-133231: Changes to executor management to support proposed `sys._jit` module (pythonGH-133287)
  pythongh-133363: Fix Cmd completion for lines beginning with `! ` (python#133364)
  pythongh-132983: Introduce `_zstd` bindings module (pythonGH-133027)
  pythonGH-91048: Add utils for printing the call stack for asyncio tasks (python#133284)
  ...
@freakboy3742
Copy link
Contributor

Not sure of the source of the Android failure here, but it looks related to the subject ticket. Investigation ongoing.

@serhiy-storchaka
Copy link
Member Author

It was fixed on #133388.

@freakboy3742
Copy link
Contributor

It was fixed on #133388.

Thanks for the fast response!

Pranjal095 pushed a commit to Pranjal095/cpython that referenced this pull request Jul 12, 2025
…thonGH-132517)

This fixes os.link() on platforms (like Linux and OpenIndiana) where the
system link() function does not follow symlinks.

* On Linux, it now follows symlinks by default and if
  follow_symlinks=True is specified.
* On Windows, it now raises error if follow_symlinks=True is passed.
* On macOS, it now raises error if follow_symlinks=False is passed and
  the system linkat() function is not available at runtime.
* On other platforms, it now raises error if follow_symlinks is passed
  with a value that does not match the system link() function behavior
  if if the behavior is not known.

Co-authored-by: Joachim Henke <37883863+jo-he@users.noreply.github.com>
Co-authored-by: Thomas Kluyver <takowl@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

4 participants

Comments