ldap/servers/plugins/mep/mep.c | 55 ++++++++++++++++++++++++++++++++++-------
1 file changed, 46 insertions(+), 9 deletions(-)
New commits:
commit 2801442cd00f11716038fd3ffcecc35f89f29837
Author: Nathan Kinder <nkinder(a)redhat.com>
Date: Thu Dec 2 10:24:51 2010 -0800
Bug 658309 - Process escaped characters in managed entry mappings
The managed entry mappings are designed to allow one to use a $
character in the mapped value by escaping it with the "$$" sequence.
The escape itself was ending up in the mapped value. This patch
removes the escape characters when creating the mapped value.
diff --git a/ldap/servers/plugins/mep/mep.c b/ldap/servers/plugins/mep/mep.c
index 9436332..16c2e41 100644
--- a/ldap/servers/plugins/mep/mep.c
+++ b/ldap/servers/plugins/mep/mep.c
@@ -1308,7 +1308,9 @@ mep_parse_mapped_attr(char *mapping, Slapi_Entry *origin,
}
pre_str = p;
- end = p + strlen(p);
+
+ /* Make end point to the last character that we want in the value. */
+ end = p + strlen(p) - 1;
/* Find the variable that we need to substitute. */
for (; p <= end; p++) {
@@ -1322,8 +1324,12 @@ mep_parse_mapped_attr(char *mapping, Slapi_Entry *origin,
}
if (*(p + 1) == '$') {
- /* This is an escaped $, so just skip it. */
+ /* This is an escaped $. Eliminate the escape character
+ * to prevent if from being a part of the value. */
p++;
+ memmove(p, p+1, end-(p+1)+1);
+ *end = '\0';
+ end--;
} else {
int quoted = 0;
@@ -1372,15 +1378,27 @@ mep_parse_mapped_attr(char *mapping, Slapi_Entry *origin,
break;
}
- /* Set the map type. */
- map_type = strndup(var_start, p - var_start);
-
- /* If we're at the end of the string, we
- * don't have a post string. Just set
- * it to an empty string. */
if (p == end) {
- post_str = "";
+ /* Set the map type. In this case, p could be
+ * pointing at either the last character of the
+ * map type, or at the first character after the
+ * map type. If the character is valid for use
+ * in an attribute description, we consider it
+ * to be a part of the map type. */
+ if (IS_ATTRDESC_CHAR(*p)) {
+ map_type = strndup(var_start, p - var_start + 1);
+ /* There is no post string, so
+ * set it to be empty. */
+ post_str = "";
+ } else {
+ map_type = strndup(var_start, p - var_start);
+ post_str = p;
+ }
} else {
+ /* Set the map type. In this case, p is pointing
+ * at the first character after the map type. */
+ map_type = strndup(var_start, p - var_start);
+
/* If the variable is quoted, don't include
* the closing brace in the post string. */
if (quoted) {
@@ -1390,6 +1408,25 @@ mep_parse_mapped_attr(char *mapping, Slapi_Entry *origin,
}
}
+ /* Process the post string to remove any escapes. */
+ for (p = post_str; p <= end; p++) {
+ if (*p == '$') {
+ if ((p == end) || (*(p+1) != '$')) {
+ slapi_log_error( SLAPI_LOG_FATAL, MEP_PLUGIN_SUBSYSTEM,
+ "mep_parse_mapped_attr: Invalid mapped
"
+ "attribute value for type
\"%s\".\n", mapping);
+ ret = 1;
+ goto bail;
+ } else {
+ /* This is an escaped '$'. Remove the escape char.
*/
+ p++;
+ memmove(p, p+1, end-(p+1)+1);
+ *end = '\0';
+ end--;
+ }
+ }
+ }
+
/* We only support a single variable, so we're done. */
break;
}
Show replies by date