- ack (and pushed) - good catch, our tests missed it and it makes the whole ABRT useless :-/
On 01/17/2013 05:52 PM, Jakub Filak wrote:
- /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))
