diff options
author | Colin Walters <walters@verbum.org> | 2017-06-07 15:25:21 -0400 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2017-06-07 20:54:32 +0000 |
commit | d3900f90f4ca3fbded4ef5a75856dc9036037348 (patch) | |
tree | 3e90dfc5c67e8cff41dfa87e13eb16a65d431740 /src/libostree/ostree-repo-file.c | |
parent | 807a804b1688db62ac552e58cabf55a55ca84071 (diff) | |
download | ostree-d3900f90f4ca3fbded4ef5a75856dc9036037348.tar.gz |
lib/repofile: Follow symlinks for `g_file_read()`
This avoids `ostree cat /path/to/symlink` crashing, a longstanding embarassing
issue.
Closes: #915
Approved by: jlebon
Diffstat (limited to 'src/libostree/ostree-repo-file.c')
-rw-r--r-- | src/libostree/ostree-repo-file.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/libostree/ostree-repo-file.c b/src/libostree/ostree-repo-file.c index 2a90f6c7..fcc435a8 100644 --- a/src/libostree/ostree-repo-file.c +++ b/src/libostree/ostree-repo-file.c @@ -928,9 +928,23 @@ ostree_repo_file_read (GFile *file, checksum = ostree_repo_file_get_checksum (self); - if (!ostree_repo_load_file (self->repo, checksum, &ret_stream, - NULL, NULL, cancellable, error)) + g_autoptr(GFileInfo) finfo = NULL; + if (!ostree_repo_load_file (self->repo, checksum, NULL, + &finfo, NULL, cancellable, error)) return NULL; + if (g_file_info_get_file_type (finfo) == G_FILE_TYPE_REGULAR) + { + if (!ostree_repo_load_file (self->repo, checksum, &ret_stream, + NULL, NULL, cancellable, error)) + return NULL; + } + else + { + g_autoptr(GFile) parent = g_file_get_parent (file); + const char *target = g_file_info_get_symlink_target (finfo); + g_autoptr(GFile) dest = g_file_resolve_relative_path (parent, target); + return g_file_read (dest, cancellable, error); + } return g_steal_pointer (&ret_stream); } |