Files
nixpkgs/pkgs/by-name/xa/xar/patches/0020-Fall-back-to-readlink-on-Linux.patch
Dark Steveneq 646b892680
Some checks failed
Periodic Merges (6h) / master → staging-nixos (push) Failing after 12m50s
Periodic Merges (6h) / master → staging-next (push) Failing after 12m54s
Periodic Merges (24h) / merge-base(master,staging) → haskell-updates (push) Failing after 11m54s
Periodic Merges (6h) / staging-next → staging (push) Failing after 12m13s
Periodic Merges (24h) / staging-next-25.05 → staging-25.05 (push) Failing after 13m24s
Periodic Merges (24h) / release-25.05 → staging-next-25.05 (push) Failing after 14m28s
push sheeet
2025-10-09 14:15:47 +02:00

49 lines
1.5 KiB
Diff
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Randy Eckenrode <randy@largeandhighquality.com>
Date: Wed, 30 Oct 2024 20:19:20 -0400
Subject: [PATCH 20/20] Fall back to readlink on Linux
---
xar/lib/archive.c | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/xar/lib/archive.c b/xar/lib/archive.c
index b7f9cbf..3a79c74 100644
--- a/xar/lib/archive.c
+++ b/xar/lib/archive.c
@@ -507,10 +507,31 @@ xar_t xar_fdopen_digest_verify(int fd, int32_t flags, void *expected_toc_digest,
// If there are hardlinks, the path we pick is the most recently opened by
// the filesystem; which is effectively random.
char path_buff[PATH_MAX];
+#if defined(__APPLE__)
if (fcntl(fd, F_GETPATH, path_buff) < 0) {
close(fd);
return NULL;
}
+#elif defined(__linux__)
+ // Linux has to get the path to the file via `/proc`.
+ char proc_buff[PATH_MAX];
+ if (snprintf(proc_buff, PATH_MAX, "/proc/self/fd/%i", fd) < 0) {
+ close(fd);
+ return NULL;
+ }
+ if (readlink(proc_buff, &path_buff, PATH_MAX) < 0) {
+ close(fd);
+ return NULL;
+ }
+ // The filename is the files when the fd was created. Check to make sure it still exists.
+ struct stat stat_buff;
+ if (stat(path_buff, &stat_buff) < 0) {
+ close(fd);
+ return NULL;
+ }
+#else
+#error "Unknown platform. Please update with an implementation of `F_GETPATH`."
+#endif
// Don't trust the position of the descriptor we were given, reset it back to 0
if (lseek(fd, 0, SEEK_SET) != 0) {
--
2.47.0