aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/build.cc5
-rw-r--r--src/libutil/util.cc15
-rw-r--r--src/libutil/util.hh6
3 files changed, 24 insertions, 2 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index ca66be3b4..fecee04d5 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -1914,8 +1914,9 @@ void DerivationGoal::initChild()
Strings mounts = tokenizeString<Strings>(readFile("/proc/self/mountinfo", true), "\n");
foreach (Strings::iterator, i, mounts) {
vector<string> fields = tokenizeString<vector<string> >(*i, " ");
- if (mount(0, fields.at(4).c_str(), 0, MS_PRIVATE, 0) == -1)
- throw SysError(format("unable to make filesystem `%1%' private") % fields.at(4));
+ string fs = decodeOctalEscaped(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"
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index 7f95d3981..afb0dc0b2 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -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()
{
try {
diff --git a/src/libutil/util.hh b/src/libutil/util.hh
index 408d99a96..d3861f730 100644
--- a/src/libutil/util.hh
+++ b/src/libutil/util.hh
@@ -332,6 +332,12 @@ string parseString(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
ignore the exception. */
void ignoreException();