Protect SystemParametersInfoA(SPI_GETxxx) from NULL pvParam

Dmitry Timoshkov dmitry at baikal.ru
Thu Aug 21 04:20:14 CDT 2003


Hello,

Under Windows SystemParametersInfoA(SPI_GETxxx, 0, NULL, 0)
(almost) never crashes, just returns FALSE in that case.

Changelog:
    Dmitry Timoshkov <dmitry at codeweavers.com>
    Protect SystemParametersInfoA(SPI_GETxxx) from NULL pvParam.

--- cvs/hq/wine/windows/sysparams.c	Tue Apr  1 18:53:22 2003
+++ wine/windows/sysparams.c	Thu Aug 21 15:34:11 2003
@@ -561,6 +561,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     switch (uiAction)
     {
     case SPI_GETBEEP:				/*      1 */
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETBEEP_IDX;
         if (!spi_loaded[spi_idx])
         {
@@ -587,6 +589,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
         break;
 
     case SPI_GETMOUSE:                          /*      3 */
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETMOUSE_IDX;
         if (!spi_loaded[spi_idx])
         {
@@ -612,6 +616,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     {
         char buf[10];
 
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETMOUSE_IDX;
         sprintf(buf, "%d", ((INT *)pvParam)[0]);
 
@@ -637,6 +643,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     }
 
     case SPI_GETBORDER:				/*      5 */
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETBORDER_IDX;
         if (!spi_loaded[spi_idx])
         {
@@ -682,6 +690,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     }
 
     case SPI_GETKEYBOARDSPEED:                  /*     10 */
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETKEYBOARDSPEED_IDX;
         if (!spi_loaded[spi_idx])
         {
@@ -760,6 +770,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
 	break;
 
     case SPI_GETSCREENSAVETIMEOUT:              /*     14 */
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETSCREENSAVETIMEOUT_IDX;
         if (!spi_loaded[spi_idx])
         {
@@ -795,6 +807,7 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     }
 
     case SPI_GETSCREENSAVEACTIVE:               /*     16 */
+        if (!pvParam) return FALSE;
 	*(BOOL *)pvParam = USER_Driver.pGetScreenSaveActive();
         break;
 
@@ -812,6 +825,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     }
 
     case SPI_GETGRIDGRANULARITY:                /*     18 */
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETGRIDGRANULARITY_IDX;
         if (!spi_loaded[spi_idx])
         {
@@ -847,8 +862,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     }
 
     case SPI_SETDESKWALLPAPER:			/*     20 */
+        if (!pvParam || !SetDeskWallPaper( (LPSTR)pvParam )) return FALSE;
         SYSPARAMS_Save(SPI_SETDESKWALLPAPER_REGKEY, SPI_SETDESKWALLPAPER_VALNAME, pvParam, fWinIni);
-	ret = SetDeskWallPaper( (LPSTR)pvParam );
 	break;
     case SPI_SETDESKPATTERN:			/*     21 */
 	/* FIXME: the ability to specify a pattern in pvParam
@@ -865,6 +880,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
 	break;
 
     case SPI_GETKEYBOARDDELAY:                  /*     22 */
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETKEYBOARDDELAY_IDX;
         if (!spi_loaded[spi_idx])
         {
@@ -944,6 +961,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
 	break;
 
     case SPI_GETICONTITLEWRAP:                  /*     25 */
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETICONTITLEWRAP_IDX;
         if (!spi_loaded[spi_idx])
         {
@@ -980,6 +999,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     }
 
     case SPI_GETMENUDROPALIGNMENT:              /*     27 */
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETMENUDROPALIGNMENT_IDX;
 
         if (!spi_loaded[spi_idx])
@@ -994,7 +1015,6 @@ BOOL WINAPI SystemParametersInfoA( UINT 
             spi_loaded[spi_idx] = TRUE;
         }
 
-
         *(BOOL *)pvParam = GetSystemMetrics( SM_MENUDROPALIGNMENT );
         break;
 
@@ -1066,6 +1086,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
 	LPLOGFONTA lpLogFont = (LPLOGFONTA)pvParam;
 	LOGFONTA	lfDefault;
 
+        if (!pvParam) return FALSE;
+
 	/*
 	 * The 'default GDI fonts' seems to be returned.
 	 * If a returned font is not a correct font in your environment,
@@ -1133,6 +1155,7 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     WINE_SPI_FIXME(SPI_SETICONTITLELOGFONT);	/*     34 */
 
     case SPI_GETFASTTASKSWITCH:			/*     35 */
+        if (!pvParam) return FALSE;
 	*(BOOL *)pvParam = 1;
         break;
 
@@ -1160,6 +1183,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     }
 
     case SPI_GETDRAGFULLWINDOWS:                /*     38  WINVER >= 0x0400 */
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETDRAGFULLWINDOWS_IDX;
         if (!spi_loaded[spi_idx])
         {
@@ -1178,6 +1203,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     {
 	LPNONCLIENTMETRICSA lpnm = (LPNONCLIENTMETRICSA)pvParam;
 
+        if (!pvParam) return FALSE;
+
 	if (lpnm->cbSize == sizeof(NONCLIENTMETRICSA))
 	{
 	    /* clear the struct, so we have 'sane' members */
@@ -1241,7 +1268,7 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     case SPI_GETMINIMIZEDMETRICS: 		/*     43  WINVER >= 0x400 */
     {
         MINIMIZEDMETRICS * lpMm = pvParam;
-	if (lpMm->cbSize == sizeof(*lpMm))
+	if (lpMm && lpMm->cbSize == sizeof(*lpMm))
 	{
 	    /* these taken from Win2k SP3 */
 	    lpMm->iWidth = 154;
@@ -1282,6 +1309,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
         char buf[20];
         RECT *pr = (RECT *) pvParam;
 
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETWORKAREA_IDX;
         sprintf(buf, "%ld %ld %ld %ld",
                 pr->left, pr->top,
@@ -1300,6 +1329,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     }
 
     case SPI_GETWORKAREA:                       /*     48  WINVER >= 0x400 */
+        if (!pvParam) return FALSE;
+
       spi_idx = SPI_SETWORKAREA_IDX;
       if (!spi_loaded[spi_idx])
       {
@@ -1329,7 +1360,7 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     {
         LPFILTERKEYS lpFilterKeys = (LPFILTERKEYS)pvParam;
         WARN("SPI_GETFILTERKEYS not fully implemented\n");
-        if (lpFilterKeys->cbSize == sizeof(FILTERKEYS))
+        if (lpFilterKeys && lpFilterKeys->cbSize == sizeof(FILTERKEYS))
         {
             /* Indicate that no FilterKeys feature available */
             lpFilterKeys->dwFlags = 0;
@@ -1350,7 +1381,7 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     {
         LPTOGGLEKEYS lpToggleKeys = (LPTOGGLEKEYS)pvParam;
         WARN("SPI_GETTOGGLEKEYS not fully implemented\n");
-        if (lpToggleKeys->cbSize == sizeof(TOGGLEKEYS))
+        if (lpToggleKeys && lpToggleKeys->cbSize == sizeof(TOGGLEKEYS))
         {
             /* Indicate that no ToggleKeys feature available */
             lpToggleKeys->dwFlags = 0;
@@ -1367,7 +1398,7 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     {
         LPMOUSEKEYS lpMouseKeys = (LPMOUSEKEYS)pvParam;
         WARN("SPI_GETMOUSEKEYS not fully implemented\n");
-        if (lpMouseKeys->cbSize == sizeof(MOUSEKEYS))
+        if (lpMouseKeys && lpMouseKeys->cbSize == sizeof(MOUSEKEYS))
         {
             /* Indicate that no MouseKeys feature available */
             lpMouseKeys->dwFlags = 0;
@@ -1386,6 +1417,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     WINE_SPI_FIXME(SPI_SETMOUSEKEYS);		/*     55 */
 
     case SPI_GETSHOWSOUNDS:			/*     56 */
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETSHOWSOUNDS_IDX;
 
         if (!spi_loaded[spi_idx])
@@ -1400,7 +1433,6 @@ BOOL WINAPI SystemParametersInfoA( UINT 
             spi_loaded[spi_idx] = TRUE;
         }
 
-
         *(INT *)pvParam = GetSystemMetrics( SM_SHOWSOUNDS );
         break;
 
@@ -1426,7 +1458,7 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     {
         LPSTICKYKEYS lpStickyKeys = (LPSTICKYKEYS)pvParam;
         WARN("SPI_GETSTICKYKEYS not fully implemented\n");
-        if (lpStickyKeys->cbSize == sizeof(STICKYKEYS))
+        if (lpStickyKeys && lpStickyKeys->cbSize == sizeof(STICKYKEYS))
         {
             /* Indicate that no StickyKeys feature available */
             lpStickyKeys->dwFlags = 0;
@@ -1443,7 +1475,7 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     {
         LPACCESSTIMEOUT lpAccessTimeout = (LPACCESSTIMEOUT)pvParam;
         WARN("SPI_GETACCESSTIMEOUT not fully implemented\n");
-        if (lpAccessTimeout->cbSize == sizeof(ACCESSTIMEOUT))
+        if (lpAccessTimeout && lpAccessTimeout->cbSize == sizeof(ACCESSTIMEOUT))
         {
             /* Indicate that no accessibility features timeout is available */
             lpAccessTimeout->dwFlags = 0;
@@ -1461,7 +1493,7 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     {
         LPSERIALKEYSA lpSerialKeysA = (LPSERIALKEYSA)pvParam;
         WARN("SPI_GETSERIALKEYS not fully implemented\n");
-        if (lpSerialKeysA->cbSize == sizeof(SERIALKEYSA))
+        if (lpSerialKeysA && lpSerialKeysA->cbSize == sizeof(SERIALKEYSA))
         {
             /* Indicate that no SerialKeys feature available */
             lpSerialKeysA->dwFlags = 0;
@@ -1482,7 +1514,7 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     {
         LPSOUNDSENTRYA lpSoundSentryA = (LPSOUNDSENTRYA)pvParam;
         WARN("SPI_GETSOUNDSENTRY not fully implemented\n");
-        if (lpSoundSentryA->cbSize == sizeof(SOUNDSENTRYA))
+        if (lpSoundSentryA && lpSoundSentryA->cbSize == sizeof(SOUNDSENTRYA))
         {
             /* Indicate that no SoundSentry feature available */
             lpSoundSentryA->dwFlags = 0;
@@ -1509,7 +1541,7 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     {
 	LPHIGHCONTRASTA lpHighContrastA = (LPHIGHCONTRASTA)pvParam;
 	WARN("SPI_GETHIGHCONTRAST not fully implemented\n");
-	if (lpHighContrastA->cbSize == sizeof(HIGHCONTRASTA))
+	if (lpHighContrastA && lpHighContrastA->cbSize == sizeof(HIGHCONTRASTA))
 	{
 	    /* Indicate that no high contrast feature available */
 	    lpHighContrastA->dwFlags = 0;
@@ -1524,6 +1556,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     WINE_SPI_FIXME(SPI_SETHIGHCONTRAST);	/*     67  WINVER >= 0x400 */
 
     case SPI_GETKEYBOARDPREF:                   /*     68  WINVER >= 0x400 */
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETKEYBOARDPREF_IDX;
         if (!spi_loaded[spi_idx])
         {
@@ -1557,6 +1591,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     }
 
     case SPI_GETSCREENREADER:                   /*     70  WINVER >= 0x400 */
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETSCREENREADER_IDX;
         if (!spi_loaded[spi_idx])
         {
@@ -1594,7 +1630,7 @@ BOOL WINAPI SystemParametersInfoA( UINT 
 	LPANIMATIONINFO lpAnimInfo = (LPANIMATIONINFO)pvParam;
 
 	/* Tell it "disabled" */
-	if (lpAnimInfo->cbSize == sizeof(ANIMATIONINFO))
+	if (lpAnimInfo && lpAnimInfo->cbSize == sizeof(ANIMATIONINFO))
 	    lpAnimInfo->iMinAnimate = 0; /* Minimise and restore animation is disabled (nonzero == enabled) */
 	else
 	    ret = FALSE;
@@ -1660,27 +1696,32 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     }
 
     case SPI_GETMOUSEHOVERWIDTH:		/*     98  _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
+        if (!pvParam) return FALSE;
 	*(UINT *)pvParam = 4;
 	break;
     WINE_SPI_FIXME(SPI_SETMOUSEHOVERWIDTH);	/*     99  _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
 
     case SPI_GETMOUSEHOVERHEIGHT:		/*    100  _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
+        if (!pvParam) return FALSE;
 	*(UINT *)pvParam = 4;
 	break;
     WINE_SPI_FIXME(SPI_SETMOUSEHOVERHEIGHT);	/*    101  _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
 
     case SPI_GETMOUSEHOVERTIME:			/*    102  _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
+        if (!pvParam) return FALSE;
 	*(UINT *)pvParam = 400; /* default for menu dropdowns */
 	break;
     WINE_SPI_FIXME(SPI_SETMOUSEHOVERTIME);	/*    103  _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
 
     case SPI_GETWHEELSCROLLLINES:		/*    104  _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
+        if (!pvParam) return FALSE;
 	*(UINT *)pvParam = 3; /* default for num scroll lines */
 	break;
 
     WINE_SPI_FIXME(SPI_SETWHEELSCROLLLINES);	/*    105  _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
 
     case SPI_GETMENUSHOWDELAY:                  /*    106  _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
+        if (!pvParam) return FALSE;
         *(UINT *)pvParam = 400; /* Tested against Windows NT 4.0 and Windows 2000 */
         break;
 
@@ -1688,6 +1729,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     WINE_SPI_FIXME(SPI_SETSHOWIMEUI);		/*    111  _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
 
     case SPI_GETSCREENSAVERRUNNING:             /*    114  _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
+        if (!pvParam) return FALSE;
+
         spi_idx = SPI_SETSCREENSAVERRUNNING_IDX;
         if (!spi_loaded[spi_idx])
         {
@@ -1706,6 +1749,8 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     {
 	char buf[MAX_PATH];
 
+        if (!pvParam) return FALSE;
+
         if (uiParam > MAX_PATH)
 	{
 	    uiParam = MAX_PATH;
@@ -1734,6 +1779,7 @@ BOOL WINAPI SystemParametersInfoA( UINT 
     WINE_SPI_FIXME(SPI_SETLISTBOXSMOOTHSCROLLING);/* 0x1007  _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
 
     case SPI_GETGRADIENTCAPTIONS:    /* 0x1008  _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
+        if (!pvParam) return FALSE;
         FIXME("case SPI_GETGRADIENTCAPTIONS always return false\n");
         *(BOOL *)pvParam = FALSE;
         break;






More information about the wine-patches mailing list