[Kde-pim] parseRFCDate/parseISODate - wrong bad date handling (PATCH)

Michal Hlaivnka masp01 at centrum.cz
Wed Jul 16 14:44:17 BST 2008


Allen Winter napsal(a):
> On Wednesday 16 July 2008 07:48:32 David Jarvie wrote:
>   
>> On Wednesday 16 July 2008 12:27, masp01 at centrum.cz wrote:
>>     
>>> Hi,
>>>
>>> I've found bug in kdepimlibs/syndication/tools.cpp (bugs.kde.org - 166721)
>>>
>>> description: if string contains date in wrong format, parseRFCDate (or
>>> parseISODate) returns 2^32-1
>>>
>>>  result: some apps (akregator) don't know about error, because returned
>>> value uint32_t(-1) is not the expected time_t(-1) ( = uint64_t(-1) at
>>> least on my computer). This leads to wrong dates being displayed
>>>
>>>  Problem is located between Qt 4 and KDateTime.
>>>
>>>  KDateTime::toTime_t() returns time_t (64bit at least on my computer)
>>>  but
>>>  QDateTime::toTime_t() returns uint (32bit)
>>>
>>>  QDateTime's -1 is converted to 4294967295, but error is tested for -1
>>>
>>>  solution: QDateTime's return type should be time_t, not uint
>>>
>>>  fix: Don't test for -1 but do QDateTime/KDateTime::isValid() tests
>>>
>>>
>>> patch to fix this is attached
>>>
>>>
>>>  time_t parseISODate(const QString& str)
>>>  {
>>> -    time_t res = KDateTime::fromString(str,
>>>       
>> KDateTime::ISODate).toTime_t();
>>     
>>> -    return res != -1 ? res : 0;
>>> +    const KDateTime kdt = KDateTime::fromString(str, KDateTime::ISODate);
>>> +    return kdt.isValid() ? kdt.toTime_t() : 0;
>>>  }
>>>
>>>  time_t parseRFCDate(const QString& str)
>>>  {
>>> -    time_t res = KDateTime::fromString(str,
>>>       
>> KDateTime::RFCDate).toTime_t();
>>     
>>> -    return res != -1 ? res : 0;
>>> +    const KDateTime kdt = KDateTime::fromString(str, KDateTime::RFCDate);
>>> +    return kdt.isValid() ? kdt.toTime_t() : 0;
>>>  }
>>>
>>>  time_t parseDate(const QString& str, DateFormat hint)
>>>       
>> How about casting the -1 to time_t in the return statements instead:
>>
>>    return res != (time_t)(-1) ? res : 0;
>>     
It won't work. res is time_t( uint(-1) ), so '-1' in the statement is 
already time_t(-1)
> I'll take care of committing this fix.
> These methods should use uint's instead of time_t's, but I don't think we can
> change that now, due to the API freeze.  drat.
>   
IMHO Qt  is the one who is wrong here. Why is uint on 64bit computer 
with x86_64 version of Qt only 32bit? And why result of 
QDateTime::toTime_t() isn't time_t ???

PS: I've not been looking too hard but I can't se where is written that 
invalid KDateTime value represented by just KDateTime() or QDateTime() 
must be equal to -1. KDateTime::toTime_t() uses QDateTime::toTime_t() 
and there is only this:
"uint QDateTime::toTime_t () const

Returns the datetime as the number of seconds that have passed since 
1970-01-01T00:00:00, Coordinated Universal Time (Qt::UTC).

On systems that do not support timezones, this function will behave as 
if local time were Qt::UTC."

So no information about return value on error (invalid datetime) at all.

_______________________________________________
KDE PIM mailing list kde-pim at kde.org
https://mail.kde.org/mailman/listinfo/kde-pim
KDE PIM home page at http://pim.kde.org/



More information about the kde-pim mailing list