Calendar: fix some uninitialized value conditions pointed out by clang static analyzer
[citadel.git] / citadel / modules / calendar / serv_calendar.c
index f697f3570022c35048a13ed9f69110e56e7c417b..2c9419692e3e0154b625bb9290e01a17f57b74a8 100644 (file)
@@ -4,9 +4,9 @@
  * iTIP protocol.  See RFCs 2445 and 2446.
  *
  *
- * Copyright (c) 1987-2009 by the citadel.org team
+ * Copyright (c) 1987-2011 by the citadel.org team
  *
- *  This program is free software; you can redistribute it and/or modify
+ *  This program is open source software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 3 of the License, or
  *  (at your option) any later version.
@@ -50,7 +50,7 @@ icalcomponent *icalcomponent_new_citadel_vcalendar(void) {
 
        encaps = icalcomponent_new_vcalendar();
        if (encaps == NULL) {
-               CtdlLogPrintf(CTDL_CRIT, "ERROR: could not allocate component!\n");
+               syslog(LOG_CRIT, "ERROR: could not allocate component!\n");
                return NULL;
        }
 
@@ -179,6 +179,7 @@ void ical_send_a_reply(icalcomponent *request, char *action) {
        icalparameter *partstat = NULL;
        char *serialized_reply = NULL;
        char *reply_message_text = NULL;
+       const char *ch;
        struct CtdlMessage *msg = NULL;
        struct recptypes *valid = NULL;
 
@@ -186,13 +187,13 @@ void ical_send_a_reply(icalcomponent *request, char *action) {
        strcpy(summary_string, "Calendar item");
 
        if (request == NULL) {
-               CtdlLogPrintf(CTDL_ERR, "ERROR: trying to reply to NULL event?\n");
+               syslog(LOG_ERR, "ERROR: trying to reply to NULL event?\n");
                return;
        }
 
        the_reply = icalcomponent_new_clone(request);
        if (the_reply == NULL) {
-               CtdlLogPrintf(CTDL_ERR, "ERROR: cannot clone request\n");
+               syslog(LOG_ERR, "ERROR: cannot clone request\n");
                return;
        }
 
@@ -208,22 +209,20 @@ void ical_send_a_reply(icalcomponent *request, char *action) {
                while (attendee = icalcomponent_get_first_property(vevent,
                    ICAL_ATTENDEE_PROPERTY), (attendee != NULL)
                ) {
-                       if (icalproperty_get_attendee(attendee)) {
-                               strcpy(attendee_string,
-                                       icalproperty_get_attendee(attendee) );
-                               if (!strncasecmp(attendee_string, "MAILTO:", 7)) {
-                                       strcpy(attendee_string, &attendee_string[7]);
-                                       striplt(attendee_string);
-                                       recp = validate_recipients(attendee_string, NULL, 0);
-                                       if (recp != NULL) {
-                                               if (!strcasecmp(recp->recp_local, CC->user.fullname)) {
-                                                       if (me_attend) icalproperty_free(me_attend);
-                                                       me_attend = icalproperty_new_clone(attendee);
-                                               }
-                                               free_recipients(recp);
+                       ch = icalproperty_get_attendee(attendee);
+                       if ((ch != NULL) && !strncasecmp(ch, "MAILTO:", 7)) {
+                               safestrncpy(attendee_string, ch + 7, sizeof (attendee_string));
+                               striplt(attendee_string);
+                               recp = validate_recipients(attendee_string, NULL, 0);
+                               if (recp != NULL) {
+                                       if (!strcasecmp(recp->recp_local, CC->user.fullname)) {
+                                               if (me_attend) icalproperty_free(me_attend);
+                                               me_attend = icalproperty_new_clone(attendee);
                                        }
+                                       free_recipients(recp);
                                }
                        }
+
                        /* Remove it... */
                        icalcomponent_remove_property(vevent, attendee);
                        icalproperty_free(attendee);
@@ -538,10 +537,13 @@ STARTOVER:
 
                        /* Check to see if these two attendees match...
                         */
-                       if (!strcasecmp(
-                          icalproperty_get_attendee(e_attendee),
-                          icalproperty_get_attendee(r_attendee)
-                       )) {
+                       const char *e, *r;
+                       e = icalproperty_get_attendee(e_attendee);
+                       r = icalproperty_get_attendee(r_attendee);
+
+                       if ((e != NULL) && 
+                           (r != NULL) && 
+                           !strcasecmp(e, r)) {
                                /* ...and if they do, remove the attendee from the event
                                 * and replace it with the attendee from the reply.  (The
                                 * reply's copy will have the same address, but an updated
@@ -594,13 +596,13 @@ int ical_update_my_calendar_with_reply(icalcomponent *cal) {
        /* Figure out just what event it is we're dealing with */
        strcpy(uid, "--==<< InVaLiD uId >>==--");
        ical_learn_uid_of_reply(uid, cal);
-       CtdlLogPrintf(CTDL_DEBUG, "UID of event being replied to is <%s>\n", uid);
+       syslog(LOG_DEBUG, "UID of event being replied to is <%s>\n", uid);
 
        strcpy(hold_rm, CC->room.QRname);       /* save current room */
 
        if (CtdlGetRoom(&CC->room, USERCALENDARROOM) != 0) {
                CtdlGetRoom(&CC->room, hold_rm);
-               CtdlLogPrintf(CTDL_CRIT, "cannot get user calendar room\n");
+               syslog(LOG_CRIT, "cannot get user calendar room\n");
                return(2);
        }
 
@@ -614,7 +616,7 @@ int ical_update_my_calendar_with_reply(icalcomponent *cal) {
 
        CtdlGetRoom(&CC->room, hold_rm);        /* return to saved room */
 
-       CtdlLogPrintf(CTDL_DEBUG, "msgnum_being_replaced == %ld\n", msgnum_being_replaced);
+       syslog(LOG_DEBUG, "msgnum_being_replaced == %ld\n", msgnum_being_replaced);
        if (msgnum_being_replaced == 0) {
                return(1);                      /* no calendar event found */
        }
@@ -641,7 +643,7 @@ int ical_update_my_calendar_with_reply(icalcomponent *cal) {
 
        original_event = oec.c;
        if (original_event == NULL) {
-               CtdlLogPrintf(CTDL_ERR, "ERROR: Original_component is NULL.\n");
+               syslog(LOG_ERR, "ERROR: Original_component is NULL.\n");
                return(2);
        }
 
@@ -845,7 +847,7 @@ int ical_ctdl_is_overlap(
                return(1);
        }
 
-       /* lprintf (9, "Comparing t1start %d:%d t1end %d:%d t2start %d:%d t2end %d:%d \n",
+       /* syslog(LOG_DEBUG, "Comparing t1start %d:%d t1end %d:%d t2start %d:%d t2end %d:%d \n",
                t1start.hour, t1start.minute, t1end.hour, t1end.minute,
                t2start.hour, t2start.minute, t2end.hour, t2end.minute);
        */
@@ -854,11 +856,11 @@ int ical_ctdl_is_overlap(
 
        /* If event 1 ends before event 2 starts, we're in the clear. */
        if (icaltime_compare(t1end, t2start) <= 0) return(0);
-       /* lprintf(9, "first passed\n"); */
+       /* syslog(LOG_DEBUG, "first passed\n"); */
 
        /* If event 2 ends before event 1 starts, we're also ok. */
        if (icaltime_compare(t2end, t1start) <= 0) return(0);
-       /* lprintf(9, "second passed\n"); */
+       /* syslog(LOG_DEBUG, "second passed\n"); */
 
        /* Otherwise, they overlap. */
        return(1);
@@ -887,13 +889,13 @@ int ical_conflicts_phase6(struct icaltimetype t1start,
        /* debugging cruft *
        time_t tt;
        tt = icaltime_as_timet_with_zone(t1start, t1start.zone);
-       CtdlLogPrintf(CTDL_DEBUG, "PROPOSED START: %s", ctime(&tt));
+       syslog(LOG_DEBUG, "PROPOSED START: %s", ctime(&tt));
        tt = icaltime_as_timet_with_zone(t1end, t1end.zone);
-       CtdlLogPrintf(CTDL_DEBUG, "  PROPOSED END: %s", ctime(&tt));
+       syslog(LOG_DEBUG, "  PROPOSED END: %s", ctime(&tt));
        tt = icaltime_as_timet_with_zone(t2start, t2start.zone);
-       CtdlLogPrintf(CTDL_DEBUG, "EXISTING START: %s", ctime(&tt));
+       syslog(LOG_DEBUG, "EXISTING START: %s", ctime(&tt));
        tt = icaltime_as_timet_with_zone(t2end, t2end.zone);
-       CtdlLogPrintf(CTDL_DEBUG, "  EXISTING END: %s", ctime(&tt));
+       syslog(LOG_DEBUG, "  EXISTING END: %s", ctime(&tt));
        * debugging cruft */
 
        /* compare and output */
@@ -984,6 +986,9 @@ void ical_conflicts_phase5(struct icaltimetype t1start,
                }
                dur = icaltime_subtract(t2end, t2start);
        }
+       else {
+               memset (&dur, 0, sizeof(struct icaldurationtype));
+       }
 
        rrule = ical_ctdl_get_subprop(existing_event, ICAL_RRULE_PROPERTY);
        if (rrule) {
@@ -1054,13 +1059,16 @@ void ical_conflicts_phase4(icalcomponent *proposed_event,
        int num_recur = 0;
 
        /* initialization */
-       strcpy(compare_uid, "");
+       *compare_uid = '\0';
 
        /* proposed event stuff */
 
        p = ical_ctdl_get_subprop(proposed_event, ICAL_DTSTART_PROPERTY);
-       if (p == NULL) return;
-       if (p != NULL) t1start = icalproperty_get_dtstart(p);
+       if (p == NULL)
+               return;
+       else
+               t1start = icalproperty_get_dtstart(p);
+
        if (icaltime_is_utc(t1start)) {
                t1start.zone = icaltimezone_get_utc_timezone();
        }
@@ -1095,6 +1103,9 @@ void ical_conflicts_phase4(icalcomponent *proposed_event,
 
                dur = icaltime_subtract(t1end, t1start);
        }
+       else {
+               memset (&dur, 0, sizeof(struct icaldurationtype));
+       }
 
        rrule = ical_ctdl_get_subprop(proposed_event, ICAL_RRULE_PROPERTY);
        if (rrule) {
@@ -1242,8 +1253,8 @@ void ical_add_to_freebusy(icalcomponent *fb, icalcomponent *top_level_cal) {
        icalproperty *p;
        icalvalue *v;
        struct icalperiodtype this_event_period = icalperiodtype_null_period();
-       icaltimetype dtstart = icaltime_null_time();
-       icaltimetype dtend = icaltime_null_time();
+       icaltimetype dtstart;
+       icaltimetype dtend;
 
        /* recur variables */
        icalproperty *rrule = NULL;
@@ -1296,6 +1307,9 @@ void ical_add_to_freebusy(icalcomponent *fb, icalcomponent *top_level_cal) {
        if (!icaltime_is_null_time(dtend)) {
                dur = icaltime_subtract(dtend, dtstart);
        }
+       else {
+               memset (&dur, 0, sizeof(struct icaldurationtype));
+       }
 
        /* Is a recurrence specified?  If so, get ready to process it... */
        rrule = ical_ctdl_get_subprop(cal, ICAL_RRULE_PROPERTY);
@@ -1430,7 +1444,7 @@ void ical_freebusy(char *who) {
        if (found_user != 0) {
                strcpy(buf, who);
                recp = validate_recipients(buf, NULL, 0);
-               CtdlLogPrintf(CTDL_DEBUG, "Trying <%s>\n", buf);
+               syslog(LOG_DEBUG, "Trying <%s>\n", buf);
                if (recp != NULL) {
                        if (recp->num_local == 1) {
                                found_user = CtdlGetUser(&usbuf, recp->recp_local);
@@ -1444,7 +1458,7 @@ void ical_freebusy(char *who) {
         */
        if (found_user != 0) {
                snprintf(buf, sizeof buf, "%s@%s", who, config.c_fqdn);
-               CtdlLogPrintf(CTDL_DEBUG, "Trying <%s>\n", buf);
+               syslog(LOG_DEBUG, "Trying <%s>\n", buf);
                recp = validate_recipients(buf, NULL, 0);
                if (recp != NULL) {
                        if (recp->num_local == 1) {
@@ -1467,7 +1481,7 @@ void ical_freebusy(char *who) {
                        if ( (!strcasecmp(type, "localhost"))
                           || (!strcasecmp(type, "directory")) ) {
                                snprintf(buf, sizeof buf, "%s@%s", who, host);
-                               CtdlLogPrintf(CTDL_DEBUG, "Trying <%s>\n", buf);
+                               syslog(LOG_DEBUG, "Trying <%s>\n", buf);
                                recp = validate_recipients(buf, NULL, 0);
                                if (recp != NULL) {
                                        if (recp->num_local == 1) {
@@ -1496,7 +1510,7 @@ void ical_freebusy(char *who) {
        }
 
        /* Create a VFREEBUSY subcomponent */
-       CtdlLogPrintf(CTDL_DEBUG, "Creating VFREEBUSY component\n");
+       syslog(LOG_DEBUG, "Creating VFREEBUSY component\n");
        fb = icalcomponent_new_vfreebusy();
        if (fb == NULL) {
                cprintf("%d Internal error: cannot allocate memory.\n",
@@ -1523,7 +1537,7 @@ void ical_freebusy(char *who) {
        icalcomponent_add_property(fb, icalproperty_new_organizer(buf));
 
        /* Add busy time from events */
-       CtdlLogPrintf(CTDL_DEBUG, "Adding busy time from events\n");
+       syslog(LOG_DEBUG, "Adding busy time from events\n");
        CtdlForEachMessage(MSGS_ALL, 0, NULL, NULL, NULL, ical_freebusy_backend, (void *)fb );
 
        /* If values for DTSTART and DTEND are still not present, set them
@@ -1537,7 +1551,7 @@ void ical_freebusy(char *who) {
        }
 
        /* Put the freebusy component into the calendar component */
-       CtdlLogPrintf(CTDL_DEBUG, "Encapsulating\n");
+       syslog(LOG_DEBUG, "Encapsulating\n");
        encaps = ical_encapsulate_subcomponent(fb);
        if (encaps == NULL) {
                icalcomponent_free(fb);
@@ -1548,11 +1562,11 @@ void ical_freebusy(char *who) {
        }
 
        /* Set the method to PUBLISH */
-       CtdlLogPrintf(CTDL_DEBUG, "Setting method\n");
+       syslog(LOG_DEBUG, "Setting method\n");
        icalcomponent_set_method(encaps, ICAL_METHOD_PUBLISH);
 
        /* Serialize it */
-       CtdlLogPrintf(CTDL_DEBUG, "Serializing\n");
+       syslog(LOG_DEBUG, "Serializing\n");
        serialized_request = icalcomponent_as_ical_string_r(encaps);
        icalcomponent_free(encaps);     /* Don't need this anymore. */
 
@@ -1661,7 +1675,7 @@ void ical_getics(void)
 
        encaps = icalcomponent_new_vcalendar();
        if (encaps == NULL) {
-               CtdlLogPrintf(CTDL_ALERT, "ERROR: could not allocate component!\n");
+               syslog(LOG_ALERT, "ERROR: could not allocate component!\n");
                cprintf("%d Could not allocate memory\n", ERROR+INTERNAL_ERROR);
                return;
        }
@@ -1787,7 +1801,7 @@ void ical_putics(void)
                                HashPos = GetNewHashPos(tzidlist, 0);
 
                                while (GetNextHashPos(tzidlist, HashPos, &len, &Key, &Value)) {
-                                       CtdlLogPrintf(CTDL_DEBUG, "Attaching timezone '%s'\n", Value);
+                                       syslog(LOG_DEBUG, "Attaching timezone '%s'\n", (char*) Value);
                                        icaltimezone *t = NULL;
 
                                        /* First look for a timezone attached to the original calendar */
@@ -1912,7 +1926,7 @@ void ical_CtdlCreateRoom(void)
 
        /* Set expiration policy to manual; otherwise objects will be lost! */
        if (CtdlGetRoomLock(&qr, USERCALENDARROOM)) {
-               CtdlLogPrintf(CTDL_CRIT, "Couldn't get the user calendar room!\n");
+               syslog(LOG_CRIT, "Couldn't get the user calendar room!\n");
                return;
        }
        qr.QRep.expire_mode = EXPIRE_MANUAL;
@@ -1929,7 +1943,7 @@ void ical_CtdlCreateRoom(void)
 
        /* Set expiration policy to manual; otherwise objects will be lost! */
        if (CtdlGetRoomLock(&qr, USERTASKSROOM)) {
-               CtdlLogPrintf(CTDL_CRIT, "Couldn't get the user calendar room!\n");
+               syslog(LOG_CRIT, "Couldn't get the user calendar room!\n");
                return;
        }
        qr.QRep.expire_mode = EXPIRE_MANUAL;
@@ -1946,7 +1960,7 @@ void ical_CtdlCreateRoom(void)
 
        /* Set expiration policy to manual; otherwise objects will be lost! */
        if (CtdlGetRoomLock(&qr, USERNOTESROOM)) {
-               CtdlLogPrintf(CTDL_CRIT, "Couldn't get the user calendar room!\n");
+               syslog(LOG_CRIT, "Couldn't get the user calendar room!\n");
                return;
        }
        qr.QRep.expire_mode = EXPIRE_MANUAL;
@@ -1995,7 +2009,7 @@ void ical_send_out_invitations(icalcomponent *top_level_cal, icalcomponent *cal)
        const char *tzidc = NULL;
 
        if (cal == NULL) {
-               CtdlLogPrintf(CTDL_ERR, "ERROR: trying to reply to NULL event?\n");
+               syslog(LOG_ERR, "ERROR: trying to reply to NULL event?\n");
                return;
        }
 
@@ -2013,7 +2027,7 @@ void ical_send_out_invitations(icalcomponent *top_level_cal, icalcomponent *cal)
        /* Clone the event */
        the_request = icalcomponent_new_clone(cal);
        if (the_request == NULL) {
-               CtdlLogPrintf(CTDL_ERR, "ERROR: cannot clone calendar object\n");
+               syslog(LOG_ERR, "ERROR: cannot clone calendar object\n");
                return;
        }
 
@@ -2032,24 +2046,22 @@ void ical_send_out_invitations(icalcomponent *top_level_cal, icalcomponent *cal)
        /* Determine who the recipients of this message are (the attendees) */
        strcpy(attendees_string, "");
        for (attendee = icalcomponent_get_first_property(the_request, ICAL_ATTENDEE_PROPERTY); attendee != NULL; attendee = icalcomponent_get_next_property(the_request, ICAL_ATTENDEE_PROPERTY)) {
-               if (icalproperty_get_attendee(attendee)) {
-                       safestrncpy(this_attendee, icalproperty_get_attendee(attendee), sizeof this_attendee);
-                       if (!strncasecmp(this_attendee, "MAILTO:", 7)) {
-                               strcpy(this_attendee, &this_attendee[7]);
-
-                               if (!CtdlIsMe(this_attendee, sizeof this_attendee)) {   /* don't send an invitation to myself! */
-                                       snprintf(&attendees_string[strlen(attendees_string)],
-                                               sizeof(attendees_string) - strlen(attendees_string),
-                                               "%s, ",
-                                               this_attendee
+               const char *ch = icalproperty_get_attendee(attendee);
+               if ((ch != NULL) && !strncasecmp(ch, "MAILTO:", 7)) {
+                       safestrncpy(this_attendee, ch + 7, sizeof(this_attendee));
+                       
+                       if (!CtdlIsMe(this_attendee, sizeof this_attendee)) {   /* don't send an invitation to myself! */
+                               snprintf(&attendees_string[strlen(attendees_string)],
+                                        sizeof(attendees_string) - strlen(attendees_string),
+                                        "%s, ",
+                                        this_attendee
                                        );
-                                       ++num_attendees;
-                               }
+                               ++num_attendees;
                        }
                }
        }
 
-       CtdlLogPrintf(CTDL_DEBUG, "<%d> attendees: <%s>\n", num_attendees, attendees_string);
+       syslog(LOG_DEBUG, "<%d> attendees: <%s>\n", num_attendees, attendees_string);
 
        /* If there are no attendees, there are no invitations to send, so...
         * don't bother putting one together!  Punch out, Maverick!
@@ -2062,7 +2074,7 @@ void ical_send_out_invitations(icalcomponent *top_level_cal, icalcomponent *cal)
        /* Encapsulate the VEVENT component into a complete VCALENDAR */
        encaps = icalcomponent_new_vcalendar();
        if (encaps == NULL) {
-               CtdlLogPrintf(CTDL_ALERT, "ERROR: could not allocate component!\n");
+               syslog(LOG_ALERT, "ERROR: could not allocate component!\n");
                icalcomponent_free(the_request);
                return;
        }
@@ -2214,7 +2226,7 @@ void ical_saving_vevent(icalcomponent *top_level_cal, icalcomponent *cal) {
        icalproperty *organizer = NULL;
        char organizer_string[SIZ];
 
-       CtdlLogPrintf(CTDL_DEBUG, "ical_saving_vevent() has been called!\n");
+       syslog(LOG_DEBUG, "ical_saving_vevent() has been called!\n");
 
        /* Don't send out invitations unless the client wants us to. */
        if (CIT_ICAL->server_generated_invitations == 0) {
@@ -2329,7 +2341,7 @@ void ical_obj_beforesave_backend(char *name, char *filename, char *partnum,
                                                free(msg->cm_fields['E']);
                                        }
                                        msg->cm_fields['E'] = strdup(buf);
-                                       CtdlLogPrintf(CTDL_DEBUG, "Saving calendar UID <%s>\n", buf);
+                                       syslog(LOG_DEBUG, "Saving calendar UID <%s>\n", buf);
                                }
                        }
 
@@ -2342,7 +2354,7 @@ void ical_obj_beforesave_backend(char *name, char *filename, char *partnum,
                                        if (msg->cm_fields['U'] != NULL) {
                                                free(msg->cm_fields['U']);
                                        }
-                                       msg->cm_fields['U'] = strdup(buf);
+                                       msg->cm_fields['U'] = rfc2047encode(buf, strlen(buf));
                                }
                        }
 
@@ -2390,7 +2402,7 @@ int ical_obj_beforesave(struct CtdlMessage *msg)
 
        /* It must be an RFC822 message! */
        if (msg->cm_format_type != 4) {
-               CtdlLogPrintf(CTDL_DEBUG, "Rejecting non-RFC822 message\n");
+               syslog(LOG_DEBUG, "Rejecting non-RFC822 message\n");
                return(1);              /* You tried to save a non-RFC822 message! */
        }
 
@@ -2499,6 +2511,7 @@ void ical_fixed_output_backend(icalcomponent *cal,
        icalcomponent *c;
        icalproperty *p;
        char buf[256];
+       const char *ch;
 
        p = icalcomponent_get_first_property(cal, ICAL_SUMMARY_PROPERTY);
        if (p != NULL) {
@@ -2517,11 +2530,12 @@ void ical_fixed_output_backend(icalcomponent *cal,
 
        /* If the component has attendees, iterate through them. */
        for (p = icalcomponent_get_first_property(cal, ICAL_ATTENDEE_PROPERTY); (p != NULL); p = icalcomponent_get_next_property(cal, ICAL_ATTENDEE_PROPERTY)) {
-               safestrncpy(buf, icalproperty_get_attendee(p), sizeof buf);
-               if (!strncasecmp(buf, "MAILTO:", 7)) {
+               ch =  icalproperty_get_attendee(p);
+               if ((ch != NULL) && 
+                   !strncasecmp(ch, "MAILTO:", 7)) {
 
                        /* screen name or email address */
-                       strcpy(buf, &buf[7]);
+                       safestrncpy(buf, ch + 7, sizeof(buf));
                        striplt(buf);
                        cprintf("%s ", buf);
                }
@@ -2596,6 +2610,6 @@ CTDL_MODULE_INIT(calendar)
                CtdlRegisterCleanupHook(serv_calendar_destroy);
        }
        
-       /* return our Subversion id for the Log */
+       /* return our module name for the log */
        return "calendar";
 }