Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F133204186
D6286.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D6286.diff
View Options
Index: head/sbin/devd/devd.hh
===================================================================
--- head/sbin/devd/devd.hh
+++ head/sbin/devd/devd.hh
@@ -48,14 +48,17 @@
* no variable of %var is set, then %bogus will be returned.
*/
const std::string &get_variable(const std::string &var) const;
- /** Is there a variable of %var set in thi stable?
+ /** Is there a variable of %var set in this table?
*/
bool is_set(const std::string &var) const;
/** A completely bogus string.
*/
static const std::string bogus;
static const std::string nothing;
+
private:
+ const std::string &fix_value(const std::string &val) const;
+
std::map<std::string, std::string> _vars;
};
Index: head/sbin/devd/devd.cc
===================================================================
--- head/sbin/devd/devd.cc
+++ head/sbin/devd/devd.cc
@@ -411,6 +411,32 @@
return (_vars.find(var) != _vars.end());
}
+/** fix_value
+ *
+ * Removes quoted characters that have made it this far. \" are
+ * converted to ". For all other characters, both \ and following
+ * character. So the string 'fre\:\"' is translated to 'fred\:"'.
+ */
+const std::string &
+var_list::fix_value(const std::string &val) const
+{
+ char *tmp, *dst;
+ const char *src;
+ std::string *rv;
+
+ dst = tmp = new char[val.length()];
+ src = val.c_str();
+ while (*src) {
+ if (*src == '\\' && src[1] == '"')
+ src++;
+ else
+ *dst++ = *src++;
+ }
+ rv = new string(tmp);
+ delete tmp;
+ return *rv;
+}
+
void
var_list::set_variable(const string &var, const string &val)
{
@@ -420,9 +446,9 @@
* can consume excessive amounts of systime inside of connect(). Only
* log when we're in -d mode.
*/
+ _vars[var] = fix_value(val);
if (no_daemon)
devdlog(LOG_DEBUG, "setting %s=%s\n", var.c_str(), val.c_str());
- _vars[var] = val;
}
void
@@ -711,8 +737,13 @@
if (*walker == '"') {
walker++; // skip "
rhs = walker;
- while (*walker && *walker != '"')
+ while (*walker && *walker != '"') {
+ // Skip \" ... We leave it in the string and strip the \ later.
+ // due to the super simplistic parser that we have here.
+ if (*walker == '\\' && walker[1] == '"')
+ walker++;
walker++;
+ }
if (*walker != '"')
return (false);
rhs[-2] = '\0';
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Oct 24, 10:56 PM (17 h, 35 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
24128959
Default Alt Text
D6286.diff (2 KB)
Attached To
Mode
D6286: Implement quote escaping. String values may now contain " if you it is preceded by \.
Attached
Detach File
Event Timeline
Log In to Comment