Re: How to properly escape weird characters in paths to have a valid filelist?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Call me old, but this is 35+ years of experience talking. 
My advice to you is: rename your files to eliminate the special chars.
Even if you get this working, every person that installs your .rpm will curse you
b/c now they have to figure out how to special case your special filenames too,
Don't put spaces/(special chars) in filenames.

On Tue, Jun 29, 2021 at 5:32 AM Miro Hrončok <mhroncok@xxxxxxxxxx> wrote:
Hello,

we have a filelist generator and recently I've discovered a bug when the path
contains a space. Our generator generates one path fer line in a text file that
is to be used via %file -f.


Suppose the path is:

/usr/share/data/filename with spaces in it

In that case, when we literally include this line in the filelist, RPM says
that "with", "spaces", "in" and "it" does not start with "/".

Quite easily I was able to find out that we need to write the path like this:

"/usr/share/data/filename with spaces in it"

That works, so I was about to write a function (in Python) that puts the entire
path in "double quotes" if it contains some space characters (spaces, new
lines, etc.).

However, I have trouble figuring out how to properly escape a path like this:

/usr/share/data/filename with spaces and "quotes" in it

I've tried the following options with no luck:

'/usr/share/data/filename with spaces and "quotes" in it'
"/usr/share/data/filename with spaces and \"quotes\" in it"
"/usr/share/data/filename with spaces and \\"quotes\\" in it"
"/usr/share/data/filename with spaces and \\\"quotes\\\" in it"

While at it, I've also tried to figure out how to escape a % symbol in path.
Suppose the path is literally:

/usr/share/data/%version

I've tried the following options with no luck:

"/usr/share/data/%version"
/usr/share/data/%%version
/usr/share/data/%%%version
/usr/share/data/%%%%version
/usr/share/data/%%%%%version ...



This is my function so far, but it is quite incomplete:

import string

def escape_rpm_path(path):
     """
     Escape special characters in paths
     E.g. a space in path otherwise makes RPM think it's multiple paths,
     unless we put it in "quotes".
     Or a literal % symbol in path might be expanded as a macro if not escaped.
     """
     if "%" in path:
         # path = path.replace("%", "%%") is not enough
         raise NotImplementedError("% symbol in paths, dunno")

     if any(symbol in path for symbol in string.whitespace):
         if '"' in path:
             raise NotImplementedError('" symbol in path with spaces, dunno')
         return f'"{path}"'

     # I wish all paths in the world would end up here:
     return path


What do I do? Is there a specification for the filelist syntax somewhere?


Thanks,
--
Miro Hrončok
--
Phone: +420777974800
IRC: mhroncok

_______________________________________________
Rpm-list mailing list
Rpm-list@xxxxxxxxxxxxx
http://lists.rpm.org/mailman/listinfo/rpm-list
_______________________________________________
Rpm-list mailing list
Rpm-list@xxxxxxxxxxxxx
http://lists.rpm.org/mailman/listinfo/rpm-list

[Index of Archives]     [RPM Ecosystem]     [Linux Kernel]     [Red Hat Install]     [PAM]     [Red Hat Watch]     [Red Hat Development]     [Red Hat]     [Gimp]     [Yosemite News]     [IETF Discussion]

  Powered by Linux