[gnome-continuous-yocto/gnomeostree-3.28-rocko: 2594/8267] bitbake: fetch2: handle absolute paths in subdir



commit 37d5307db01fa3d708db1abd7bfb134edbba6dc0
Author: Ross Burton <ross burton intel com>
Date:   Wed Sep 21 17:31:27 2016 +0100

    bitbake: fetch2: handle absolute paths in subdir
    
    Currently if you use the subdir parameter in a SRC_URI and pass an absolute path
    then it gets appended to the unpack directory instead of being used directly.
    This is inconvenient as it may be useful to use ${S} when you want to unpack a
    file into the source tree.
    
    Change this behaviour so that absolute paths are used directly instead of being
    appended to the root directory.  To ensure that recipes cannot write files to an
    arbitrary location enforce that the subdir starts with the unpack root.
    
    (Bitbake rev: c3873346c6fa1021a1d63bddd9b898a77c618432)
    
    Signed-off-by: Ross Burton <ross burton intel com>
    Signed-off-by: Richard Purdie <richard purdie linuxfoundation org>

 bitbake/lib/bb/fetch2/__init__.py |    8 +++++++-
 bitbake/lib/bb/tests/fetch.py     |    9 +++++++++
 2 files changed, 16 insertions(+), 1 deletions(-)
---
diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index 06f1eb4..cd7362c 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -1420,7 +1420,13 @@ class FetchMethod(object):
 
         # If 'subdir' param exists, create a dir and use it as destination for unpack cmd
         if 'subdir' in urldata.parm:
-            unpackdir = '%s/%s' % (rootdir, urldata.parm.get('subdir'))
+            subdir = urldata.parm.get('subdir')
+            if os.path.isabs(subdir):
+                if not os.path.realpath(subdir).startswith(os.path.realpath(rootdir)):
+                    raise UnpackError("subdir argument isn't a subdirectory of unpack root %s" % rootdir, 
urldata.url)
+                unpackdir = subdir
+            else:
+                unpackdir = os.path.join(rootdir, subdir)
             bb.utils.mkdirhier(unpackdir)
         else:
             unpackdir = rootdir
diff --git a/bitbake/lib/bb/tests/fetch.py b/bitbake/lib/bb/tests/fetch.py
index d7c73dd..0fd2c02 100644
--- a/bitbake/lib/bb/tests/fetch.py
+++ b/bitbake/lib/bb/tests/fetch.py
@@ -508,6 +508,15 @@ class FetcherLocalTest(FetcherTest):
         tree = self.fetchUnpack(['file://dir/subdir/e;subdir=bar'])
         self.assertEqual(tree, ['bar/dir/subdir/e'])
 
+    def test_local_absolutedir(self):
+        # Unpacking to an absolute path that is a subdirectory of the root
+        # should work
+        tree = self.fetchUnpack(['file://a;subdir=%s' % os.path.join(self.unpackdir, 'bar')])
+
+        # Unpacking to an absolute path outside of the root should fail
+        with self.assertRaises(bb.fetch2.UnpackError):
+            self.fetchUnpack(['file://a;subdir=/bin/sh'])
+
 class FetcherNetworkTest(FetcherTest):
 
     if os.environ.get("BB_SKIP_NETTESTS") == "yes":


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]