classes/package_rpm: correctly escape percent characters

This many characters doesn't work with rpm 4.19 packaging
(as shown by nodejs recipes), and per documentation a single escape
is enough:

https://github.com/rpm-software-management/rpm/blob/rpm-4.19.x/docs/manual/spec.md#shell-globbing

It also should be done in a function, and just before writing out the
corrected filename to .spec, not earlier where the path may still
be needed for file operations (such as gettings file attributes).

(From OE-Core rev: 6d9fe2623c37e405a80acf71633f7291ecdde533)

Signed-off-by: Alexander Kanavin <alex@linutronix.de>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Alexander Kanavin
2024-01-29 19:06:29 +01:00
committed by Richard Purdie
parent 43f9098a69
commit 4584746c1a

View File

@@ -216,10 +216,12 @@ python write_specfile () {
raise e
return "%attr({:o},{},{}) ".format(mode, owner, group)
def escape_chars(p):
return p.replace("%", "%%")
path = rootpath.replace(walkpath, "")
if path.endswith("DEBIAN") or path.endswith("CONTROL"):
continue
path = path.replace("%", "%%%%%%%%")
# Treat all symlinks to directories as normal files.
# os.walk() lists them as directories.
@@ -238,29 +240,27 @@ python write_specfile () {
for dir in dirs:
if dir == "CONTROL" or dir == "DEBIAN":
continue
dir = dir.replace("%", "%%%%%%%%")
p = path + '/' + dir
# All packages own the directories their files are in...
target.append(get_attr(dir) + '%dir "' + p + '"')
target.append(get_attr(dir) + '%dir "' + escape_chars(p) + '"')
else:
# packages own only empty directories or explict directory.
# This will prevent the overlapping of security permission.
attr = get_attr(path)
if path and not files and not dirs:
target.append(attr + '%dir "' + path + '"')
target.append(attr + '%dir "' + escape_chars(path) + '"')
elif path and path in dirfiles:
target.append(attr + '%dir "' + path + '"')
target.append(attr + '%dir "' + escape_chars(path) + '"')
for file in files:
if file == "CONTROL" or file == "DEBIAN":
continue
file = file.replace("%", "%%%%%%%%")
attr = get_attr(file)
p = path + '/' + file
if conffiles.count(p):
target.append(attr + '%config "' + p + '"')
target.append(attr + '%config "' + escape_chars(p) + '"')
else:
target.append(attr + '"' + p + '"')
target.append(attr + '"' + escape_chars(p) + '"')
# Prevent the prerm/postrm scripts from being run during an upgrade
def wrap_uninstall(scriptvar):