Merge pull request #260 from ukai/shell_escape
Shell escape arguments to /bin/mail.
This commit is contained in:
commit
d72e3be82c
@ -1730,6 +1730,42 @@ void SetExitOnDFatal(bool value) {
|
|||||||
} // namespace internal
|
} // namespace internal
|
||||||
} // namespace base
|
} // namespace base
|
||||||
|
|
||||||
|
// Shell-escaping as we need to shell out ot /bin/mail.
|
||||||
|
static const char kDontNeedShellEscapeChars[] =
|
||||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
"abcdefghijklmnopqrstuvwxyz"
|
||||||
|
"0123456789+-_.=/:,@";
|
||||||
|
|
||||||
|
static string ShellEscape(const string& src) {
|
||||||
|
string result;
|
||||||
|
if (!src.empty() && // empty string needs quotes
|
||||||
|
src.find_first_not_of(kDontNeedShellEscapeChars) == string::npos) {
|
||||||
|
// only contains chars that don't need quotes; it's fine
|
||||||
|
result.assign(src);
|
||||||
|
} else if (src.find_first_of('\'') == string::npos) {
|
||||||
|
// no single quotes; just wrap it in single quotes
|
||||||
|
result.assign("'");
|
||||||
|
result.append(src);
|
||||||
|
result.append("'");
|
||||||
|
} else {
|
||||||
|
// needs double quote escaping
|
||||||
|
result.assign("\"");
|
||||||
|
for (size_t i = 0; i < src.size(); ++i) {
|
||||||
|
switch (src[i]) {
|
||||||
|
case '\\':
|
||||||
|
case '$':
|
||||||
|
case '"':
|
||||||
|
case '`':
|
||||||
|
result.append("\\");
|
||||||
|
}
|
||||||
|
result.append(src, i, 1);
|
||||||
|
}
|
||||||
|
result.append("\"");
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// use_logging controls whether the logging functions LOG/VLOG are used
|
// use_logging controls whether the logging functions LOG/VLOG are used
|
||||||
// to log errors. It should be set to false when the caller holds the
|
// to log errors. It should be set to false when the caller holds the
|
||||||
// log_mutex.
|
// log_mutex.
|
||||||
@ -1745,7 +1781,10 @@ static bool SendEmailInternal(const char*dest, const char *subject,
|
|||||||
}
|
}
|
||||||
|
|
||||||
string cmd =
|
string cmd =
|
||||||
FLAGS_logmailer + " -s\"" + subject + "\" " + dest;
|
FLAGS_logmailer + " -s" +
|
||||||
|
ShellEscape(subject) + " " + ShellEscape(dest);
|
||||||
|
VLOG(4) << "Mailing command: " << cmd;
|
||||||
|
|
||||||
FILE* pipe = popen(cmd.c_str(), "w");
|
FILE* pipe = popen(cmd.c_str(), "w");
|
||||||
if (pipe != NULL) {
|
if (pipe != NULL) {
|
||||||
// Add the body if we have one
|
// Add the body if we have one
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user