diff options
Diffstat (limited to 'src/ical.c')
-rw-r--r-- | src/ical.c | 43 |
1 files changed, 29 insertions, 14 deletions
@@ -1,7 +1,7 @@ /* * Calcurse - text-based organizer * - * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org> + * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -213,8 +213,11 @@ static void ical_export_note(FILE *stream, char *name) int has_desc, has_prop, i; asprintf(¬e_file, "%s/%s", path_notes, name); - if (!(fp = fopen(note_file, "r"))) + if (!(fp = fopen(note_file, "r")) || ungetc(getc(fp), fp) == EOF) { + if (fp) + fclose(fp); return; + } string_init(¬e); while (fgets(lbuf, BUFSIZ, fp)) string_catf(¬e, "%s", lbuf); @@ -518,6 +521,10 @@ ical_store_event(char *mesg, char *note, time_t day, time_t end, struct event *ev; struct recur_event *rev; + if (!mesg) + mesg = mem_strdup(_("(empty)")); + EXIT_IF(!mesg, _("ical_store_event: out of memory")); + /* * Repeating event. The end day is ignored, and the event becomes * one-day even if multi-day. @@ -570,6 +577,10 @@ ical_store_apoint(char *mesg, char *note, time_t start, long dur, struct recur_apoint *rapt; time_t day; + if (!mesg) + mesg = mem_strdup(_("(empty)")); + EXIT_IF(!mesg, _("ical_store_event: out of memory")); + if (has_alarm) state |= APOINT_NOTIFY; if (rpt) { @@ -582,7 +593,7 @@ ical_store_apoint(char *mesg, char *note, time_t start, long dur, * calcurse until day must be changed to the day before. */ if (rpt->until) { - day = update_time_in_date(rpt->until, 0, 0); + day = DAY(rpt->until); if (recur_item_find_occurrence(start, dur, rpt, NULL, day, NULL) && get_item_time(rpt->until) < get_item_time(start)) @@ -680,7 +691,7 @@ static int ical_readline(FILE * fdi, char *buf, char *lstore, unsigned *ln) while (fgets(lstore, BUFSIZ, fdi) != NULL) { (*ln)++; if ((eol = strchr(lstore, '\n')) != NULL) { - if (*(eol - 1) == '\r') + if (strlen(lstore) > 1 && *(eol - 1) == '\r') *(eol - 1) = '\0'; else *eol = '\0'; @@ -1053,7 +1064,7 @@ static struct rpt *ical_read_rrule(FILE *log, char *rrulestr, time_t start, int *count) { - char freqstr[8]; + char freqstr[8], datestr[17]; struct rpt *rpt; char *p, *q; @@ -1082,7 +1093,7 @@ static struct rpt *ical_read_rrule(FILE *log, char *rrulestr, /* FREQ rule part */ if ((p = strstr(rrulestr, "FREQ="))) { - if (sscanf(p, "FREQ=%s", freqstr) != 1) { + if (sscanf(p, "FREQ=%7s", freqstr) != 1) { ical_log(log, ICAL_VEVENT, itemline, _("frequency not set in rrule.")); (*noskipped)++; @@ -1134,7 +1145,14 @@ static struct rpt *ical_read_rrule(FILE *log, char *rrulestr, } if ((p = strstr(rrulestr, "UNTIL="))) { - rpt->until = ical_datetime2time_t(strchr(p, '=') + 1, NULL, type); + if (sscanf(p, "UNTIL=%16s", datestr) != 1) { + ical_log(log, ICAL_VEVENT, itemline, + _("missing until value.")); + (*noskipped)++; + mem_free(rpt); + return NULL; + } + rpt->until = ical_datetime2time_t(datestr, NULL, type); if (!rpt->until) { ical_log(log, ICAL_VEVENT, itemline, _("invalid until format.")); @@ -1322,12 +1340,9 @@ static char *ical_read_summary(char *line, unsigned *noskipped, } /* An event summary is one line only. */ - if (strchr(summary, '\n')) { - ical_log(log, item_type, itemline, _("line break in summary.")); - (*noskipped)++; - mem_free(summary); - summary = NULL; - } + for (p = summary; *p; p++) + if (*p == '\n') + *p = ' '; leave: return summary; } @@ -1541,7 +1556,7 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents, char *msg; dur = vevent_type == EVENT ? -1 : vevent.dur; - day = update_time_in_date(vevent.start, 0, 0); + day = DAY(vevent.start); msg = _("rrule does not match start day (%s)."); if (vevent.count) { |