fix buffer overflow in datetime

Vitaliy Margolen wine-patch at kievinfo.com
Wed Apr 2 10:50:37 CST 2003


This one was causing wrong text in datetime edit box.

Vitaliy Margolen

changelog:
  fix buffer overflow in datetime


Index: dlls/comctl32/datetime.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/datetime.c,v
retrieving revision 1.35
diff -u -r1.35 datetime.c
--- dlls/comctl32/datetime.c    8 Jan 2003 21:09:28 -0000       1.35
+++ dlls/comctl32/datetime.c    2 Apr 2003 16:45:38 -0000
@@ -356,7 +356,7 @@
 
 
 static void
-DATETIME_ReturnTxt (DATETIME_INFO *infoPtr, int count, char *result)
+DATETIME_ReturnTxt (DATETIME_INFO *infoPtr, int count, char *result, int resultSize)
 {
  SYSTEMTIME date = infoPtr->date;
  int spec;
@@ -375,6 +375,8 @@
  if (spec & DT_STRING) {
        int txtlen=infoPtr->buflen[count];
 
+        if (txtlen > resultSize)
+            txtlen = resultSize - 1;
        strncpy (result, infoPtr->textbuf + (spec &~ DT_STRING), txtlen);
        result[txtlen]=0;
        TRACE ("arg%d=%x->[%s]\n",count,infoPtr->fieldspec[count],result);
@@ -399,8 +401,7 @@
                break;
        case FULLDAY:
                GetLocaleInfoA( LOCALE_USER_DEFAULT,LOCALE_SDAYNAME1+ (date.wDayOfWeek+6)%7,
-                               buffer,sizeof(buffer));
-               strcpy  (result,buffer);
+                               result, resultSize);
                break;
        case ONEDIGIT12HOUR:
                if (date.wHour>12)
@@ -440,12 +441,12 @@
                break;
        case THREECHARMONTH:
                GetLocaleInfoA( GetSystemDefaultLCID(),LOCALE_SMONTHNAME1+date.wMonth -1,
-                 buffer,sizeof(buffer));
+                               buffer,sizeof(buffer));
                sprintf (result,"%.3s",buffer);
                break;
        case FULLMONTH:
                GetLocaleInfoA( GetSystemDefaultLCID(),LOCALE_SMONTHNAME1+date.wMonth -1,
-                 result,sizeof(result));
+                               result, resultSize);
                break;
        case ONELETTERAMPM:
                if (date.wHour<12)
@@ -764,7 +765,7 @@
     HFONT oldFont;
     oldFont = SelectObject (hdc, infoPtr->hFont);
 
-    DATETIME_ReturnTxt (infoPtr, 0, txt);
+    DATETIME_ReturnTxt (infoPtr, 0, txt, sizeof(txt));
     GetTextExtentPoint32A (hdc, txt, strlen (txt), &size);
     rcDraw->bottom = size.cy+2;
 
@@ -773,7 +774,7 @@
     prevright = checkbox->right;
 
     for (i=0; i<infoPtr->nrFields; i++) {
-      DATETIME_ReturnTxt (infoPtr, i, txt);
+      DATETIME_ReturnTxt (infoPtr, i, txt, sizeof(txt));
       GetTextExtentPoint32A (hdc, txt, strlen (txt), &size);
       field = & infoPtr->fieldRect[i];
       field->left  = prevright;




More information about the wine-patches mailing list