[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