Fix sandbox violation when using subproject as a symlink

Fix "Tried to grab file outside current (sub)project" error when subproject exists within
a source tree but it is used through a symlink. Using subprojects as symlinks is very useful
feature when migrating an existing codebase to meson that all sources do not need to be
immediately moved to subprojects folder.
pull/10451/head
Vili Väinölä 3 years ago committed by Dylan Baker
parent eec7b2c359
commit 18e2f8b2b3
  1. 2
      mesonbuild/interpreter/interpreter.py
  2. 6
      test cases/unit/106 subproject symlink/main.c
  3. 8
      test cases/unit/106 subproject symlink/meson.build
  4. 3
      test cases/unit/106 subproject symlink/symlinked_subproject/meson.build
  5. 4
      test cases/unit/106 subproject symlink/symlinked_subproject/src.c
  6. 13
      unittests/allplatformstests.py

@ -2851,7 +2851,7 @@ Try setting b_lundef to false instead.'''.format(self.coredata.options[OptionKey
# subproject files, as long as they are scheduled to be installed.
if validate_installable_file(norm):
return
norm = Path(srcdir, subdir, fname).resolve()
norm = Path(os.path.abspath(Path(srcdir, subdir, fname)))
if os.path.isdir(norm):
inputtype = 'directory'
else:

@ -0,0 +1,6 @@
extern int foo(void);
int main(void)
{
return foo();
}

@ -0,0 +1,8 @@
project('foo', 'c')
symlinked_subproject = subproject('symlinked_subproject')
executable('foo',
sources : 'main.c',
dependencies : symlinked_subproject.get_variable('dep')
)

@ -0,0 +1,3 @@
project('symlinked_subproject', 'c', version : '1.0.0')
dep = declare_dependency(sources : 'src.c')

@ -4263,3 +4263,16 @@ class AllPlatformTests(BasePlatformTests):
if self.backend is Backend.ninja:
self.assertIn('Generating file.txt with a custom command', out)
self.assertIn('Generating subdir/file.txt with a custom command', out)
def test_symlinked_subproject(self):
testdir = os.path.join(self.unit_test_dir, '106 subproject symlink')
subproject_dir = os.path.join(testdir, 'subprojects')
subproject = os.path.join(testdir, 'symlinked_subproject')
symlinked_subproject = os.path.join(testdir, 'subprojects', 'symlinked_subproject')
if not os.path.exists(subproject_dir):
os.mkdir(subproject_dir)
os.symlink(subproject, symlinked_subproject)
self.addCleanup(os.remove, symlinked_subproject)
self.init(testdir)
self.build()

Loading…
Cancel
Save