Add missing patch
This commit is contained in:
parent
112040abc1
commit
21e9f6edec
52
0001-Avoid-path-traversal.patch
Normal file
52
0001-Avoid-path-traversal.patch
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
From 0ccdf564b6a3e26522a8eb1858f1828844fa3536 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Stephen Kitt <steve@sk2.org>
|
||||||
|
Date: Mon, 5 Jan 2015 06:28:00 +0000
|
||||||
|
Subject: [PATCH] Avoid path traversal
|
||||||
|
|
||||||
|
gcab suffers from a directory traversal bug: it doesn't filter leading
|
||||||
|
slashes from paths in CAB files.
|
||||||
|
(see https://bugs.debian.org/774580)
|
||||||
|
|
||||||
|
The attached patch fixes this, at the cost of ugly paths when faced with
|
||||||
|
relative traversals. At least all the CAB's contents can be extracted,
|
||||||
|
without overwriting anything outside the extraction path.
|
||||||
|
|
||||||
|
https://bugzilla.gnome.org/show_bug.cgi?id=742331
|
||||||
|
---
|
||||||
|
libgcab/gcab-folder.c | 18 +++++++++++++++++-
|
||||||
|
1 file changed, 17 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/libgcab/gcab-folder.c b/libgcab/gcab-folder.c
|
||||||
|
index a140e2c..9510cf3 100644
|
||||||
|
--- a/libgcab/gcab-folder.c
|
||||||
|
+++ b/libgcab/gcab-folder.c
|
||||||
|
@@ -362,9 +362,25 @@ gcab_folder_extract (GCabFolder *self,
|
||||||
|
fname[i] = '/';
|
||||||
|
|
||||||
|
GFile *gfile = g_file_resolve_relative_path (path, fname);
|
||||||
|
- GFile *parent = g_file_get_parent (gfile);
|
||||||
|
g_free (fname);
|
||||||
|
|
||||||
|
+ if (!g_file_has_prefix (gfile, path)) {
|
||||||
|
+ // "Rebase" the file in the given path, to ensure we never escape it
|
||||||
|
+ char *rawpath = g_file_get_path (gfile);
|
||||||
|
+ if (rawpath != NULL) {
|
||||||
|
+ char *newpath = rawpath;
|
||||||
|
+ while (*newpath != 0 && *newpath == G_DIR_SEPARATOR) {
|
||||||
|
+ newpath++;
|
||||||
|
+ }
|
||||||
|
+ GFile *newgfile = g_file_resolve_relative_path (path, newpath);
|
||||||
|
+ g_free (rawpath);
|
||||||
|
+ g_object_unref (gfile);
|
||||||
|
+ gfile = newgfile;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ GFile *parent = g_file_get_parent (gfile);
|
||||||
|
+
|
||||||
|
if (!g_file_make_directory_with_parents (parent, cancellable, &my_error)) {
|
||||||
|
if (g_error_matches (my_error, G_IO_ERROR, G_IO_ERROR_EXISTS))
|
||||||
|
g_clear_error (&my_error);
|
||||||
|
--
|
||||||
|
2.1.0
|
||||||
|
|
Loading…
Reference in New Issue
Block a user