diff options
author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2017-03-27 13:17:26 +1300 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-03-27 20:23:19 +0100 |
commit | f41740ee8ee91a57f22ce7fa2a4b8ceeea78de0d (patch) | |
tree | 9cc590519c298d5e2eebfaf339a243c2c7023f50 | |
parent | 58a02e73d0a6b110d96e94033e1fdf634b42ccec (diff) | |
download | poky-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.py | 28 |
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): |