Handle octal escapes in /proc/self/mountinfo
This commit is contained in:
parent
f406288cc7
commit
e666e1156f
3 changed files with 24 additions and 2 deletions
|
@ -1914,8 +1914,9 @@ void DerivationGoal::initChild()
|
||||||
Strings mounts = tokenizeString<Strings>(readFile("/proc/self/mountinfo", true), "\n");
|
Strings mounts = tokenizeString<Strings>(readFile("/proc/self/mountinfo", true), "\n");
|
||||||
foreach (Strings::iterator, i, mounts) {
|
foreach (Strings::iterator, i, mounts) {
|
||||||
vector<string> fields = tokenizeString<vector<string> >(*i, " ");
|
vector<string> fields = tokenizeString<vector<string> >(*i, " ");
|
||||||
if (mount(0, fields.at(4).c_str(), 0, MS_PRIVATE, 0) == -1)
|
string fs = decodeOctalEscaped(fields.at(4));
|
||||||
throw SysError(format("unable to make filesystem `%1%' private") % fields.at(4));
|
if (mount(0, fs.c_str(), 0, MS_PRIVATE, 0) == -1)
|
||||||
|
throw SysError(format("unable to make filesystem `%1%' private") % fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Bind-mount all the directories from the "host"
|
/* Bind-mount all the directories from the "host"
|
||||||
|
|
|
@ -1101,6 +1101,21 @@ bool endOfList(std::istream & str)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string decodeOctalEscaped(const string & s)
|
||||||
|
{
|
||||||
|
string r;
|
||||||
|
for (string::const_iterator i = s.begin(); i != s.end(); ) {
|
||||||
|
if (*i != '\\') { r += *i++; continue; }
|
||||||
|
unsigned char c = 0;
|
||||||
|
++i;
|
||||||
|
while (i != s.end() && *i >= '0' && *i < '8')
|
||||||
|
c = c * 8 + (*i++ - '0');
|
||||||
|
r += c;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ignoreException()
|
void ignoreException()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -332,6 +332,12 @@ string parseString(std::istream & str);
|
||||||
bool endOfList(std::istream & str);
|
bool endOfList(std::istream & str);
|
||||||
|
|
||||||
|
|
||||||
|
/* Escape a string that contains octal-encoded escape codes such as
|
||||||
|
used in /etc/fstab and /proc/mounts (e.g. "foo\040bar" decodes to
|
||||||
|
"foo bar"). */
|
||||||
|
string decodeOctalEscaped(const string & s);
|
||||||
|
|
||||||
|
|
||||||
/* Exception handling in destructors: print an error message, then
|
/* Exception handling in destructors: print an error message, then
|
||||||
ignore the exception. */
|
ignore the exception. */
|
||||||
void ignoreException();
|
void ignoreException();
|
||||||
|
|
Loading…
Reference in a new issue