[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-core-devel
Subject: Fix for KCookieJar's Year 2038 (Y2K38) problem...
From: "Dawit A." <adawit () kde ! org>
Date: 2009-12-13 14:30:30
Message-ID: 200912130930.30891.adawit () kde ! org
[Download RAW message or body]
[Attachment #2 (multipart/alternative)]
Hi all,
The attached patch is a fix for the so called Y2K38 (Year 2038) problem in
kcookiejar due to the use of a 32-bit time_t variable to store the expiration
date. Currently, if any site sets a cookie expiration date greater than
03:14:07 Tuesday, 19 January 2038, then the cookie will simply be deleted by
kcookiejar because the 32-bit overflow will "wrap-around" its expiration date
to be set in the past...
[Attachment #5 (text/html)]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" \
"http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" \
content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; \
font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; \
margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; \
-qt-user-state:0;">Hi all,</p> <p style="-qt-paragraph-type:empty; margin-top:0px; \
margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; \
text-indent:0px; -qt-user-state:0;"></p> <p style=" margin-top:0px; \
margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; \
text-indent:0px; -qt-user-state:0;">The attached patch is a fix for the so called \
Y2K38 (Year 2038) problem in kcookiejar due to the use of a 32-bit time_t variable to \
store the expiration date. Currently, if any site sets a cookie expiration date \
greater than <span style=" font-family:'-webkit-sans-serif'; color:#000000;">03:14:07 \
Tuesday, 19 January 2038, then the cookie will simply be deleted by kcookiejar \
because the 32-bit overflow will "wrap-around" its expiration date to be set in the \
past...</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; \
margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; \
text-indent:0px; -qt-user-state:0; font-family:'-webkit-sans-serif'; \
color:#000000;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; \
margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; \
text-indent:0px; -qt-user-state:0; font-family:'-webkit-sans-serif'; \
color:#000000;"></p></body></html>
["kcookiejar_y238k_fix_43branch.patch" (text/x-patch)]
Index: kdelibs/kioslave/http/kcookiejar/kcookiewin.cpp
===================================================================
--- kdelibs/kioslave/http/kcookiejar/kcookiewin.cpp (revision 1059052)
+++ kdelibs/kioslave/http/kcookiejar/kcookiewin.cpp (working copy)
@@ -40,7 +40,6 @@
#include <QtGui/QLabel>
#include <QtGui/QLayout>
#include <QtGui/QGroupBox>
-#include <QtCore/QDate>
#include <QtGui/QPushButton>
#include <QtGui/QRadioButton>
#include <QtGui/QShortcut>
@@ -53,6 +52,7 @@
#include <kapplication.h>
#include <kwindowsystem.h>
#include <kvbox.h>
+#include <kdatetime.h>
KCookieWin::KCookieWin( QWidget *parent, KHttpCookieList cookieList,
int defaultButton, bool showDetails )
@@ -284,7 +284,7 @@
else
m_domain->setText(cookie.domain());
m_path->setText(cookie.path());
- QDateTime cookiedate;
+ KDateTime cookiedate;
cookiedate.setTime_t(cookie.expireDate());
if (cookie.expireDate())
m_expires->setText(KGlobal::locale()->formatDateTime(cookiedate));
Index: kdelibs/kioslave/http/kcookiejar/tests/cookie.test
===================================================================
--- kdelibs/kioslave/http/kcookiejar/tests/cookie.test (revision 1059052)
+++ kdelibs/kioslave/http/kcookiejar/tests/cookie.test (working copy)
@@ -160,3 +160,8 @@
CHECK https://192.168.0.1 Cookie: name1=value1; name11=value11; name3=value3
CHECK http://192.168.0.10
CHECK http://192.168.0
+## Check expiration dates for the so called Y2K38 (Year 2038) problem
+COOKIE ASK http://foo.bar Set-Cookie: CFID=15727;expires=Tue, 06-Dec-2039 00:30:42 \
GMT;path=/ +COOKIE ASK http://foo.bar Set-Cookie: CFTOKEN=49898422;expires=Tue, \
06-Dec-2039 00:30:42 GMT;path=/ +CHECK http://foo.bar Cookie: CFID=15727; \
CFTOKEN=49898422 +CLEAR COOKIES
Index: kdelibs/kioslave/http/kcookiejar/kcookiejar.cpp
===================================================================
--- kdelibs/kioslave/http/kcookiejar/kcookiejar.cpp (revision 1059052)
+++ kdelibs/kioslave/http/kcookiejar/kcookiejar.cpp (working copy)
@@ -129,7 +129,7 @@
const QString &_path,
const QString &_name,
const QString &_value,
- time_t _expireDate,
+ qint64 _expireDate,
int _protocolVersion,
bool _secure,
bool _httpOnly,
@@ -150,7 +150,7 @@
//
// Checks if a cookie has been expired
//
-bool KHttpCookie::isExpired(time_t currentDate) const
+bool KHttpCookie::isExpired(qint64 currentDate) const
{
return (mExpireDate != 0) && (mExpireDate < currentDate);
}
@@ -722,7 +722,7 @@
// Insert cookie in chain
cookieList.append(cookie);
- lastCookie = cookieList.end(); --lastCookie;
+ lastCookie = cookieList.end(); --lastCookie;
}
else if (strncasecmp(cookieStr, "Set-Cookie2:", 12) == 0)
{
@@ -1246,7 +1246,7 @@
QTextStream ts(&saveFile);
- time_t curTime = time(0);
+ qint64 curTime = time(0);
ts << "# KDE Cookie File v2\n#\n";
@@ -1283,9 +1283,9 @@
domain += cookie.domain();
domain += '"';
// TODO: replace with direct QTextStream output ?
- s.sprintf("%-20s %-20s %-12s %10lu %3d %-20s %-4i %s\n",
+ s.sprintf("%-20s %-20s %-12s %10lld %3d %-20s %-4i %s\n",
cookie.host().toLatin1().constData(), \
domain.toLatin1().constData(),
- path.toLatin1().constData(), (unsigned long) \
cookie.expireDate(), + path.toLatin1().constData(), \
cookie.expireDate(), cookie.protocolVersion(),
cookie.name().isEmpty() ? \
cookie.value().toLatin1().constData() : \
cookie.name().toLatin1().constData(),
(cookie.isSecure() ? 1 : 0) + (cookie.isHttpOnly() ? 2 : 0) \
+ @@ -1342,7 +1342,7 @@
return false;
}
- time_t curTime = time(0);
+ qint64 curTime = time(0);
char *buffer = new char[READ_BUFFER_SIZE];
@@ -1378,7 +1378,7 @@
const QString path = QString::fromLatin1( parseField(line) );
const QString expStr = QString::fromLatin1( parseField(line) );
if (expStr.isEmpty()) continue;
- const int expDate = expStr.toInt();
+ const qint64 expDate = expStr.toLongLong();
const QString verStr = QString::fromLatin1( parseField(line) );
if (verStr.isEmpty()) continue;
int protVer = verStr.toInt();
Index: kdelibs/kioslave/http/kcookiejar/kcookiejar.h
===================================================================
--- kdelibs/kioslave/http/kcookiejar/kcookiejar.h (revision 1059052)
+++ kdelibs/kioslave/http/kcookiejar/kcookiejar.h (working copy)
@@ -58,7 +58,7 @@
QString mPath;
QString mName;
QString mValue;
- time_t mExpireDate;
+ qint64 mExpireDate;
int mProtocolVersion;
bool mSecure;
bool mCrossDomain;
@@ -74,7 +74,7 @@
const QString &_path=QString(),
const QString &_name=QString(),
const QString &_value=QString(),
- time_t _expireDate=0,
+ qint64 _expireDate=0,
int _protocolVersion=0,
bool _secure = false,
bool _httpOnly = false,
@@ -88,10 +88,10 @@
QList<long> &windowIds() { return mWindowIds; }
const QList<long> &windowIds() const { return mWindowIds; }
void fixDomain(const QString &domain) { mDomain = domain; }
- time_t expireDate() const { return mExpireDate; }
+ qint64 expireDate() const { return mExpireDate; }
int protocolVersion() const { return mProtocolVersion; }
bool isSecure() const { return mSecure; }
- bool isExpired(time_t currentDate) const;
+ bool isExpired(qint64 currentDate) const;
bool isCrossDomain() const { return mCrossDomain; }
bool isHttpOnly() const { return mHttpOnly; }
bool hasExplicitPath() const { return mExplicitPath; }
Index: kdebase/apps/konqueror/settings/kio/kcookiesmanagement.cpp
===================================================================
--- kdebase/apps/konqueror/settings/kio/kcookiesmanagement.cpp (revision 1059228)
+++ kdebase/apps/konqueror/settings/kio/kcookiesmanagement.cpp (working copy)
@@ -31,7 +31,6 @@
#include <QtGui/QPushButton>
#include <QtGui/QLabel>
#include <QtCore/QTimer>
-#include <QtCore/QDate>
#include <QtGui/QToolButton>
#include <QtGui/QBoxLayout>
#include <QtCore/QList>
@@ -46,6 +45,7 @@
#include <klineedit.h>
#include <kmessagebox.h>
#include <kurl.h>
+#include <kdatetime.h>
// Local
#include "kcookiesmain.h"
@@ -335,13 +335,13 @@
if (c == fieldVal.end()) // empty list, do not crash
return false;
cookie->value = *c++;
- unsigned tmp = (*c++).toUInt();
+ qint64 tmp = (*c++).toLongLong();
if( tmp == 0 )
cookie->expireDate = i18n("End of session");
else
{
- QDateTime expDate;
+ KDateTime expDate;
expDate.setTime_t(tmp);
cookie->expireDate = KGlobal::locale()->formatDateTime(expDate);
}
["kcookiejar_y238k_fix_trunk.patch" (text/x-patch)]
Index: kdelibs/kioslave/http/kcookiejar/kcookiewin.cpp
===================================================================
--- kdelibs/kioslave/http/kcookiejar/kcookiewin.cpp (revision 1061998)
+++ kdelibs/kioslave/http/kcookiejar/kcookiewin.cpp (working copy)
@@ -40,7 +40,6 @@
#include <QtGui/QLabel>
#include <QtGui/QLayout>
#include <QtGui/QGroupBox>
-#include <QtCore/QDate>
#include <QtGui/QPushButton>
#include <QtGui/QRadioButton>
#include <QtGui/QShortcut>
@@ -52,6 +51,7 @@
#include <kiconloader.h>
#include <kapplication.h>
#include <kvbox.h>
+#include <kdatetime.h>
KCookieWin::KCookieWin( QWidget *parent, KHttpCookieList cookieList,
int defaultButton, bool showDetails )
@@ -283,7 +283,7 @@
else
m_domain->setText(cookie.domain());
m_path->setText(cookie.path());
- QDateTime cookiedate;
+ KDateTime cookiedate;
cookiedate.setTime_t(cookie.expireDate());
if (cookie.expireDate())
m_expires->setText(KGlobal::locale()->formatDateTime(cookiedate));
Index: kdelibs/kioslave/http/kcookiejar/kcookiejar.cpp
===================================================================
--- kdelibs/kioslave/http/kcookiejar/kcookiejar.cpp (revision 1061998)
+++ kdelibs/kioslave/http/kcookiejar/kcookiejar.cpp (working copy)
@@ -129,7 +129,7 @@
const QString &_path,
const QString &_name,
const QString &_value,
- time_t _expireDate,
+ qint64 _expireDate,
int _protocolVersion,
bool _secure,
bool _httpOnly,
@@ -150,7 +150,7 @@
//
// Checks if a cookie has been expired
//
-bool KHttpCookie::isExpired(time_t currentDate) const
+bool KHttpCookie::isExpired(qint64 currentDate) const
{
return (mExpireDate != 0) && (mExpireDate < currentDate);
}
@@ -722,7 +722,7 @@
// Insert cookie in chain
cookieList.append(cookie);
- lastCookie = cookieList.end(); --lastCookie;
+ lastCookie = cookieList.end(); --lastCookie;
}
else if (strncasecmp(cookieStr, "Set-Cookie2:", 12) == 0)
{
@@ -1246,7 +1246,7 @@
QTextStream ts(&saveFile);
- time_t curTime = time(0);
+ qint64 curTime = time(0);
ts << "# KDE Cookie File v2\n#\n";
@@ -1283,9 +1283,9 @@
domain += cookie.domain();
domain += '"';
// TODO: replace with direct QTextStream output ?
- s.sprintf("%-20s %-20s %-12s %10lu %3d %-20s %-4i %s\n",
+ s.sprintf("%-20s %-20s %-12s %10lld %3d %-20s %-4i %s\n",
cookie.host().toLatin1().constData(), \
domain.toLatin1().constData(),
- path.toLatin1().constData(), (unsigned long) \
cookie.expireDate(), + path.toLatin1().constData(), \
cookie.expireDate(), cookie.protocolVersion(),
cookie.name().isEmpty() ? \
cookie.value().toLatin1().constData() : \
cookie.name().toLatin1().constData(),
(cookie.isSecure() ? 1 : 0) + (cookie.isHttpOnly() ? 2 : 0) \
+ @@ -1342,7 +1342,7 @@
return false;
}
- time_t curTime = time(0);
+ qint64 curTime = time(0);
char *buffer = new char[READ_BUFFER_SIZE];
@@ -1378,7 +1378,7 @@
const QString path = QString::fromLatin1( parseField(line) );
const QString expStr = QString::fromLatin1( parseField(line) );
if (expStr.isEmpty()) continue;
- const int expDate = expStr.toInt();
+ const qint64 expDate = expStr.toLongLong();
const QString verStr = QString::fromLatin1( parseField(line) );
if (verStr.isEmpty()) continue;
int protVer = verStr.toInt();
Index: kdelibs/kioslave/http/kcookiejar/tests/cookie.test
===================================================================
--- kdelibs/kioslave/http/kcookiejar/tests/cookie.test (revision 1061998)
+++ kdelibs/kioslave/http/kcookiejar/tests/cookie.test (working copy)
@@ -160,3 +160,8 @@
CHECK https://192.168.0.1 Cookie: name1=value1; name11=value11; name3=value3
CHECK http://192.168.0.10
CHECK http://192.168.0
+## Check expiration dates for the so called Y2K38 (Year 2038) problem
+COOKIE ASK http://foo.bar Set-Cookie: CFID=15727;expires=Tue, 06-Dec-2039 00:30:42 \
GMT;path=/ +COOKIE ASK http://foo.bar Set-Cookie: CFTOKEN=49898422;expires=Tue, \
06-Dec-2039 00:30:42 GMT;path=/ +CHECK http://foo.bar Cookie: CFID=15727; \
CFTOKEN=49898422 +CLEAR COOKIES
Index: kdelibs/kioslave/http/kcookiejar/kcookiejar.h
===================================================================
--- kdelibs/kioslave/http/kcookiejar/kcookiejar.h (revision 1061998)
+++ kdelibs/kioslave/http/kcookiejar/kcookiejar.h (working copy)
@@ -58,7 +58,7 @@
QString mPath;
QString mName;
QString mValue;
- time_t mExpireDate;
+ qint64 mExpireDate;
int mProtocolVersion;
bool mSecure;
bool mCrossDomain;
@@ -74,7 +74,7 @@
const QString &_path=QString(),
const QString &_name=QString(),
const QString &_value=QString(),
- time_t _expireDate=0,
+ qint64 _expireDate=0,
int _protocolVersion=0,
bool _secure = false,
bool _httpOnly = false,
@@ -88,10 +88,10 @@
QList<long> &windowIds() { return mWindowIds; }
const QList<long> &windowIds() const { return mWindowIds; }
void fixDomain(const QString &domain) { mDomain = domain; }
- time_t expireDate() const { return mExpireDate; }
+ qint64 expireDate() const { return mExpireDate; }
int protocolVersion() const { return mProtocolVersion; }
bool isSecure() const { return mSecure; }
- bool isExpired(time_t currentDate) const;
+ bool isExpired(qint64 currentDate) const;
bool isCrossDomain() const { return mCrossDomain; }
bool isHttpOnly() const { return mHttpOnly; }
bool hasExplicitPath() const { return mExplicitPath; }
Index: kdebase/apps/konqueror/settings/kio/kcookiesmanagement.cpp
===================================================================
--- kdebase/apps/konqueror/settings/kio/kcookiesmanagement.cpp (revision 1061997)
+++ kdebase/apps/konqueror/settings/kio/kcookiesmanagement.cpp (working copy)
@@ -31,7 +31,6 @@
#include <QtGui/QPushButton>
#include <QtGui/QLabel>
#include <QtCore/QTimer>
-#include <QtCore/QDate>
#include <QtGui/QToolButton>
#include <QtGui/QBoxLayout>
#include <QtCore/QList>
@@ -46,6 +45,7 @@
#include <klineedit.h>
#include <kmessagebox.h>
#include <kurl.h>
+#include <kdatetime.h>
// Local
#include "kcookiesmain.h"
@@ -336,13 +336,13 @@
if (c == fieldVal.end()) // empty list, do not crash
return false;
cookie->value = *c++;
- unsigned tmp = (*c++).toUInt();
+ qint64 tmp = (*c++).toLongLong();
if( tmp == 0 )
cookie->expireDate = i18n("End of session");
else
{
- QDateTime expDate;
+ KDateTime expDate;
expDate.setTime_t(tmp);
cookie->expireDate = KGlobal::locale()->formatDateTime(expDate);
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic