summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2017-03-27 13:17:26 +1300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-03-27 20:23:19 +0100
commitf41740ee8ee91a57f22ce7fa2a4b8ceeea78de0d (patch)
tree9cc590519c298d5e2eebfaf339a243c2c7023f50
parent58a02e73d0a6b110d96e94033e1fdf634b42ccec (diff)
downloadpoky-f41740ee8ee91a57f22ce7fa2a4b8ceeea78de0d.tar.gz
bitbake: fetch2/git: prevent recursion on getting latest revision
We call git ls-remote to get the latest revision from a git repository, however by calling runfetchcmd() we can end up recursively running git ls-remote a number of times with OE e.g. if ${SRCPV} is in PV, ${PV} is in WORKDIR, and ${WORKDIR} is in PATH (as a result of recipe-specific sysroots), our call to runfetchcmd() exports PATH so _lsremote() will get called again - with the end result that we run git ls-remote 30 times in quick succession (!). Prevent that from happening by using a guard variable and returning a dummy value if it's called recursively. Fixes [YOCTO #11185]. (Bitbake rev: ff1ccd1db5d70b3fc9ad0d3e8f3d7b804c22bf36) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--bitbake/lib/bb/fetch2/git.py28
1 files changed, 20 insertions, 8 deletions
diff --git a/bitbake/lib/bb/fetch2/git.py b/bitbake/lib/bb/fetch2/git.py
index a8be859d94..2550bde838 100644
--- a/bitbake/lib/bb/fetch2/git.py
+++ b/bitbake/lib/bb/fetch2/git.py
@@ -379,14 +379,26 @@ class Git(FetchMethod):
379 """ 379 """
380 Run git ls-remote with the specified search string 380 Run git ls-remote with the specified search string
381 """ 381 """
382 repourl = self._get_repo_url(ud) 382 # Prevent recursion e.g. in OE if SRCPV is in PV, PV is in WORKDIR,
383 cmd = "%s ls-remote %s %s" % \ 383 # and WORKDIR is in PATH (as a result of RSS), our call to
384 (ud.basecmd, repourl, search) 384 # runfetchcmd() exports PATH so this function will get called again (!)
385 if ud.proto.lower() != 'file': 385 # In this scenario the return call of the function isn't actually
386 bb.fetch2.check_network_access(d, cmd, repourl) 386 # important - WORKDIR isn't needed in PATH to call git ls-remote
387 output = runfetchcmd(cmd, d, True) 387 # anyway.
388 if not output: 388 if d.getVar('_BB_GIT_IN_LSREMOTE', False):
389 raise bb.fetch2.FetchError("The command %s gave empty output unexpectedly" % cmd, ud.url) 389 return ''
390 d.setVar('_BB_GIT_IN_LSREMOTE', '1')
391 try:
392 repourl = self._get_repo_url(ud)
393 cmd = "%s ls-remote %s %s" % \
394 (ud.basecmd, repourl, search)
395 if ud.proto.lower() != 'file':
396 bb.fetch2.check_network_access(d, cmd, repourl)
397 output = runfetchcmd(cmd, d, True)
398 if not output:
399 raise bb.fetch2.FetchError("The command %s gave empty output unexpectedly" % cmd, ud.url)
400 finally:
401 d.delVar('_BB_GIT_IN_LSREMOTE')
390 return output 402 return output
391 403
392 def _latest_revision(self, ud, d, name): 404 def _latest_revision(self, ud, d, name):