From ce33c5cc4d61157234da1b612379fc098c1d3ae3 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Mon, 11 Jun 2007 02:05:43 +0000 Subject: For bug #181355, detect parenthesis mismatch in paren_reduce(), raise an InvalidDependString exception, and make sure that all callers handle the exception properly. svn path=/main/trunk/; revision=6796 --- bin/repoman | 4 ++++ pym/portage/__init__.py | 16 ++++++++++++---- pym/portage/dbapi/bintree.py | 17 +++++++++++++---- pym/portage/dep.py | 14 ++++++++++++-- 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/bin/repoman b/bin/repoman index 5f7160024..5b16ae0b1 100755 --- a/bin/repoman +++ b/bin/repoman @@ -1141,6 +1141,10 @@ for x in scanlist: except ValueError: badsyntax.append("parenthesis mismatch") mydeplist = [] + except portage.exception.InvalidDependString, e: + badsyntax.append(str(e)) + del e + mydeplist = [] try: portage.dep.use_reduce(mydeplist, excludeall=myiuse) diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 0b5444387..ed440bcbe 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -3228,9 +3228,14 @@ def doebuild_environment(myebuild, mydo, myroot, mysettings, debug, use_cache, m if not eapi_is_supported(eapi): # can't do anything with this. raise portage.exception.UnsupportedAPIException(mycpv, eapi) - mysettings["PORTAGE_RESTRICT"] = " ".join(flatten( - portage.dep.use_reduce(portage.dep.paren_reduce( - mysettings["RESTRICT"]), uselist=mysettings["USE"].split()))) + try: + mysettings["PORTAGE_RESTRICT"] = " ".join(flatten( + portage.dep.use_reduce(portage.dep.paren_reduce( + mysettings.get("RESTRICT","")), + uselist=mysettings.get("USE","").split()))) + except portage.exception.InvalidDependString: + # RESTRICT is validated again inside doebuild, so let this go + mysettings["PORTAGE_RESTRICT"] = "" if mysplit[2] == "r0": mysettings["PVR"]=mysplit[1] @@ -4515,7 +4520,10 @@ def dep_check(depstring, mydbapi, mysettings, use="yes", mode=None, myuse=None, myusesplit=[] #convert parenthesis to sublists - mysplit = portage.dep.paren_reduce(depstring) + try: + mysplit = portage.dep.paren_reduce(depstring) + except portage.exception.InvalidDependString, e: + return [0, str(e)] mymasks = set() useforce = set() diff --git a/pym/portage/dbapi/bintree.py b/pym/portage/dbapi/bintree.py index 31086a5c5..7fb58748f 100644 --- a/pym/portage/dbapi/bintree.py +++ b/pym/portage/dbapi/bintree.py @@ -718,10 +718,19 @@ class binarytree(object): from portage.dep import paren_reduce, use_reduce, \ paren_normalize, paren_enclose for k in "LICENSE", "RDEPEND", "DEPEND", "PDEPEND", "PROVIDE": - deps = paren_reduce(d[k]) - deps = use_reduce(deps, uselist=use) - deps = paren_normalize(deps) - deps = paren_enclose(deps) + try: + deps = paren_reduce(d[k]) + deps = use_reduce(deps, uselist=use) + deps = paren_normalize(deps) + deps = paren_enclose(deps) + except portage.exception.InvalidDependString, e: + writemsg("%s: %s\n" % (k, str(e)), + noiselevel=-1) + del e + writemsg("!!! Invalid binary package: '%s'\n" % \ + self.getname(cpv), noiselevel=-1) + self.dbapi.cpv_remove(cpv) + return if deps: d[k] = deps else: diff --git a/pym/portage/dep.py b/pym/portage/dep.py index 9474c1f25..86975ae26 100644 --- a/pym/portage/dep.py +++ b/pym/portage/dep.py @@ -89,13 +89,23 @@ def paren_reduce(mystr,tokenize=1): """ mylist = [] while mystr: - if ("(" not in mystr) and (")" not in mystr): + left_paren = mystr.find("(") + has_left_paren = left_paren != -1 + right_paren = mystr.find(")") + has_right_paren = right_paren != -1 + if not has_left_paren and not has_right_paren: freesec = mystr subsec = None tail = "" elif mystr[0] == ")": return [mylist,mystr[1:]] - elif ("(" in mystr) and (mystr.index("(") < mystr.index(")")): + elif has_left_paren and not has_right_paren: + raise portage.exception.InvalidDependString( + "missing right parenthesis: '%s'" % mystr) + elif has_right_paren and not has_left_paren: + raise portage.exception.InvalidDependString( + "missing left parenthesis: '%s'" % mystr) + elif has_left_paren and left_paren < right_paren: freesec,subsec = mystr.split("(",1) subsec,tail = paren_reduce(subsec,tokenize) else: -- cgit v1.2.3-1-g7c22