AUDIT: r17459 - gnucash/trunk/src/gnome-utils - Bug #545722: Get the GNCDateEdit control working on Win32 again. Don't assume that the content returned by localtime() will not be changed out from under you.

Charles Day cedayiv at gmail.com
Fri Jul 31 23:40:45 EDT 2009


Sure, why the heck not? Why didn't I think of that? So this instead, right?
tm_returned = localtime_r(&current_time, &mtm);
g_return_if_fail(tm_returned != NULL);

And get rid of the next line: mtm = *tm_returned;



On Fri, Jul 31, 2009 at 2:37 PM, Derek Atkins <warlord at mit.edu> wrote:

> Hi,
>
> As I said in my last message, I'm catching up on lots of changesets.
> Is there any reason not to use localtime_r() here?  We already make
> sure it exists by using AC_REPLACE_FUNCS().
>
> -derek
>
> Charles Day <cedayiv at cvs.gnucash.org> writes:
>
> > Author: cedayiv
> > Date: 2008-08-08 19:38:45 -0400 (Fri, 08 Aug 2008)
> > New Revision: 17459
> > Trac: http://svn.gnucash.org/trac/changeset/17459
> >
> > Modified:
> >    gnucash/trunk/src/gnome-utils/gnc-date-edit.c
> > Log:
> > Bug #545722: Get the GNCDateEdit control working on Win32 again. Don't
> assume that the content returned by localtime() will not be changed out from
> under you.
> > BP
> >
> >
> > Modified: gnucash/trunk/src/gnome-utils/gnc-date-edit.c
> > ===================================================================
> > --- gnucash/trunk/src/gnome-utils/gnc-date-edit.c     2008-08-08 21:36:48
> UTC (rev 17458)
> > +++ gnucash/trunk/src/gnome-utils/gnc-date-edit.c     2008-08-08 23:38:45
> UTC (rev 17459)
> > @@ -307,7 +307,8 @@
> >  fill_time_popup (GtkWidget *widget, GNCDateEdit *gde)
> >  {
> >       GtkWidget *menu;
> > -     struct tm *mtm;
> > +     struct tm *tm_returned;
> > +     struct tm mtm;
> >       time_t current_time;
> >       int i, j;
> >
> > @@ -318,21 +319,25 @@
> >       gtk_option_menu_set_menu (GTK_OPTION_MENU (gde->time_popup), menu);
> >
> >       time (&current_time);
> > -     mtm = localtime (&current_time);
> > +     tm_returned = localtime (&current_time);
> > +     g_return_if_fail(tm_returned != NULL);
> > +        /* The return value points to statically allocated, shared
> memory.
> > +         * Copy the contents so we don't risk unexpected changes. */
> > +        mtm = *tm_returned;
> >
> >       for (i = gde->lower_hour; i <= gde->upper_hour; i++){
> >               GtkWidget *item, *submenu;
> >               hour_info_t *hit;
> >               char buffer [40];
> >
> > -             mtm->tm_hour = i;
> > -             mtm->tm_min  = 0;
> > +             mtm.tm_hour = i;
> > +             mtm.tm_min  = 0;
> >               hit = g_new (hour_info_t, 1);
> >
> >               if (gde->flags & GNC_DATE_EDIT_24_HR)
> > -                     qof_strftime (buffer, sizeof (buffer), "%H:00",
> mtm);
> > +                     qof_strftime (buffer, sizeof (buffer), "%H:00",
> &mtm);
> >               else
> > -                     qof_strftime (buffer, sizeof (buffer), "%I:00 %p ",
> mtm);
> > +                     qof_strftime (buffer, sizeof (buffer), "%I:00 %p ",
> &mtm);
> >               hit->hour = g_strdup (buffer);
> >               hit->gde  = gde;
> >
> > @@ -351,14 +356,14 @@
> >               for (j = 0; j < 60; j += 15){
> >                       GtkWidget *mins;
> >
> > -                     mtm->tm_min = j;
> > +                     mtm.tm_min = j;
> >                       hit = g_new (hour_info_t, 1);
> >                       if (gde->flags & GNC_DATE_EDIT_24_HR)
> >                               qof_strftime (buffer, sizeof (buffer),
> > -                                           "%H:%M", mtm);
> > +                                           "%H:%M", &mtm);
> >                       else
> >                               qof_strftime (buffer, sizeof (buffer),
> > -                                           "%I:%M %p", mtm);
> > +                                           "%I:%M %p", &mtm);
> >                       hit->hour = g_strdup (buffer);
> >                       hit->gde  = gde;
> >
> > @@ -529,7 +534,8 @@
> >  void
> >  gnc_date_edit_set_time (GNCDateEdit *gde, time_t the_time)
> >  {
> > -     struct tm *mytm;
> > +     struct tm *tm_returned;
> > +     struct tm tm_to_set;
> >
> >       g_return_if_fail (gde != NULL);
> >          g_return_if_fail (GNC_IS_DATE_EDIT (gde));
> > @@ -545,8 +551,14 @@
> >          else
> >            gde->initial_time = the_time;
> >
> > -     mytm = localtime (&the_time);
> > -     gnc_date_edit_set_time_tm(gde, mytm);
> > +        /* Convert time_t to tm. */
> > +     tm_returned = localtime (&the_time);
> > +     g_return_if_fail(tm_returned != NULL);
> > +        /* The return value points to statically allocated, shared
> memory.
> > +         * Copy the contents so we don't risk unexpected changes. */
> > +        tm_to_set = *tm_returned;
> > +
> > +     gnc_date_edit_set_time_tm(gde, &tm_to_set);
> >  }
> >
> >  void
> >
> > _______________________________________________
> > gnucash-changes mailing list
> > gnucash-changes at gnucash.org
> > https://lists.gnucash.org/mailman/listinfo/gnucash-changes
> >
> >
>
> --
>        Derek Atkins, SB '93 MIT EE, SM '95 MIT Media Laboratory
>       Member, MIT Student Information Processing Board  (SIPB)
>       URL: http://web.mit.edu/warlord/    PP-ASEL-IA     N1NWH
>       warlord at MIT.EDU                        PGP key available
> _______________________________________________
> gnucash-devel mailing list
> gnucash-devel at gnucash.org
> https://lists.gnucash.org/mailman/listinfo/gnucash-devel
>


More information about the gnucash-devel mailing list