poky/meta/recipes-devtools/patchelf/patchelf/handle-read-only-files.patch
Richard Purdie a28c145aa4 patchelf: Fix corrupted file mode patch
The recent patchelf upgrades corrupted the file permissions patch we
carry as upstream inserted an early exit to the funciton.

This showed up as corrupted file modes when testing a new uninative tarball
containing this patchelf.

Rework and tweak the patch to fix this.

(From OE-Core rev: bcdba091d99f9a3ae67c0ba17fcf27329698a0c0)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2022-02-11 13:45:20 +00:00

66 lines
1.9 KiB
Diff

From 682fb48c137b687477008b68863c2a0b73ed47d1 Mon Sep 17 00:00:00 2001
From: Fabio Berton <fabio.berton@ossystems.com.br>
Date: Fri, 9 Sep 2016 16:00:42 -0300
Subject: [PATCH] handle read-only files
Patch from:
https://github.com/darealshinji/patchelf/commit/40e66392bc4b96e9b4eda496827d26348a503509
Upstream-Status: Denied [https://github.com/NixOS/patchelf/pull/89]
Signed-off-by: Fabio Berton <fabio.berton@ossystems.com.br>
---
src/patchelf.cc | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
Index: git/src/patchelf.cc
===================================================================
--- git.orig/src/patchelf.cc
+++ git/src/patchelf.cc
@@ -534,9 +534,19 @@ void ElfFile<ElfFileParamNames>::sortShd
static void writeFile(const std::string & fileName, const FileContents & contents)
{
+ struct stat st;
+ int fd;
+
debug("writing %s\n", fileName.c_str());
- int fd = open(fileName.c_str(), O_CREAT | O_TRUNC | O_WRONLY, 0777);
+ if (stat(fileName.c_str(), &st) != 0)
+ error("stat");
+
+ if (chmod(fileName.c_str(), 0600) != 0)
+ error("chmod");
+
+ fd = open(fileName.c_str(), O_CREAT | O_TRUNC | O_WRONLY, 0777);
+
if (fd == -1)
error("open");
@@ -551,8 +561,6 @@ static void writeFile(const std::string
bytesWritten += portion;
}
- if (close(fd) >= 0)
- return;
/*
* Just ignore EINTR; a retry loop is the wrong thing to do.
*
@@ -561,9 +569,11 @@ static void writeFile(const std::string
* http://utcc.utoronto.ca/~cks/space/blog/unix/CloseEINTR
* https://sites.google.com/site/michaelsafyan/software-engineering/checkforeintrwheninvokingclosethinkagain
*/
- if (errno == EINTR)
- return;
- error("close");
+ if ((close(fd) < 0) && errno != EINTR)
+ error("close");
+
+ if (chmod(fileName.c_str(), st.st_mode) != 0)
+ error("chmod");
}