- /etc/system-release is symlink
- closes trac#951
Signed-off-by: Jakub Filak <[email protected]>
---
src/include/dump_dir.h | 4 +++-
src/lib/dump_dir.c | 8 ++++----
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/src/include/dump_dir.h b/src/include/dump_dir.h
index 4f6a73e..89c7ff7 100644
--- a/src/include/dump_dir.h
+++ b/src/include/dump_dir.h
@@ -32,7 +32,9 @@ extern "C" {
enum {
DD_FAIL_QUIETLY_ENOENT = (1 << 0),
DD_FAIL_QUIETLY_EACCES = (1 << 1),
- DD_OPEN_READONLY = (1 << 2),
+ /* Open symlinks. dd_* funcs don't open symlinks by default */
+ DD_OPEN_FOLLOW = (1 << 2),
+ DD_OPEN_READONLY = (1 << 3),
};
struct dump_dir {
diff --git a/src/lib/dump_dir.c b/src/lib/dump_dir.c
index 5118860..dfa19aa 100644
--- a/src/lib/dump_dir.c
+++ b/src/lib/dump_dir.c
@@ -608,15 +608,15 @@ void dd_create_basic_files(struct dump_dir *dd, uid_t
uid, const char *chroot_di
if (!release)
{
release = load_text_file("/etc/system-release",
- DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE);
+ DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE | DD_OPEN_FOLLOW);
if (!release)
- release = load_text_file("/etc/redhat-release", /*flags:*/ 0);
+ release = load_text_file("/etc/redhat-release", DD_OPEN_FOLLOW);
dd_save_text(dd, FILENAME_OS_RELEASE, release);
if (chroot_dir)
{
free(release);
char *chrooted_name = concat_path_file(chroot_dir,
"/etc/system-release");
- release = load_text_file(chrooted_name, /*flags:*/ 0);
+ release = load_text_file(chrooted_name, DD_OPEN_FOLLOW);
free(chrooted_name);
if (release[0])
dd_save_text(dd, FILENAME_OS_RELEASE_IN_ROOTDIR, release);
@@ -762,7 +762,7 @@ int dd_delete(struct dump_dir *dd)
static char *load_text_file(const char *path, unsigned flags)
{
- int fd = open(path, O_RDONLY | O_NOFOLLOW);
+ int fd = open(path, O_RDONLY | ((flags & DD_OPEN_FOLLOW) ? 0 :
O_NOFOLLOW));
if (fd == -1)
{
if (!(flags & DD_FAIL_QUIETLY_ENOENT))
--
1.7.11.7