diff --git a/obexd/plugins/vcard.c b/obexd/plugins/vcard.c
index 3b9d9cd..b694438 100644
--- a/obexd/plugins/vcard.c
+++ b/obexd/plugins/vcard.c
dest[j] = 0;
}
+static void escape_semicolon(char *dest, const char *src, int len_max, int len)
+{
+ int i, j;
+
+ for (i = 0, j = 0; i < len && j + 1 < len_max; i++, j++) {
+ if (src[i] == ';') {
+ if (j + 2 >= len_max)
+ break;
+
+ dest[j++] = '\\';
+ }
+
+ dest[j] = src[i];
+ }
+
+ dest[j] = 0;
+}
+
+static void set_escape(uint8_t format, char *dest, const char *src,
+ int len_max, int len)
+{
+ if (format == FORMAT_VCARD30)
+ add_slash(dest, src, len_max, len);
+ else if (format == FORMAT_VCARD21)
+ escape_semicolon(dest, src, len_max, len);
+}
+
static void get_escaped_fields(uint8_t format, char **fields, ...)
{
va_list ap;
line = g_string_new("");
for (field = va_arg(ap, char *); field; ) {
- add_slash(escaped, field, LEN_MAX, strlen(field));
+ set_escape(format, escaped, field, LEN_MAX, strlen(field));
g_string_append(line, escaped);
field = va_arg(ap, char *);
const char *text)
{
char field[LEN_MAX];
- add_slash(field, text, LEN_MAX, strlen(text));
+ set_escape(format, field, text, LEN_MAX, strlen(text));
vcard_printf(vcards, "FN:%s", field);
}
snprintf(buf, LEN_MAX, "%s%s%s%s", tag, separator, type, category);
- add_slash(field, fld, LEN_MAX, len);
+ set_escape(format, field, fld, LEN_MAX, len);
vcard_printf(vcards, "%s:%s", buf, field);
}
category_string = "TYPE=INTERNET;TYPE=OTHER";
}
- add_slash(field, address, LEN_MAX, len);
+ set_escape(format, field, address, LEN_MAX, len);
vcard_printf(vcards, "EMAIL;%s:%s", category_string, field);
}
break;
}
- add_slash(field, url, LEN_MAX, strlen(url));
+ set_escape(format, field, url, LEN_MAX, strlen(url));
vcard_printf(vcards, "URL;%s:%s", category_string, field);
}
for (l = address->fields; l; l = l->next) {
char *field = l->data;
- add_slash(field_esc, field, LEN_MAX, strlen(field));
+ set_escape(format, field_esc, field, LEN_MAX, strlen(field));
g_strlcat(fields, field_esc, len);
if (l->next)