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): |
