tools/python/pkglint/userland.py
changeset 623 15f87c23a86e
parent 495 4153db6738f5
child 1020 4740049105f5
child 2528 788328aeec2a
--- a/tools/python/pkglint/userland.py	Tue Dec 13 13:58:15 2011 -0800
+++ b/tools/python/pkglint/userland.py	Wed Dec 14 10:23:11 2011 -0800
@@ -50,6 +50,11 @@
 			re.compile('^/usr/'),
 			re.compile('^\$ORIGIN/')
 		]
+		self.runpath_64_re = [
+			re.compile('^.*/64(/.*)?$'),
+			re.compile('^.*/amd64(/.*)?$'),
+			re.compile('^.*/sparcv9(/.*)?$')
+		]
 		self.initscript_re = re.compile("^etc/(rc.|init)\.d")
 
                 self.lint_paths = {}
@@ -195,11 +200,13 @@
 
 		return result
 
-	def __elf_runpath_check(self, path):
+	def __elf_runpath_check(self, path, engine):
 		result = None
 		list = []
 
 		ed = elf.get_dynamic(path)
+		ei = elf.get_info(path)
+		bits = ei.get("bits")
 		for dir in ed.get("runpath", "").split(":"):
 			if dir == None or dir == '':
 				continue
@@ -213,6 +220,22 @@
 			if match == False:
 				list.append(dir)
 
+			if bits == 32:
+				for expr in self.runpath_64_re:
+					if expr.search(dir):
+						engine.warning(
+							_("64-bit runpath in 32-bit binary, '%s' includes '%s'") % (path, dir),
+							msgid="%s%s.3" % (self.name, "001"))
+			else:
+				match = False
+				for expr in self.runpath_64_re:
+					if expr.search(dir):
+						match = True
+						break
+				if match == False:
+					engine.warning(
+						_("32-bit runpath in 64-bit binary, '%s' includes '%s'") % (path, dir),
+						msgid="%s%s.3" % (self.name, "001"))
 		if len(list) > 0:
 			result = _("bad RUNPATH, '%%s' includes '%s'" %
 				   ":".join(list))
@@ -298,7 +321,7 @@
 				if result != None:
 					engine.error(result % path, 
 						msgid="%s%s.2" % (self.name, pkglint_id))
-				result = self.__elf_runpath_check(fullpath)
+				result = self.__elf_runpath_check(fullpath, engine)
 				if result != None:
 					engine.error(result % path, 
 						msgid="%s%s.3" % (self.name, pkglint_id))