[evolution] Bug #607257 - Add checks for event->comp_data != NULL
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] Bug #607257 - Add checks for event->comp_data != NULL
- Date: Thu, 13 May 2010 21:50:23 +0000 (UTC)
commit 5a124a6add633ba4af8babc8de7a8a9b8058899e
Author: Milan Crha <mcrha redhat com>
Date: Thu May 13 23:49:58 2010 +0200
Bug #607257 - Add checks for event->comp_data != NULL
calendar/gui/e-cal-list-view.c | 3 +
calendar/gui/e-calendar-view.c | 54 +++++-
calendar/gui/e-calendar-view.h | 8 +
calendar/gui/e-day-view-main-item.c | 12 +
calendar/gui/e-day-view-top-item.c | 13 +
calendar/gui/e-day-view.c | 302 +++++++++++++++++++++++---
calendar/gui/e-week-view-event-item.c | 39 ++++
calendar/gui/e-week-view.c | 155 +++++++++++++-
calendar/gui/ea-cal-view-event.c | 10 +
calendar/gui/print.c | 9 +
modules/calendar/e-cal-shell-view-actions.c | 36 +++-
modules/calendar/e-cal-shell-view-private.c | 3 +
modules/calendar/e-cal-shell-view.c | 2 +-
plugins/groupwise-features/gw-ui.c | 2 +-
plugins/groupwise-features/process-meeting.c | 16 +-
15 files changed, 623 insertions(+), 41 deletions(-)
---
diff --git a/calendar/gui/e-cal-list-view.c b/calendar/gui/e-cal-list-view.c
index 31ef86d..aabf98c 100644
--- a/calendar/gui/e-cal-list-view.c
+++ b/calendar/gui/e-cal-list-view.c
@@ -421,6 +421,9 @@ e_cal_list_view_get_selected_time_range (ECalendarView *cal_view, time_t *start_
ECalComponentDateTime dtstart, dtend;
ECalComponent *comp;
+ if (!is_comp_data_valid (event))
+ return FALSE;
+
comp = e_cal_component_new ();
e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
if (start_time) {
diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c
index 48b2933..77d8fd2 100644
--- a/calendar/gui/e-calendar-view.c
+++ b/calendar/gui/e-calendar-view.c
@@ -170,6 +170,9 @@ calendar_view_delete_event (ECalendarView *cal_view,
gboolean delete = FALSE;
GError *error = NULL;
+ if (!is_comp_data_valid (event))
+ return;
+
comp = e_cal_component_new ();
e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
vtype = e_cal_component_get_vtype (comp);
@@ -451,6 +454,9 @@ calendar_view_cut_clipboard (ESelectable *selectable)
if (!event)
continue;
+ if (!is_comp_data_valid (event))
+ continue;
+
comp = e_cal_component_new ();
e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
@@ -560,7 +566,7 @@ calendar_view_copy_clipboard (ESelectable *selectable)
for (l = selected; l != NULL; l = l->next) {
event = (ECalendarViewEvent *) l->data;
- if (event) {
+ if (event && is_comp_data_valid (event)) {
e_cal_util_add_timezones_from_component (vcal_comp, event->comp_data->icalcomp);
add_related_timezones (vcal_comp, event->comp_data->icalcomp, event->comp_data->client);
@@ -570,6 +576,9 @@ calendar_view_copy_clipboard (ESelectable *selectable)
for (l = selected; l != NULL; l = l->next) {
event = (ECalendarViewEvent *) l->data;
+ if (!is_comp_data_valid (event))
+ continue;
+
new_icalcomp = icalcomponent_new_clone (event->comp_data->icalcomp);
/* remove RECURRENCE-IDs from copied objects */
@@ -1205,6 +1214,9 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view)
if (!selected)
return;
event = (ECalendarViewEvent *) selected->data;
+ if (!is_comp_data_valid (event))
+ return;
+
comp = e_cal_component_new ();
e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
vtype = e_cal_component_get_vtype (comp);
@@ -1315,7 +1327,7 @@ e_calendar_view_open_event (ECalendarView *cal_view)
selected = e_calendar_view_get_selected_events (cal_view);
if (selected) {
ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data;
- if (event)
+ if (event && is_comp_data_valid (event))
e_calendar_view_edit_appointment (cal_view, event->comp_data->client,
event->comp_data->icalcomp, icalcomponent_get_first_property(event->comp_data->icalcomp, ICAL_ATTENDEE_PROPERTY) != NULL);
@@ -1803,6 +1815,9 @@ e_calendar_view_get_tooltips (ECalendarViewEventData *data)
default_zone = e_calendar_view_get_timezone (data->cal_view);
pevent = data->get_view_event (data->cal_view, data->day, data->event_num);
+ if (!is_comp_data_valid (pevent))
+ return FALSE;
+
client = pevent->comp_data->client;
clone_comp = icalcomponent_new_clone (pevent->comp_data->icalcomp);
@@ -2104,3 +2119,38 @@ get_today_background (const GdkColor base_background)
return res;
}
+gboolean
+is_comp_data_valid_func (ECalendarViewEvent *event, const gchar *location)
+{
+ g_return_val_if_fail (location != NULL, FALSE);
+
+ if (!event) {
+ g_warning ("%s: event is NULL", location);
+ return FALSE;
+ }
+
+ if (!event->comp_data) {
+ g_warning ("%s: event's (%p) comp_data is NULL", location, event);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+gboolean
+is_array_index_in_bounds_func (GArray *array, gint index, const gchar *location)
+{
+ g_return_val_if_fail (location != NULL, FALSE);
+
+ if (!array) {
+ g_warning ("%s: array is NULL", location);
+ return FALSE;
+ }
+
+ if (index < 0 || index >= array->len) {
+ g_warning ("%s: index %d is out of bounds [0,%d) at array %p", location, index, array->len, array);
+ return FALSE;
+ }
+
+ return TRUE;
+}
diff --git a/calendar/gui/e-calendar-view.h b/calendar/gui/e-calendar-view.h
index 62fcabc..6f68e63 100644
--- a/calendar/gui/e-calendar-view.h
+++ b/calendar/gui/e-calendar-view.h
@@ -87,6 +87,14 @@ typedef struct {
E_CALENDAR_VIEW_EVENT_FIELDS
} ECalendarViewEvent;
+/* checks if event->comp_data is not NULL, returns FALSE when it is and prints a warning on a console */
+gboolean is_comp_data_valid_func (ECalendarViewEvent *event, const gchar *location);
+#define is_comp_data_valid(_event) is_comp_data_valid_func ((ECalendarViewEvent *) (_event), G_STRFUNC)
+
+/* checks if index is within bounds for the array; returns FALSE when not, and prints a warning on a console */
+gboolean is_array_index_in_bounds_func (GArray *array, gint index, const gchar *location);
+#define is_array_index_in_bounds(_array, _index) is_array_index_in_bounds_func (_array, _index, G_STRFUNC)
+
typedef struct _ECalendarView ECalendarView;
typedef struct _ECalendarViewClass ECalendarViewClass;
typedef struct _ECalendarViewPrivate ECalendarViewPrivate;
diff --git a/calendar/gui/e-day-view-main-item.c b/calendar/gui/e-day-view-main-item.c
index 757d4e9..5de9b76 100644
--- a/calendar/gui/e-day-view-main-item.c
+++ b/calendar/gui/e-day-view-main-item.c
@@ -107,6 +107,9 @@ day_view_main_item_draw_long_events_in_vbars (EDayViewMainItem *main_item,
gboolean first = TRUE;
event = &g_array_index (day_view->long_events, EDayViewEvent, event_num);
+ if (!is_comp_data_valid (event))
+ continue;
+
/* If the event is TRANSPARENT, skip it. */
if (icalcomp_is_transparent (event->comp_data->icalcomp)) {
continue;
@@ -248,9 +251,15 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
font_options = get_font_options ();
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
+ if (!is_comp_data_valid (event))
+ return;
+
/* Fill in the event background. Note that for events in the first
column of the day, we might not want to paint over the vertical bar,
since that is used for multiple events. But then you can't see
@@ -866,6 +875,9 @@ day_view_main_item_draw_events_in_vbars (EDayViewMainItem *main_item,
for (event_num = 0; event_num < day_view->events[day]->len; event_num++) {
event = &g_array_index (day_view->events[day], EDayViewEvent, event_num);
+ if (!is_comp_data_valid (event))
+ continue;
+
/* We can skip the events in the first column since they will
draw over this anyway. */
if (event->num_columns > 0 && event->start_row_or_col == 0) {
diff --git a/calendar/gui/e-day-view-top-item.c b/calendar/gui/e-day-view-top-item.c
index c4d30d6..f622b82 100644
--- a/calendar/gui/e-day-view-top-item.c
+++ b/calendar/gui/e-day-view-top-item.c
@@ -93,8 +93,15 @@ day_view_top_item_draw_triangle (EDayViewTopItem *top_item,
if (h % 2 == 0)
c1--;
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
event_num);
+
+ if (!is_comp_data_valid (event))
+ return;
+
cairo_save (cr);
/* Fill it in. */
if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)),
@@ -187,9 +194,15 @@ day_view_top_item_draw_long_event (EDayViewTopItem *top_item,
&item_w, &item_h))
return;
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
event_num);
+ if (!is_comp_data_valid (event))
+ return;
+
style = gtk_widget_get_style (GTK_WIDGET (day_view));
gc = day_view->main_gc;
fg_gc = style->fg_gc[GTK_STATE_NORMAL];
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c
index 3d9985b..a171d94 100644
--- a/calendar/gui/e-day-view.c
+++ b/calendar/gui/e-day-view.c
@@ -1526,7 +1526,7 @@ e_day_view_get_text_color (EDayView *day_view, EDayViewEvent *event, GtkWidget *
green = day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND].green;
blue = day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND].blue;
- if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), event->comp_data),
+ if (is_comp_data_valid (event) && gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), event->comp_data),
&bg_color)) {
GdkColormap *colormap;
colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view));
@@ -2009,6 +2009,9 @@ e_day_view_foreach_event_with_uid (EDayView *day_view,
event = &g_array_index (day_view->events[day],
EDayViewEvent, event_num);
+ if (!is_comp_data_valid (event))
+ continue;
+
u = icalcomponent_get_uid (event->comp_data->icalcomp);
if (uid && !strcmp (uid, u)) {
if (!(*callback) (day_view, day, event_num, data))
@@ -2023,6 +2026,9 @@ e_day_view_foreach_event_with_uid (EDayView *day_view,
event = &g_array_index (day_view->long_events,
EDayViewEvent, event_num);
+ if (!is_comp_data_valid (event))
+ continue;
+
u = icalcomponent_get_uid (event->comp_data->icalcomp);
if (u && !strcmp (uid, u)) {
if (!(*callback) (day_view, E_DAY_VIEW_LONG_EVENT, event_num, data))
@@ -2044,12 +2050,19 @@ e_day_view_remove_event_cb (EDayView *day_view,
day, event_num);
#endif
- if (day == E_DAY_VIEW_LONG_EVENT)
+ if (day == E_DAY_VIEW_LONG_EVENT) {
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return TRUE;
+
event = &g_array_index (day_view->long_events,
EDayViewEvent, event_num);
- else
+ } else {
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return TRUE;
+
event = &g_array_index (day_view->events[day],
EDayViewEvent, event_num);
+ }
if (!event)
return TRUE;
@@ -2069,7 +2082,8 @@ e_day_view_remove_event_cb (EDayView *day_view,
if (event->canvas_item)
gtk_object_destroy (GTK_OBJECT (event->canvas_item));
- g_object_unref (event->comp_data);
+ if (is_comp_data_valid (event))
+ g_object_unref (event->comp_data);
event->comp_data = NULL;
if (day == E_DAY_VIEW_LONG_EVENT) {
@@ -2093,6 +2107,9 @@ set_text_as_bold (EDayViewEvent *event)
gchar *address;
ECalComponentAttendee *at = NULL;
+ if (!is_comp_data_valid (event))
+ return;
+
comp = e_cal_component_new ();
e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
address = itip_get_comp_attendee (comp, event->comp_data->client);
@@ -2131,10 +2148,13 @@ e_day_view_update_event_label (EDayView *day_view,
gchar *text;
gint interval;
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day], EDayViewEvent, event_num);
/* If the event isn't visible just return. */
- if (!event->canvas_item)
+ if (!event->canvas_item || !is_comp_data_valid (event))
return;
summary = icalcomponent_get_summary (event->comp_data->icalcomp);
@@ -2182,11 +2202,14 @@ e_day_view_update_long_event_label (EDayView *day_view,
const gchar *summary;
gboolean free_text = FALSE;
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
event_num);
/* If the event isn't visible just return. */
- if (!event->canvas_item)
+ if (!event->canvas_item || !is_comp_data_valid (event))
return;
summary = e_calendar_view_get_icalcomponent_summary (event->comp_data->client, event->comp_data->icalcomp, &free_text);
@@ -2271,6 +2294,9 @@ e_day_view_find_event_from_uid (EDayView *day_view,
event = &g_array_index (day_view->events[day],
EDayViewEvent, event_num);
+ if (!is_comp_data_valid (event))
+ continue;
+
if (event->comp_data->client != client)
continue;
@@ -2299,6 +2325,9 @@ e_day_view_find_event_from_uid (EDayView *day_view,
event = &g_array_index (day_view->long_events,
EDayViewEvent, event_num);
+ if (!is_comp_data_valid (event))
+ continue;
+
if (event->comp_data->client != client)
continue;
@@ -3424,6 +3453,9 @@ e_day_view_on_long_event_button_press (EDayView *day_view,
} else if (event->button == 3) {
EDayViewEvent *e;
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return TRUE;
+
e = &g_array_index (day_view->long_events, EDayViewEvent, event_num);
e_day_view_set_selected_time_range_in_top_visible (day_view, e->start, e->end);
@@ -3462,6 +3494,9 @@ e_day_view_on_event_button_press (EDayView *day_view,
} else if (event->button == 3) {
EDayViewEvent *e;
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return TRUE;
+
e = &g_array_index (day_view->events[day], EDayViewEvent, event_num);
e_day_view_set_selected_time_range_visible (day_view, e->start, e->end);
@@ -3488,9 +3523,15 @@ e_day_view_on_long_event_click (EDayView *day_view,
gint start_day, end_day, day;
gint item_x, item_y, item_w, item_h;
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
event_num);
+ if (!is_comp_data_valid (event))
+ return;
+
/* Ignore clicks on the EText while editing. */
if (pos == E_CALENDAR_VIEW_POS_EVENT
&& E_TEXT (event->canvas_item)->editing) {
@@ -3563,9 +3604,15 @@ e_day_view_on_event_click (EDayView *day_view,
GdkWindow *window;
gint tmp_day, row, start_row;
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
+ if (!is_comp_data_valid (event))
+ return;
+
/* Ignore clicks on the EText while editing. */
if (pos == E_CALENDAR_VIEW_POS_EVENT
&& E_TEXT (event->canvas_item)->editing) {
@@ -3639,12 +3686,22 @@ e_day_view_on_event_double_click (EDayView *day_view,
EDayViewEvent *event;
icalproperty *attendee_prop = NULL;
- if (day == -1)
+ if (day == -1) {
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
event_num);
- else
+ } else {
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
+ }
+
+ if (!is_comp_data_valid (event))
+ return;
attendee_prop = icalcomponent_get_first_property (event->comp_data->icalcomp, ICAL_ATTENDEE_PROPERTY);
@@ -3686,23 +3743,37 @@ e_day_view_get_selected_events (ECalendarView *cal_view)
g_return_val_if_fail (E_IS_DAY_VIEW (day_view), NULL);
if (day_view->editing_event_num != -1) {
- if (day_view->editing_event_day == E_DAY_VIEW_LONG_EVENT)
+ if (day_view->editing_event_day == E_DAY_VIEW_LONG_EVENT) {
+ if (!is_array_index_in_bounds (day_view->long_events, day_view->editing_event_num))
+ return NULL;
+
event = &g_array_index (day_view->long_events,
EDayViewEvent,
day_view->editing_event_num);
- else
+ } else {
+ if (!is_array_index_in_bounds (day_view->events[day_view->editing_event_day], day_view->editing_event_num))
+ return NULL;
+
event = &g_array_index (day_view->events[day_view->editing_event_day],
EDayViewEvent,
day_view->editing_event_num);
+ }
} else if (day_view->popup_event_num != -1) {
- if (day_view->popup_event_day == E_DAY_VIEW_LONG_EVENT)
+ if (day_view->popup_event_day == E_DAY_VIEW_LONG_EVENT) {
+ if (!is_array_index_in_bounds (day_view->long_events, day_view->popup_event_num))
+ return NULL;
+
event = &g_array_index (day_view->long_events,
EDayViewEvent,
day_view->popup_event_num);
- else
+ } else {
+ if (!is_array_index_in_bounds (day_view->events[day_view->popup_event_day], day_view->popup_event_num))
+ return NULL;
+
event = &g_array_index (day_view->events[day_view->popup_event_day],
EDayViewEvent,
day_view->popup_event_num);
+ }
}
if (event)
@@ -3850,9 +3921,13 @@ e_day_view_on_top_canvas_motion (GtkWidget *widget,
pos = e_day_view_convert_position_in_top_canvas (day_view,
canvas_x, canvas_y,
&day, &event_num);
- if (event_num != -1)
+ if (event_num != -1) {
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return FALSE;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
event_num);
+ }
if (day_view->selection_is_being_dragged) {
e_day_view_update_selection (day_view, day, -1);
@@ -3865,9 +3940,15 @@ e_day_view_on_top_canvas_motion (GtkWidget *widget,
} else if (day_view->pressed_event_day == E_DAY_VIEW_LONG_EVENT) {
GtkTargetList *target_list;
+ if (!is_array_index_in_bounds (day_view->long_events, day_view->pressed_event_num))
+ return FALSE;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
day_view->pressed_event_num);
+ if (!is_comp_data_valid (event))
+ return FALSE;
+
if (!e_cal_util_component_has_recurrences (event->comp_data->icalcomp)
&& (abs (canvas_x - day_view->drag_event_x)
> E_DAY_VIEW_DRAG_START_OFFSET
@@ -3895,7 +3976,7 @@ e_day_view_on_top_canvas_motion (GtkWidget *widget,
cursor = day_view->normal_cursor;
/* Recurring events can't be resized. */
- if (event && !e_cal_util_component_has_recurrences (event->comp_data->icalcomp)) {
+ if (event && is_comp_data_valid (event) && !e_cal_util_component_has_recurrences (event->comp_data->icalcomp)) {
switch (pos) {
case E_CALENDAR_VIEW_POS_LEFT_EDGE:
case E_CALENDAR_VIEW_POS_RIGHT_EDGE:
@@ -3955,9 +4036,13 @@ e_day_view_on_main_canvas_motion (GtkWidget *widget,
canvas_x, canvas_y,
&day, &row,
&event_num);
- if (event_num != -1)
+ if (event_num != -1) {
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return FALSE;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
+ }
if (day_view->selection_is_being_dragged) {
if (pos != E_CALENDAR_VIEW_POS_OUTSIDE) {
@@ -4004,7 +4089,7 @@ e_day_view_on_main_canvas_motion (GtkWidget *widget,
cursor = day_view->normal_cursor;
/* Check if the event is editable and client is not readonly while changing the cursor */
- if (event && event->is_editable && e_cal_is_read_only (event->comp_data->client, &read_only, NULL) && !read_only) {
+ if (event && event->is_editable && is_comp_data_valid (event) && e_cal_is_read_only (event->comp_data->client, &read_only, NULL) && !read_only) {
switch (pos) {
case E_CALENDAR_VIEW_POS_LEFT_EDGE:
@@ -4194,10 +4279,14 @@ e_day_view_update_resize (EDayView *day_view,
day = day_view->resize_event_day;
event_num = day_view->resize_event_num;
+
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
- if (event && (!event->is_editable || (e_cal_is_read_only (event->comp_data->client, &read_only, NULL) && read_only))) {
+ if (event && (!event->is_editable || !is_comp_data_valid (event) || (e_cal_is_read_only (event->comp_data->client, &read_only, NULL) && read_only))) {
return;
}
@@ -4241,9 +4330,16 @@ e_day_view_finish_long_event_resize (EDayView *day_view)
gint is_date;
event_num = day_view->resize_event_num;
+
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
event_num);
+ if (!is_comp_data_valid (event))
+ return;
+
client = event->comp_data->client;
/* We use a temporary copy of the comp since we don't want to
@@ -4352,9 +4448,16 @@ e_day_view_finish_resize (EDayView *day_view)
day = day_view->resize_event_day;
event_num = day_view->resize_event_num;
+
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
+ if (!is_comp_data_valid (event))
+ return;
+
client = event->comp_data->client;
/* We use a temporary shallow copy of the ico since we don't want to
@@ -4503,7 +4606,8 @@ e_day_view_free_event_array (EDayView *day_view,
if (event->canvas_item)
gtk_object_destroy (GTK_OBJECT (event->canvas_item));
- g_object_unref (event->comp_data);
+ if (is_comp_data_valid (event))
+ g_object_unref (event->comp_data);
}
g_array_set_size (array, 0);
@@ -4716,6 +4820,9 @@ e_day_view_reshape_long_event (EDayView *day_view,
PangoContext *pango_context;
PangoLayout *layout;
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
event_num);
@@ -4730,6 +4837,9 @@ e_day_view_reshape_long_event (EDayView *day_view,
return;
}
+ if (!is_comp_data_valid (event))
+ return;
+
/* Take off the border and padding. */
item_x += E_DAY_VIEW_LONG_EVENT_BORDER_WIDTH + E_DAY_VIEW_LONG_EVENT_X_PAD;
item_w -= (E_DAY_VIEW_LONG_EVENT_BORDER_WIDTH + E_DAY_VIEW_LONG_EVENT_X_PAD) * 2;
@@ -4875,6 +4985,10 @@ e_day_view_reshape_day_events (EDayView *day_view,
e_day_view_reshape_day_event (day_view, day, event_num);
event = &g_array_index (day_view->events[day], EDayViewEvent, event_num);
+
+ if (!is_comp_data_valid (event))
+ continue;
+
current_comp_string = icalcomponent_as_ical_string_r (event->comp_data->icalcomp);
if (day_view->last_edited_comp_string == NULL) {
g_free (current_comp_string);
@@ -4899,6 +5013,9 @@ e_day_view_reshape_day_event (EDayView *day_view,
gint item_x, item_y, item_w, item_h;
gint num_icons, icons_offset;
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
@@ -4920,9 +5037,9 @@ e_day_view_reshape_day_event (EDayView *day_view,
draw them on top of the resize rect. */
icons_offset = 0;
num_icons = 0;
- if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_NONE
+ if (is_comp_data_valid (event) && (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_NONE
|| day_view->resize_event_day != day
- || day_view->resize_event_num != event_num) {
+ || day_view->resize_event_num != event_num)) {
ECalComponent *comp;
comp = e_cal_component_new ();
@@ -5991,13 +6108,22 @@ e_day_view_start_editing_event (EDayView *day_view,
return;
if (day == E_DAY_VIEW_LONG_EVENT) {
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
event_num);
} else {
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
}
+ if (!is_comp_data_valid (event))
+ return;
+
if (!e_cal_is_read_only (event->comp_data->client, &read_only, NULL) || read_only)
return;
@@ -6069,10 +6195,20 @@ cancel_editing (EDayView *day_view)
g_return_if_fail (day != -1);
- if (day == E_DAY_VIEW_LONG_EVENT)
+ if (day == E_DAY_VIEW_LONG_EVENT) {
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent, event_num);
- else
+ } else {
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day], EDayViewEvent, event_num);
+ }
+
+ if (!is_comp_data_valid (event))
+ return;
/* Reset the text to what was in the component */
@@ -6091,9 +6227,15 @@ tooltip_get_view_event (EDayView *day_view, gint day, gint event_num)
EDayViewEvent *pevent;
if (day == E_DAY_VIEW_LONG_EVENT) {
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return NULL;
+
pevent = &g_array_index (day_view->long_events, EDayViewEvent,
event_num);
} else {
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return NULL;
+
pevent = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
}
@@ -6310,6 +6452,9 @@ e_day_view_event_move (ECalendarView *cal_view, ECalViewMoveDirection direction)
if ((day == -1) || (day == E_DAY_VIEW_LONG_EVENT))
return FALSE;
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return FALSE;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
day_view->resize_event_day = day;
@@ -6386,8 +6531,16 @@ e_day_view_change_event_time (EDayView *day_view, time_t start_dt, time_t end_dt
day = day_view->editing_event_day;
event_num = day_view->editing_event_num;
+
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
+
+ if (!is_comp_data_valid (event))
+ return;
+
client = event->comp_data->client;
/* We use a temporary shallow copy of the ico since we don't want to
@@ -6461,6 +6614,10 @@ e_day_view_change_event_end_time_up (EDayView *day_view)
event_num = day_view->editing_event_num;
if ((day == -1) || (day == E_DAY_VIEW_LONG_EVENT))
return;
+
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
day_view->resize_event_day = day;
@@ -6491,6 +6648,10 @@ e_day_view_change_event_end_time_down (EDayView *day_view)
event_num = day_view->editing_event_num;
if ((day == -1) || (day == E_DAY_VIEW_LONG_EVENT))
return;
+
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
day_view->resize_event_day = day;
@@ -6600,14 +6761,23 @@ e_day_view_on_editing_stopped (EDayView *day_view,
return;
if (day == E_DAY_VIEW_LONG_EVENT) {
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
event_num);
} else {
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
}
+ if (!is_comp_data_valid (event))
+ return;
+
/* Reset the edit fields. */
day_view->editing_event_day = -1;
day_view->editing_event_num = -1;
@@ -6956,6 +7126,9 @@ e_day_view_get_event_rows (EDayView *day_view,
g_return_val_if_fail (day < E_DAY_VIEW_LONG_EVENT, FALSE);
g_return_val_if_fail (event_num >= 0, FALSE);
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return FALSE;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
start_row = event->start_minute / day_view->mins_per_row;
@@ -6980,6 +7153,9 @@ e_day_view_get_event_position (EDayView *day_view,
EDayViewEvent *event;
gint start_row, end_row, cols_in_row, start_col, num_columns;
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return FALSE;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
@@ -7034,6 +7210,9 @@ e_day_view_get_long_event_position (EDayView *day_view,
{
EDayViewEvent *event;
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return FALSE;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
event_num);
@@ -7304,6 +7483,9 @@ e_day_view_update_top_canvas_drag (EDayView *day_view,
num_days = 1;
if (day_view->drag_event_day == E_DAY_VIEW_LONG_EVENT) {
+ if (!is_array_index_in_bounds (day_view->long_events, day_view->drag_event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
day_view->drag_event_num);
row = event->start_row_or_col + 1;
@@ -7320,6 +7502,9 @@ e_day_view_update_top_canvas_drag (EDayView *day_view,
day = MIN (day, day_view->days_shown - num_days);
} else if (day_view->drag_event_day != -1) {
+ if (!is_array_index_in_bounds (day_view->events[day_view->drag_event_day], day_view->drag_event_num))
+ return;
+
event = &g_array_index (day_view->events[day_view->drag_event_day],
EDayViewEvent,
day_view->drag_event_num);
@@ -7367,7 +7552,7 @@ e_day_view_update_top_canvas_drag (EDayView *day_view,
& GNOME_CANVAS_ITEM_VISIBLE)) {
const gchar *summary;
- if (event) {
+ if (event && is_comp_data_valid (event)) {
summary = icalcomponent_get_summary (event->comp_data->icalcomp);
text = g_strdup (summary);
} else {
@@ -7460,9 +7645,15 @@ e_day_view_update_main_canvas_drag (EDayView *day_view,
num_rows = 1;
if (day_view->drag_event_day == E_DAY_VIEW_LONG_EVENT) {
+ if (!is_array_index_in_bounds (day_view->long_events, day_view->drag_event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
day_view->drag_event_num);
} else if (day_view->drag_event_day != -1) {
+ if (!is_array_index_in_bounds (day_view->events[day_view->drag_event_day], day_view->drag_event_num))
+ return;
+
event = &g_array_index (day_view->events[day_view->drag_event_day],
EDayViewEvent,
day_view->drag_event_num);
@@ -7526,7 +7717,7 @@ e_day_view_update_main_canvas_drag (EDayView *day_view,
if (!(day_view->drag_item->object.flags & GNOME_CANVAS_ITEM_VISIBLE)) {
const gchar *summary;
- if (event) {
+ if (event && is_comp_data_valid (event)) {
summary = icalcomponent_get_summary (event->comp_data->icalcomp);
text = g_strdup (summary);
} else {
@@ -7590,12 +7781,19 @@ e_day_view_on_drag_begin (GtkWidget *widget,
g_return_if_fail (day != -1);
g_return_if_fail (event_num != -1);
- if (day == E_DAY_VIEW_LONG_EVENT)
+ if (day == E_DAY_VIEW_LONG_EVENT) {
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
event_num);
- else
+ } else {
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
+ }
/* Hide the text item, since it will be shown in the special drag
items. */
@@ -7619,10 +7817,16 @@ e_day_view_on_drag_end (GtkWidget *widget,
return;
if (day == E_DAY_VIEW_LONG_EVENT) {
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
event_num);
gtk_widget_queue_draw (day_view->top_canvas);
} else {
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
gtk_widget_queue_draw (day_view->main_canvas);
@@ -7655,12 +7859,22 @@ e_day_view_on_drag_data_get (GtkWidget *widget,
g_return_if_fail (day != -1);
g_return_if_fail (event_num != -1);
- if (day == E_DAY_VIEW_LONG_EVENT)
+ if (day == E_DAY_VIEW_LONG_EVENT) {
+ if (!is_array_index_in_bounds (day_view->long_events, event_num))
+ return;
+
event = &g_array_index (day_view->long_events,
EDayViewEvent, event_num);
- else
+ } else {
+ if (!is_array_index_in_bounds (day_view->events[day], event_num))
+ return;
+
event = &g_array_index (day_view->events[day],
EDayViewEvent, event_num);
+ }
+
+ if (!is_comp_data_valid (event))
+ return;
vcal = e_cal_util_new_top_level ();
e_cal_util_add_timezones_from_component (
@@ -7742,8 +7956,15 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
end_offset = 0;
if (day_view->drag_event_day == E_DAY_VIEW_LONG_EVENT) {
+ if (!is_array_index_in_bounds (day_view->long_events, day_view->drag_event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
day_view->drag_event_num);
+
+ if (!is_comp_data_valid (event))
+ return;
+
day -= day_view->drag_event_offset;
day = MAX (day, 0);
@@ -7759,9 +7980,15 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
start_offset = event->start_minute;
end_offset = event->end_minute;
} else {
+ if (!is_array_index_in_bounds (day_view->events[day_view->drag_event_day], day_view->drag_event_num))
+ return;
+
event = &g_array_index (day_view->events[day_view->drag_event_day],
EDayViewEvent,
day_view->drag_event_num);
+
+ if (!is_comp_data_valid (event))
+ return;
}
client = event->comp_data->client;
@@ -7973,12 +8200,25 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
end_offset = 0;
if (day_view->drag_event_day == E_DAY_VIEW_LONG_EVENT) {
+ if (!is_array_index_in_bounds (day_view->long_events, day_view->drag_event_num))
+ return;
+
event = &g_array_index (day_view->long_events, EDayViewEvent,
day_view->drag_event_num);
+
+ if (!is_comp_data_valid (event))
+ return;
} else {
+ if (!is_array_index_in_bounds (day_view->events[day_view->drag_event_day], day_view->drag_event_num))
+ return;
+
event = &g_array_index (day_view->events[day_view->drag_event_day],
EDayViewEvent,
day_view->drag_event_num);
+
+ if (!is_comp_data_valid (event))
+ return;
+
row -= day_view->drag_event_offset;
/* Calculate time offset from start row. */
@@ -8233,10 +8473,16 @@ e_day_view_paste_text (ECalendarView *cal_view)
return;
if (day_view->editing_event_day == E_DAY_VIEW_LONG_EVENT) {
+ if (!is_array_index_in_bounds (day_view->long_events, day_view->editing_event_num))
+ return;
+
event = &g_array_index (day_view->long_events,
EDayViewEvent,
day_view->editing_event_num);
} else {
+ if (!is_array_index_in_bounds (day_view->events[day_view->editing_event_day], day_view->editing_event_num))
+ return;
+
event = &g_array_index (day_view->events[day_view->editing_event_day],
EDayViewEvent,
day_view->editing_event_num);
diff --git a/calendar/gui/e-week-view-event-item.c b/calendar/gui/e-week-view-event-item.c
index 5d3fefa..ba44b7a 100644
--- a/calendar/gui/e-week-view-event-item.c
+++ b/calendar/gui/e-week-view-event-item.c
@@ -132,13 +132,22 @@ week_view_event_item_double_click (EWeekViewEventItem *event_item,
week_view = E_WEEK_VIEW (parent);
+ if (!is_array_index_in_bounds (week_view->events, event_item->priv->event_num))
+ return TRUE;
+
event = &g_array_index (
week_view->events, EWeekViewEvent,
event_item->priv->event_num);
+ if (!is_comp_data_valid (event))
+ return TRUE;
+
if (week_view->editing_event_num >= 0) {
EWeekViewEvent *editing;
+ if (!is_array_index_in_bounds (week_view->events, week_view->editing_event_num))
+ return TRUE;
+
editing = &g_array_index (
week_view->events, EWeekViewEvent,
week_view->editing_event_num);
@@ -147,6 +156,7 @@ week_view_event_item_double_click (EWeekViewEventItem *event_item,
* on the component, which is not on the server. */
if (editing && event &&
editing->comp_data == event->comp_data &&
+ is_comp_data_valid (editing) &&
(!event->comp_data ||
!is_icalcomp_on_the_server (
event->comp_data->icalcomp,
@@ -182,8 +192,15 @@ week_view_event_item_button_press (EWeekViewEventItem *event_item,
week_view = E_WEEK_VIEW (parent);
+ if (!is_array_index_in_bounds (week_view->events, event_item->priv->event_num))
+ return FALSE;
+
event = &g_array_index (week_view->events, EWeekViewEvent,
event_item->priv->event_num);
+
+ if (!is_array_index_in_bounds (week_view->spans, event->spans_index + event_item->priv->span_num))
+ return FALSE;
+
span = &g_array_index (week_view->spans, EWeekViewEventSpan,
event->spans_index + event_item->priv->span_num);
@@ -390,8 +407,15 @@ week_view_event_item_draw_icons (EWeekViewEventItem *event_item,
parent = gtk_widget_get_parent (GTK_WIDGET (canvas));
week_view = E_WEEK_VIEW (parent);
+ if (!is_array_index_in_bounds (week_view->events, event_item->priv->event_num))
+ return;
+
event = &g_array_index (week_view->events, EWeekViewEvent,
event_item->priv->event_num);
+
+ if (!is_comp_data_valid (event))
+ return;
+
comp = e_cal_component_new ();
e_cal_component_set_icalcomponent (
comp, icalcomponent_new_clone (event->comp_data->icalcomp));
@@ -510,9 +534,15 @@ week_view_event_item_draw_triangle (EWeekViewEventItem *event_item,
parent = gtk_widget_get_parent (GTK_WIDGET (canvas));
week_view = E_WEEK_VIEW (parent);
+ if (!is_array_index_in_bounds (week_view->events, event_item->priv->event_num))
+ return;
+
event = &g_array_index (week_view->events, EWeekViewEvent,
event_item->priv->event_num);
+ if (!is_comp_data_valid (event))
+ return;
+
cr = gdk_cairo_create (drawable);
points[0].x = x;
@@ -716,13 +746,22 @@ week_view_event_item_draw (GnomeCanvasItem *canvas_item,
g_return_if_fail (event_item->priv->event_num < week_view->events->len);
+ if (!is_array_index_in_bounds (week_view->events, event_item->priv->event_num))
+ return;
+
event = &g_array_index (week_view->events, EWeekViewEvent,
event_item->priv->event_num);
+ if (!is_comp_data_valid (event))
+ return;
+
g_return_if_fail (
event->spans_index + event_item->priv->span_num <
week_view->spans->len);
+ if (!is_array_index_in_bounds (week_view->spans, event->spans_index + event_item->priv->span_num))
+ return;
+
span = &g_array_index (week_view->spans, EWeekViewEventSpan,
event->spans_index + event_item->priv->span_num);
diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c
index 5e850f5..173b79b 100644
--- a/calendar/gui/e-week-view.c
+++ b/calendar/gui/e-week-view.c
@@ -1043,7 +1043,7 @@ e_week_view_get_text_color (EWeekView *week_view, EWeekViewEvent *event, GtkWidg
green = week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].green;
blue = week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND].blue;
- if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)), event->comp_data),
+ if (is_comp_data_valid (event) && gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)), event->comp_data),
&bg_color)) {
GdkColormap *colormap;
colormap = gtk_widget_get_colormap (GTK_WIDGET (week_view));
@@ -1520,9 +1520,16 @@ e_week_view_focus (GtkWidget *widget, GtkDirectionType direction)
EWeekViewEventSpan *span;
gint current_day;
+ if (!is_array_index_in_bounds (week_view->events, new_event_num))
+ break;
+
event = &g_array_index (week_view->events,
EWeekViewEvent,
new_event_num);
+
+ if (!is_array_index_in_bounds (week_view->spans, event->spans_index + new_span_num))
+ break;
+
span = &g_array_index (week_view->spans,
EWeekViewEventSpan,
event->spans_index + new_span_num);
@@ -1552,9 +1559,15 @@ e_week_view_get_selected_events (ECalendarView *cal_view)
g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), NULL);
if (week_view->editing_event_num != -1) {
+ if (!is_array_index_in_bounds (week_view->events, week_view->editing_event_num))
+ return NULL;
+
event = &g_array_index (week_view->events, EWeekViewEvent,
week_view->editing_event_num);
} else if (week_view->popup_event_num != -1) {
+ if (!is_array_index_in_bounds (week_view->events, week_view->popup_event_num))
+ return NULL;
+
event = &g_array_index (week_view->events, EWeekViewEvent,
week_view->popup_event_num);
}
@@ -2129,6 +2142,9 @@ set_text_as_bold (EWeekViewEvent *event, EWeekViewEventSpan *span)
gchar *address;
ECalComponentAttendee *at = NULL;
+ if (!is_comp_data_valid (event))
+ return;
+
comp = e_cal_component_new ();
e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
address = itip_get_comp_attendee (comp, event->comp_data->client);
@@ -2174,6 +2190,9 @@ e_week_view_foreach_event_with_uid (EWeekView *week_view,
event = &g_array_index (week_view->events, EWeekViewEvent,
event_num);
+ if (!is_comp_data_valid (event))
+ continue;
+
u = icalcomponent_get_uid (event->comp_data->icalcomp);
if (u && !strcmp (uid, u)) {
if (!(*callback) (week_view, event_num, data))
@@ -2191,6 +2210,9 @@ e_week_view_remove_event_cb (EWeekView *week_view,
EWeekViewEventSpan *span;
gint span_num;
+ if (!is_array_index_in_bounds (week_view->events, event_num))
+ return TRUE;
+
event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
if (!event)
return TRUE;
@@ -2203,13 +2225,17 @@ e_week_view_remove_event_cb (EWeekView *week_view,
if (week_view->popup_event_num == event_num)
week_view->popup_event_num = -1;
- g_object_unref (event->comp_data);
+ if (is_comp_data_valid (event))
+ g_object_unref (event->comp_data);
event->comp_data = NULL;
if (week_view->spans) {
/* We leave the span elements in the array, but set the canvas item
pointers to NULL. */
for (span_num = 0; span_num < event->num_spans; span_num++) {
+ if (!is_array_index_in_bounds (week_view->spans, event->spans_index + span_num))
+ break;
+
span = &g_array_index (week_view->spans, EWeekViewEventSpan,
event->spans_index + span_num);
@@ -2307,6 +2333,9 @@ e_week_view_get_span_position (EWeekView *week_view,
g_return_val_if_fail (span_num < event->num_spans, FALSE);
+ if (!is_array_index_in_bounds (week_view->spans, event->spans_index + span_num))
+ return FALSE;
+
span = &g_array_index (week_view->spans, EWeekViewEventSpan,
event->spans_index + span_num);
@@ -2349,7 +2378,14 @@ ewv_pass_gdkevent_to_etext (EWeekView *week_view, GdkEvent *gevent)
EWeekViewEvent *event;
EWeekViewEventSpan *span;
+ if (!is_array_index_in_bounds (week_view->events, week_view->editing_event_num))
+ return FALSE;
+
event = &g_array_index (week_view->events, EWeekViewEvent, week_view->editing_event_num);
+
+ if (!is_array_index_in_bounds (week_view->spans, event->spans_index + week_view->editing_span_num))
+ return FALSE;
+
span = &g_array_index (week_view->spans, EWeekViewEventSpan, event->spans_index + week_view->editing_span_num);
if (span->text_item && E_IS_TEXT (span->text_item)) {
@@ -2660,7 +2696,9 @@ e_week_view_free_events (EWeekView *week_view)
for (event_num = 0; event_num < week_view->events->len; event_num++) {
event = &g_array_index (week_view->events, EWeekViewEvent,
event_num);
- g_object_unref (event->comp_data);
+
+ if (is_comp_data_valid (event))
+ g_object_unref (event->comp_data);
}
g_array_set_size (week_view->events, 0);
@@ -2842,6 +2880,9 @@ e_week_view_reshape_events (EWeekView *week_view)
for (event_num = 0; event_num < week_view->events->len; event_num++) {
event = &g_array_index (week_view->events, EWeekViewEvent,
event_num);
+ if (!is_comp_data_valid (event))
+ continue;
+
for (span_num = 0; span_num < event->num_spans; span_num++) {
gchar *current_comp_string;
@@ -2852,6 +2893,12 @@ e_week_view_reshape_events (EWeekView *week_view)
current_comp_string = icalcomponent_as_ical_string_r (event->comp_data->icalcomp);
if (strncmp (current_comp_string, week_view->last_edited_comp_string,50) == 0) {
EWeekViewEventSpan *span;
+
+ if (!is_array_index_in_bounds (week_view->spans, event->spans_index + span_num)) {
+ g_free (current_comp_string);
+ continue;
+ }
+
span = &g_array_index (week_view->spans, EWeekViewEventSpan, event->spans_index + span_num);
e_canvas_item_grab_focus (span->text_item, TRUE);
g_free (week_view->last_edited_comp_string);
@@ -2900,6 +2947,9 @@ tooltip_get_view_event (EWeekView *week_view, gint day, gint event_num)
{
EWeekViewEvent *pevent;
+ if (!is_array_index_in_bounds (week_view->events, event_num))
+ return NULL;
+
pevent = &g_array_index (week_view->events, EWeekViewEvent, event_num);
return pevent;
@@ -2998,7 +3048,17 @@ e_week_view_reshape_event_span (EWeekView *week_view,
PangoFontMetrics *font_metrics;
PangoLayout *layout;
+ if (!is_array_index_in_bounds (week_view->events, event_num))
+ return;
+
event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
+
+ if (!is_comp_data_valid (event))
+ return;
+
+ if (!is_array_index_in_bounds (week_view->spans, event->spans_index + span_num))
+ return;
+
span = &g_array_index (week_view->spans, EWeekViewEventSpan,
event->spans_index + span_num);
comp = e_cal_component_new ();
@@ -3268,7 +3328,17 @@ e_week_view_start_editing_event (EWeekView *week_view,
&& span_num == week_view->editing_span_num)
return TRUE;
+ if (!is_array_index_in_bounds (week_view->events, event_num))
+ return FALSE;
+
event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
+
+ if (!is_comp_data_valid (event))
+ return FALSE;
+
+ if (!is_array_index_in_bounds (week_view->spans, event->spans_index + span_num))
+ return FALSE;
+
span = &g_array_index (week_view->spans, EWeekViewEventSpan,
event->spans_index + span_num);
@@ -3280,7 +3350,12 @@ e_week_view_start_editing_event (EWeekView *week_view,
return FALSE;
if (week_view->editing_event_num >= 0) {
- EWeekViewEvent *editing = &g_array_index (week_view->events, EWeekViewEvent, week_view->editing_event_num);
+ EWeekViewEvent *editing;
+
+ if (!is_array_index_in_bounds (week_view->events, week_view->editing_event_num))
+ return FALSE;
+
+ editing = &g_array_index (week_view->events, EWeekViewEvent, week_view->editing_event_num);
/* do not change to other part of same component - the event is spread into more days */
if (editing && event && editing->comp_data == event->comp_data)
@@ -3317,6 +3392,10 @@ e_week_view_start_editing_event (EWeekView *week_view,
}
g_return_val_if_fail (event_num >= 0, FALSE);
}
+
+ if (!is_array_index_in_bounds (week_view->spans, event->spans_index + span_num))
+ return FALSE;
+
span = &g_array_index (week_view->spans, EWeekViewEventSpan, event->spans_index + span_num);
/* Try to move the cursor to the end of the text. */
@@ -3361,7 +3440,17 @@ cancel_editing (EWeekView *week_view)
g_return_if_fail (event_num != -1);
+ if (!is_array_index_in_bounds (week_view->events, event_num))
+ return;
+
event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
+
+ if (!is_comp_data_valid (event))
+ return;
+
+ if (!is_array_index_in_bounds (week_view->spans, event->spans_index + span_num))
+ return;
+
span = &g_array_index (week_view->spans, EWeekViewEventSpan, event->spans_index + span_num);
/* Reset the text to what was in the component */
@@ -3417,9 +3506,15 @@ e_week_view_on_text_item_event (GnomeCanvasItem *item,
&event_num, &span_num))
return FALSE;
+ if (!is_array_index_in_bounds (week_view->events, event_num))
+ return FALSE;
+
event = &g_array_index (week_view->events, EWeekViewEvent,
event_num);
+ if (!is_comp_data_valid (event))
+ return FALSE;
+
/* if we started to editing new item on the canvas, then do not open editing dialog until it's saved,
because the save of the event recalculates event numbers and you can edit different one */
if (!is_icalcomp_on_the_server (event->comp_data->icalcomp, event->comp_data->client))
@@ -3446,6 +3541,9 @@ e_week_view_on_text_item_event (GnomeCanvasItem *item,
return FALSE;
}
+ if (!is_array_index_in_bounds (week_view->events, event_num))
+ return FALSE;
+
e = &g_array_index (week_view->events, EWeekViewEvent, event_num);
if (!gtk_widget_has_focus (GTK_WIDGET (week_view)))
@@ -3583,8 +3681,14 @@ static gboolean e_week_view_event_move (ECalendarView *cal_view, ECalViewMoveDir
if (event_num == -1)
return FALSE;
+ if (!is_array_index_in_bounds (week_view->events, event_num))
+ return FALSE;
+
event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
+ if (!is_comp_data_valid (event))
+ return FALSE;
+
end_dt = event->end;
start_time = icalcomponent_get_dtstart (event->comp_data->icalcomp);
end_time = icalcomponent_get_dtend (event->comp_data->icalcomp);
@@ -3711,7 +3815,14 @@ e_week_view_change_event_time (EWeekView *week_view, time_t start_dt, time_t end
if (event_num == -1)
return;
+ if (!is_array_index_in_bounds (week_view->events, event_num))
+ return;
+
event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
+
+ if (!is_comp_data_valid (event))
+ return;
+
client = event->comp_data->client;
/* We use a temporary shallow copy of the ico since we don't want to
@@ -3818,7 +3929,17 @@ e_week_view_on_editing_stopped (EWeekView *week_view,
if (event_num == -1)
return;
+ if (!is_array_index_in_bounds (week_view->events, event_num))
+ return;
+
event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
+
+ if (!is_comp_data_valid (event))
+ return;
+
+ if (!is_array_index_in_bounds (week_view->spans, event->spans_index + span_num))
+ return;
+
span = &g_array_index (week_view->spans, EWeekViewEventSpan,
event->spans_index + span_num);
@@ -3967,6 +4088,9 @@ e_week_view_find_event_from_item (EWeekView *week_view,
event = &g_array_index (week_view->events, EWeekViewEvent,
event_num);
for (span_num = 0; span_num < event->num_spans; span_num++) {
+ if (!is_array_index_in_bounds (week_view->spans, event->spans_index + span_num))
+ continue;
+
span = &g_array_index (week_view->spans,
EWeekViewEventSpan,
event->spans_index + span_num);
@@ -4009,6 +4133,9 @@ e_week_view_find_event_from_uid (EWeekView *week_view,
event = &g_array_index (week_view->events, EWeekViewEvent,
event_num);
+ if (!is_comp_data_valid (event))
+ continue;
+
if (event->comp_data->client != client)
continue;
@@ -4040,10 +4167,16 @@ e_week_view_is_one_day_event (EWeekView *week_view,
EWeekViewEvent *event;
EWeekViewEventSpan *span;
+ if (!is_array_index_in_bounds (week_view->events, event_num))
+ return FALSE;
+
event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
if (event->num_spans != 1)
return FALSE;
+ if (!is_array_index_in_bounds (week_view->spans, event->spans_index))
+ return FALSE;
+
span = &g_array_index (week_view->spans, EWeekViewEventSpan,
event->spans_index);
@@ -4172,8 +4305,15 @@ e_week_view_add_new_event_in_selected_range (EWeekView *week_view, const gchar *
return FALSE;
}
+ if (!is_array_index_in_bounds (week_view->events, event_num))
+ return FALSE;
+
wvevent = &g_array_index (week_view->events, EWeekViewEvent,
event_num);
+
+ if (!is_array_index_in_bounds (week_view->spans, wvevent->spans_index + 0))
+ return FALSE;
+
span = &g_array_index (week_view->spans, EWeekViewEventSpan,
wvevent->spans_index + 0);
@@ -4553,8 +4693,15 @@ e_week_view_paste_text (ECalendarView *cal_view)
!e_week_view_add_new_event_in_selected_range (week_view, NULL))
return;
+ if (!is_array_index_in_bounds (week_view->events, week_view->editing_event_num))
+ return;
+
event = &g_array_index (week_view->events, EWeekViewEvent,
week_view->editing_event_num);
+
+ if (!is_array_index_in_bounds (week_view->spans, event->spans_index + week_view->editing_span_num))
+ return;
+
span = &g_array_index (week_view->spans, EWeekViewEventSpan,
event->spans_index + week_view->editing_span_num);
diff --git a/calendar/gui/ea-cal-view-event.c b/calendar/gui/ea-cal-view-event.c
index 5b4bcc7..b2bdc5c 100644
--- a/calendar/gui/ea-cal-view-event.c
+++ b/calendar/gui/ea-cal-view-event.c
@@ -198,9 +198,17 @@ ea_cal_view_event_new (GObject *obj)
&event_num,
&span_num))
return NULL;
+
+ if (!is_array_index_in_bounds (week_view->events, event_num))
+ return NULL;
+
week_view_event = &g_array_index (week_view->events,
EWeekViewEvent,
event_num);
+
+ if (!is_array_index_in_bounds (week_view->spans, week_view_event->spans_index))
+ return NULL;
+
/* get the first span */
event_span = &g_array_index (week_view->spans,
EWeekViewEventSpan,
@@ -269,6 +277,8 @@ ea_cal_view_event_get_name (AtkObject *accessible)
if (!g_obj || !E_IS_TEXT (g_obj))
return NULL;
event = ea_calendar_helpers_get_cal_view_event_from (GNOME_CANVAS_ITEM(g_obj));
+ if (!is_comp_data_valid (event))
+ return NULL;
alarm_string = recur_string = meeting_string = "";
if (event && event->comp_data) {
diff --git a/calendar/gui/print.c b/calendar/gui/print.c
index 0b3f800..ab2f784 100644
--- a/calendar/gui/print.c
+++ b/calendar/gui/print.c
@@ -1092,6 +1092,9 @@ print_day_long_event (GtkPrintContext *context,
struct tm date_tm;
gdouble red, green, blue;
+ if (!is_comp_data_valid (event))
+ return;
+
/* If the event starts before the first day being printed, draw a
triangle. (Note that I am assuming we are just showing 1 day at
the moment.) */
@@ -1172,6 +1175,9 @@ print_day_event (GtkPrintContext *context, PangoFontDescription *font,
struct tm date_tm;
gdouble red, green, blue;
+ if (!is_comp_data_valid (event))
+ return;
+
if ((event->start_minute >= pdi->end_minute_offset)
|| (event->end_minute <= pdi->start_minute_offset))
return;
@@ -1561,6 +1567,9 @@ print_week_event (GtkPrintContext *context, PangoFontDescription *font,
gdouble red, green, blue;
GdkPixbuf *pixbuf = NULL;
+ if (!is_comp_data_valid (event))
+ return;
+
text = get_summary_with_location (event->comp_data->icalcomp);
for (span_num = 0; span_num < event->num_spans; span_num++) {
diff --git a/modules/calendar/e-cal-shell-view-actions.c b/modules/calendar/e-cal-shell-view-actions.c
index 3251183..d56107a 100644
--- a/modules/calendar/e-cal-shell-view-actions.c
+++ b/modules/calendar/e-cal-shell-view-actions.c
@@ -512,7 +512,7 @@ action_event_copy_cb (GtkAction *action,
if (selected->data) {
ECalendarViewEvent *event = selected->data;
- if (event && event->comp_data && event->comp_data->client)
+ if (is_comp_data_valid (event) && event->comp_data->client)
source_source = e_cal_get_source (event->comp_data->client);
}
@@ -577,6 +577,10 @@ action_event_delegate_cb (GtkAction *action,
g_return_if_fail (g_list_length (selected) == 1);
event = selected->data;
+
+ if (!is_comp_data_valid (event))
+ return;
+
client = event->comp_data->client;
clone = icalcomponent_new_clone (event->comp_data->icalcomp);
@@ -707,6 +711,10 @@ action_event_forward_cb (GtkAction *action,
g_return_if_fail (g_list_length (selected) == 1);
event = selected->data;
+
+ if (!is_comp_data_valid (event))
+ return;
+
client = event->comp_data->client;
icalcomp = event->comp_data->icalcomp;
@@ -774,7 +782,7 @@ action_event_move_cb (GtkAction *action,
if (selected->data) {
ECalendarViewEvent *event = selected->data;
- if (event && event->comp_data && event->comp_data->client)
+ if (is_comp_data_valid (event) && event->comp_data->client)
source_source = e_cal_get_source (event->comp_data->client);
}
@@ -863,6 +871,10 @@ action_event_occurrence_movable_cb (GtkAction *action,
g_return_if_fail (g_list_length (selected) == 1);
event = selected->data;
+
+ if (!is_comp_data_valid (event))
+ return;
+
client = event->comp_data->client;
icalcomp = event->comp_data->icalcomp;
@@ -961,6 +973,10 @@ action_event_print_cb (GtkAction *action,
g_return_if_fail (g_list_length (selected) == 1);
event = selected->data;
+
+ if (!is_comp_data_valid (event))
+ return;
+
client = event->comp_data->client;
icalcomp = event->comp_data->icalcomp;
@@ -1000,6 +1016,10 @@ action_event_reply_cb (GtkAction *action,
g_return_if_fail (g_list_length (selected) == 1);
event = selected->data;
+
+ if (!is_comp_data_valid (event))
+ return;
+
client = event->comp_data->client;
icalcomp = event->comp_data->icalcomp;
@@ -1040,6 +1060,10 @@ action_event_reply_all_cb (GtkAction *action,
g_return_if_fail (g_list_length (selected) == 1);
event = selected->data;
+
+ if (!is_comp_data_valid (event))
+ return;
+
client = event->comp_data->client;
icalcomp = event->comp_data->icalcomp;
@@ -1090,6 +1114,10 @@ action_event_save_as_cb (GtkAction *action,
g_return_if_fail (g_list_length (selected) == 1);
event = selected->data;
+
+ if (!is_comp_data_valid (event))
+ return;
+
client = event->comp_data->client;
icalcomp = event->comp_data->icalcomp;
@@ -1148,6 +1176,10 @@ edit_event_as (ECalShellView *cal_shell_view, gboolean as_meeting)
g_return_if_fail (g_list_length (selected) == 1);
event = selected->data;
+
+ if (!is_comp_data_valid (event))
+ return;
+
client = event->comp_data->client;
icalcomp = event->comp_data->icalcomp;
diff --git a/modules/calendar/e-cal-shell-view-private.c b/modules/calendar/e-cal-shell-view-private.c
index 71db123..a112c17 100644
--- a/modules/calendar/e-cal-shell-view-private.c
+++ b/modules/calendar/e-cal-shell-view-private.c
@@ -742,6 +742,9 @@ e_cal_shell_view_transfer_item_to (ECalShellView *cal_shell_view,
g_return_if_fail (event != NULL);
g_return_if_fail (E_IS_CAL (destination_client));
+ if (!is_comp_data_valid (event))
+ return;
+
icalcomp_event = event->comp_data->icalcomp;
uid = icalcomponent_get_uid (icalcomp_event);
diff --git a/modules/calendar/e-cal-shell-view.c b/modules/calendar/e-cal-shell-view.c
index a489fe5..36ee863 100644
--- a/modules/calendar/e-cal-shell-view.c
+++ b/modules/calendar/e-cal-shell-view.c
@@ -353,7 +353,7 @@ cal_shell_view_update_actions (EShellView *shell_view)
gboolean user_org = FALSE;
gboolean read_only = TRUE;
- if (!event || !event->comp_data)
+ if (!is_comp_data_valid (event))
continue;
client = event->comp_data->client;
diff --git a/plugins/groupwise-features/gw-ui.c b/plugins/groupwise-features/gw-ui.c
index c1146ff..41529b5 100644
--- a/plugins/groupwise-features/gw-ui.c
+++ b/plugins/groupwise-features/gw-ui.c
@@ -384,7 +384,7 @@ update_cal_entries_cb (EShellView *shell_view, gpointer user_data)
ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data;
const gchar *uri;
- uri = event->comp_data ? e_cal_get_uri (event->comp_data->client) : NULL;
+ uri = is_comp_data_valid (event) ? e_cal_get_uri (event->comp_data->client) : NULL;
if (uri && g_ascii_strncasecmp (uri, "groupwise://", 12) == 0) {
visible = e_cal_util_component_has_attendee (event->comp_data->icalcomp);
diff --git a/plugins/groupwise-features/process-meeting.c b/plugins/groupwise-features/process-meeting.c
index 5a2b55c..3eb8d59 100644
--- a/plugins/groupwise-features/process-meeting.c
+++ b/plugins/groupwise-features/process-meeting.c
@@ -144,13 +144,19 @@ process_meeting (ECalendarView *cal_view, icalparameter_partstat status)
selected = e_calendar_view_get_selected_events (cal_view);
if (selected) {
ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data;
- ECalComponent *comp = e_cal_component_new ();
- ReceiveData *r_data = g_new0 (ReceiveData, 1);
+ ECalComponent *comp;
+ ReceiveData *r_data;
gboolean recurring = FALSE;
GThread *thread = NULL;
GError *error = NULL;
gchar *address = NULL;
+ if (!is_comp_data_valid (event))
+ return;
+
+ comp = e_cal_component_new ();
+ r_data = g_new0 (ReceiveData, 1);
+
e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
address = itip_get_comp_attendee (comp, event->comp_data->client);
@@ -373,7 +379,7 @@ gw_resend_meeting_cb (GtkAction *action, EShellView *shell_view)
selected = e_calendar_view_get_selected_events (cal_view);
if (selected) {
ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data;
- ECalComponent *comp = e_cal_component_new ();
+ ECalComponent *comp;
ECalComponent *new_comp = NULL;
gboolean recurring = FALSE;
CalObjModType mod = CALOBJ_MOD_THIS;
@@ -383,6 +389,10 @@ gw_resend_meeting_cb (GtkAction *action, EShellView *shell_view)
/* inserting the boolean to share the code between resend and retract */
gboolean resend = TRUE;
+ if (!is_comp_data_valid (event))
+ return;
+
+ comp = e_cal_component_new ();
e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
if (e_cal_component_has_recurrences (comp) || e_cal_component_is_instance (comp))
recurring = TRUE;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]