mirror of
				https://github.com/libsdl-org/SDL.git
				synced 2025-10-26 12:27:44 +00:00 
			
		
		
		
	os2/SDL_sysfilesystem.c: fix crash if one of the parameters is NULL
Has been happening with testfilesystem from 2.0.6 and newer because of commit 572a721879ef. Also set error strings in certain error conditions. Also applied coding style / whitespace fixes, while I was there.
This commit is contained in:
		| @@ -40,80 +40,88 @@ SDL_GetBasePath(void) | ||||
| { | ||||
|   PTIB       tib; | ||||
|   PPIB       pib; | ||||
|   ULONG      ulRC = DosGetInfoBlocks( &tib, &pib ); | ||||
|   ULONG      ulRC = DosGetInfoBlocks(&tib, &pib); | ||||
|   PCHAR      pcEnd; | ||||
|   ULONG      cbResult; | ||||
|   CHAR       acBuf[_MAX_PATH]; | ||||
|  | ||||
|   if ( ulRC != NO_ERROR ) | ||||
|   { | ||||
|     debug( "DosGetInfoBlocks() failed, rc = %u", ulRC ); | ||||
|   if (ulRC != NO_ERROR) { | ||||
|     debug("DosGetInfoBlocks() failed, rc = %u", ulRC); | ||||
|     return NULL; | ||||
|   } | ||||
|  | ||||
|   pcEnd = SDL_strrchr( pib->pib_pchcmd, '\\' ); | ||||
|   if ( pcEnd != NULL ) | ||||
|   pcEnd = SDL_strrchr(pib->pib_pchcmd, '\\'); | ||||
|   if (pcEnd != NULL) | ||||
|     pcEnd++; | ||||
|   else | ||||
|   { | ||||
|     if ( pib->pib_pchcmd[1] == ':' ) | ||||
|   else { | ||||
|     if (pib->pib_pchcmd[1] == ':') | ||||
|       pcEnd = &pib->pib_pchcmd[2]; | ||||
|     else | ||||
|     else { | ||||
|       SDL_SetError("No path in pib->pib_pchcmd"); | ||||
|       return NULL; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   cbResult = pcEnd - pib->pib_pchcmd; | ||||
|   SDL_memcpy( acBuf, pib->pib_pchcmd, cbResult ); | ||||
|   SDL_memcpy(acBuf, pib->pib_pchcmd, cbResult); | ||||
|   acBuf[cbResult] = '\0'; | ||||
|  | ||||
|   return OS2_SysToUTF8( acBuf ); | ||||
|   return OS2_SysToUTF8(acBuf); | ||||
| } | ||||
|  | ||||
| char * | ||||
| SDL_GetPrefPath(const char *org, const char *app) | ||||
| { | ||||
|   PSZ        pszPath = SDL_getenv( "HOME" ); | ||||
|   PSZ        pszPath; | ||||
|   CHAR       acBuf[_MAX_PATH]; | ||||
|   int        lPosApp, lPosOrg; | ||||
|   PSZ        pszApp, pszOrg = OS2_UTF8ToSys( org ); | ||||
|   PSZ        pszApp, pszOrg; | ||||
|  | ||||
|   if ( pszOrg == NULL ) | ||||
|   { | ||||
|     SDL_OutOfMemory(); | ||||
|     return NULL; | ||||
|   } | ||||
|  | ||||
|   if ( pszPath == NULL ) | ||||
|   { | ||||
|     pszPath = SDL_getenv( "ETC" ); | ||||
|     if ( pszPath == NULL ) | ||||
|   if (!app) { | ||||
|       SDL_InvalidParamError("app"); | ||||
|       return NULL; | ||||
|   } | ||||
|  | ||||
|   lPosApp = SDL_snprintf( acBuf, sizeof(acBuf) - 1, "%s\\%s", pszPath, pszOrg ); | ||||
|   SDL_free( pszOrg ); | ||||
|   if ( lPosApp < 0 ) | ||||
|   pszPath = SDL_getenv( "HOME" ); | ||||
|   if (!pszPath) { | ||||
|     pszPath = SDL_getenv( "ETC" ); | ||||
|     if (!pszPath) { | ||||
|       SDL_SetError("HOME or ETC environment not set"); | ||||
|       return NULL; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   if (!org) { | ||||
|     lPosApp = SDL_snprintf(acBuf, sizeof(acBuf) - 1, "%s", pszPath); | ||||
|   } else { | ||||
|     pszOrg = OS2_UTF8ToSys(org); | ||||
|     if (!pszOrg) { | ||||
|       SDL_OutOfMemory(); | ||||
|       return NULL; | ||||
|     } | ||||
|     lPosApp = SDL_snprintf(acBuf, sizeof(acBuf) - 1, "%s\\%s", pszPath, pszOrg); | ||||
|     SDL_free(pszOrg); | ||||
|   } | ||||
|   if (lPosApp < 0) | ||||
|     return NULL; | ||||
|  | ||||
|   DosCreateDir( acBuf, NULL ); | ||||
|   DosCreateDir(acBuf, NULL); | ||||
|  | ||||
|   pszApp = OS2_UTF8ToSys( app ); | ||||
|   if ( pszApp == NULL ) | ||||
|   { | ||||
|   pszApp = OS2_UTF8ToSys(app); | ||||
|   if (!pszApp) { | ||||
|     SDL_OutOfMemory(); | ||||
|     return NULL; | ||||
|   } | ||||
|  | ||||
|   lPosOrg = SDL_snprintf( &acBuf[lPosApp], sizeof(acBuf) - lPosApp - 1, "\\%s", | ||||
|                           pszApp ); | ||||
|   SDL_free( pszApp ); | ||||
|   if ( lPosOrg < 0 ) | ||||
|   lPosOrg = SDL_snprintf(&acBuf[lPosApp], sizeof(acBuf) - lPosApp - 1, "\\%s", pszApp); | ||||
|   SDL_free(pszApp); | ||||
|   if (lPosOrg < 0) | ||||
|     return NULL; | ||||
|  | ||||
|   DosCreateDir( acBuf, NULL ); | ||||
|   DosCreateDir(acBuf, NULL); | ||||
|   *((PUSHORT)&acBuf[lPosApp + lPosOrg]) = (USHORT)'\0\\'; | ||||
|  | ||||
|   return OS2_SysToUTF8( acBuf ); | ||||
|   return OS2_SysToUTF8(acBuf); | ||||
| } | ||||
|  | ||||
| #endif /* SDL_FILESYSTEM_OS2 */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Ozkan Sezer
					Ozkan Sezer