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:
Ozkan Sezer 2020-10-14 23:01:03 +03:00
parent 222f026899
commit 5d89217f6b

View File

@ -45,8 +45,7 @@ SDL_GetBasePath(void)
ULONG cbResult; ULONG cbResult;
CHAR acBuf[_MAX_PATH]; CHAR acBuf[_MAX_PATH];
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{
debug("DosGetInfoBlocks() failed, rc = %u", ulRC); debug("DosGetInfoBlocks() failed, rc = %u", ulRC);
return NULL; return NULL;
} }
@ -54,13 +53,14 @@ SDL_GetBasePath(void)
pcEnd = SDL_strrchr(pib->pib_pchcmd, '\\'); pcEnd = SDL_strrchr(pib->pib_pchcmd, '\\');
if (pcEnd != NULL) if (pcEnd != NULL)
pcEnd++; pcEnd++;
else else {
{
if (pib->pib_pchcmd[1] == ':') if (pib->pib_pchcmd[1] == ':')
pcEnd = &pib->pib_pchcmd[2]; pcEnd = &pib->pib_pchcmd[2];
else else {
SDL_SetError("No path in pib->pib_pchcmd");
return NULL; return NULL;
} }
}
cbResult = pcEnd - pib->pib_pchcmd; cbResult = pcEnd - pib->pib_pchcmd;
SDL_memcpy(acBuf, pib->pib_pchcmd, cbResult); SDL_memcpy(acBuf, pib->pib_pchcmd, cbResult);
@ -72,40 +72,48 @@ SDL_GetBasePath(void)
char * char *
SDL_GetPrefPath(const char *org, const char *app) SDL_GetPrefPath(const char *org, const char *app)
{ {
PSZ pszPath = SDL_getenv( "HOME" ); PSZ pszPath;
CHAR acBuf[_MAX_PATH]; CHAR acBuf[_MAX_PATH];
int lPosApp, lPosOrg; int lPosApp, lPosOrg;
PSZ pszApp, pszOrg = OS2_UTF8ToSys( org ); PSZ pszApp, pszOrg;
if ( pszOrg == NULL ) if (!app) {
{ SDL_InvalidParamError("app");
return NULL;
}
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(); SDL_OutOfMemory();
return NULL; return NULL;
} }
if ( pszPath == NULL )
{
pszPath = SDL_getenv( "ETC" );
if ( pszPath == NULL )
return NULL;
}
lPosApp = SDL_snprintf(acBuf, sizeof(acBuf) - 1, "%s\\%s", pszPath, pszOrg); lPosApp = SDL_snprintf(acBuf, sizeof(acBuf) - 1, "%s\\%s", pszPath, pszOrg);
SDL_free(pszOrg); SDL_free(pszOrg);
}
if (lPosApp < 0) if (lPosApp < 0)
return NULL; return NULL;
DosCreateDir(acBuf, NULL); DosCreateDir(acBuf, NULL);
pszApp = OS2_UTF8ToSys(app); pszApp = OS2_UTF8ToSys(app);
if ( pszApp == NULL ) if (!pszApp) {
{
SDL_OutOfMemory(); SDL_OutOfMemory();
return NULL; return NULL;
} }
lPosOrg = SDL_snprintf( &acBuf[lPosApp], sizeof(acBuf) - lPosApp - 1, "\\%s", lPosOrg = SDL_snprintf(&acBuf[lPosApp], sizeof(acBuf) - lPosApp - 1, "\\%s", pszApp);
pszApp );
SDL_free(pszApp); SDL_free(pszApp);
if (lPosOrg < 0) if (lPosOrg < 0)
return NULL; return NULL;