summaryrefslogtreecommitdiff
path: root/src/libostree/ostree-repo-file.c
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2017-06-07 15:25:21 -0400
committerAtomic Bot <atomic-devel@projectatomic.io>2017-06-07 20:54:32 +0000
commitd3900f90f4ca3fbded4ef5a75856dc9036037348 (patch)
tree3e90dfc5c67e8cff41dfa87e13eb16a65d431740 /src/libostree/ostree-repo-file.c
parent807a804b1688db62ac552e58cabf55a55ca84071 (diff)
downloadostree-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.c18
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);
}