diff options
author | Lars Henriksen <LarsHenriksen@get2net.dk> | 2020-03-18 23:36:14 +0100 |
---|---|---|
committer | Lukas Fleischer <lfleischer@calcurse.org> | 2020-03-22 13:40:28 -0400 |
commit | ffbf714c9e6665c13d9ce5d5a2feac812377a7c0 (patch) | |
tree | 939f5d176238d5f626599e84bbec60b4f1875254 | |
parent | 1cb2691342d74f9a81982c045f66be111999d040 (diff) | |
download | calcurse-ffbf714c9e6665c13d9ce5d5a2feac812377a7c0.tar.gz calcurse-ffbf714c9e6665c13d9ce5d5a2feac812377a7c0.zip |
Fix decoding of escaped characters in imported text
Stick strictly to RFC 5545, 3.3.11, Text, for SUMMARY and DESCRIPTION.
Adresses Github issue #271.
Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
-rw-r--r-- | src/ical.c | 31 | ||||
-rw-r--r-- | test/data/ical-002.ical | 4 | ||||
-rw-r--r-- | test/data/ical-006.ical | 2 |
3 files changed, 23 insertions, 14 deletions
@@ -440,8 +440,9 @@ ical_store_apoint(char *mesg, char *note, long start, long dur, } /* - * Returns an allocated string representing the string given in argument once - * unformatted. + * Returns an allocated string representing the argument string with escaped + * characters decoded, or NULL on error. + * The string is assumed to be the value part of a SUMMARY or DESCRIPTION line. */ static char *ical_unformat_line(char *line) { @@ -453,25 +454,29 @@ static char *ical_unformat_line(char *line) switch (*p) { case '\\': switch (*(p + 1)) { + case 'N': case 'n': string_catf(&s, "%c", '\n'); p++; break; - case 't': - string_catf(&s, "%c", '\t'); - p++; - break; + case '\\': case ';': - case ':': case ',': string_catf(&s, "%c", *(p + 1)); p++; break; default: - string_catf(&s, "%c", *p); - break; + mem_free(s.buf); + return NULL; } break; + case ',': + case ';': + /* + * No list or field separator allowed. + */ + mem_free(s.buf); + return NULL; default: string_catf(&s, "%c", *p); break; @@ -928,8 +933,12 @@ static char *ical_read_summary(char *line, unsigned *noskipped, } /* Event summaries must not contain newlines. */ - for (p = strchr(summary, '\n'); p; p = strchr(p, '\n')) - *p = ' '; + if (strchr(summary, '\n')) { + ical_log(log, item_type, itemline, _("line break in summary.")); + (*noskipped)++; + mem_free(summary); + return NULL; + } return summary; } diff --git a/test/data/ical-002.ical b/test/data/ical-002.ical index 915b84e..b9f6538 100644 --- a/test/data/ical-002.ical +++ b/test/data/ical-002.ical @@ -8,12 +8,12 @@ END:VEVENT BEGIN:VEVENT DTSTART:20000101T000000 DURATION:P1DT1H1M1S -SUMMARY:One day, one hour, one minute and one second +SUMMARY:One day\, one hour\, one minute and one second END:VEVENT BEGIN:VEVENT DTSTART:20000101T000000 DURATION:PT1H1M1S -SUMMARY:One hour, one minute and one second +SUMMARY:One hour\, one minute and one second END:VEVENT BEGIN:VEVENT DTSTART:20000101T000000 diff --git a/test/data/ical-006.ical b/test/data/ical-006.ical index 374ac2d..96c0b2c 100644 --- a/test/data/ical-006.ical +++ b/test/data/ical-006.ical @@ -56,7 +56,7 @@ DTSTART:20120601T150000 DURATION:PT5H10S END:VEVENT BEGIN:VEVENT -SUMMARY:5 hours, 30 minutes and 10 seconds +SUMMARY:5 hours\, 30 minutes and 10 seconds DTSTART:20120601T150000 DURATION:PT5H30M10S END:VEVENT |