Skip to content

Commit 8fa1b45

Browse files
committed
Merge pull request OpenXcom#523 from cfailde/cmndline
Fix crash when invalid user folder is supplied
2 parents b089e05 + 490b0c5 commit 8fa1b45

2 files changed

Lines changed: 67 additions & 50 deletions

File tree

src/Engine/Options.cpp

Lines changed: 65 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -356,61 +356,20 @@ bool init(int argc, char** args)
356356
// Missing data folder is handled in StartState
357357
}
358358
if (_userFolder == "")
359-
{
360-
std::vector<std::string> user = CrossPlatform::findUserFolders();
361-
_configFolder = CrossPlatform::findConfigFolder();
359+
setUserFolder();
362360

363-
// Look for an existing user folder
364-
for (std::vector<std::string>::iterator i = user.begin(); i != user.end(); ++i)
365-
{
366-
if (CrossPlatform::folderExists(*i))
367-
{
368-
_userFolder = *i;
369-
break;
370-
}
371-
}
372-
373-
// Set up folders
374-
if (_userFolder == "")
375-
{
376-
for (std::vector<std::string>::iterator i = user.begin(); i != user.end(); ++i)
377-
{
378-
if (CrossPlatform::createFolder(*i))
379-
{
380-
_userFolder = *i;
381-
break;
382-
}
383-
}
384-
}
385-
if (_configFolder == "")
386-
{
387-
_configFolder = _userFolder;
388-
}
389-
390-
// Load existing options
391-
if (CrossPlatform::folderExists(_configFolder))
392-
{
393-
try
394-
{
395-
load();
396-
}
397-
catch (YAML::Exception &e)
398-
{
399-
Log(LOG_ERROR) << e.what();
400-
}
401-
}
402-
// Create config folder and save options
403-
else
404-
{
405-
CrossPlatform::createFolder(_configFolder);
406-
save();
407-
}
408-
}
409361
std::string s = getUserFolder();
410362
s += "openxcom.log";
411363
Logger::logFile() = s;
412364
FILE *file = fopen(Logger::logFile().c_str(), "w");
413-
fflush(file);
365+
if(!file)
366+
{
367+
std::stringstream error;
368+
error << "Error: invalid User Folder " << _userFolder << std::endl;
369+
std::cout << error.str();
370+
return false;
371+
}
372+
fflush(file);
414373
fclose(file);
415374
Log(LOG_INFO) << "Data folder is: " << _dataFolder;
416375
for (std::vector<std::string>::iterator i = _dataList.begin(); i != _dataList.end(); ++i)
@@ -530,6 +489,62 @@ std::string getUserFolder()
530489
return _userFolder;
531490
}
532491

492+
/**
493+
* Sets up the game's User folder where settings
494+
* and saves are stored in.
495+
*/
496+
void setUserFolder()
497+
{
498+
std::vector<std::string> user = CrossPlatform::findUserFolders();
499+
_configFolder = CrossPlatform::findConfigFolder();
500+
501+
// Look for an existing user folder
502+
for (std::vector<std::string>::iterator i = user.begin(); i != user.end(); ++i)
503+
{
504+
if (CrossPlatform::folderExists(*i))
505+
{
506+
_userFolder = *i;
507+
break;
508+
}
509+
}
510+
511+
// Set up folders
512+
if (_userFolder == "")
513+
{
514+
for (std::vector<std::string>::iterator i = user.begin(); i != user.end(); ++i)
515+
{
516+
if (CrossPlatform::createFolder(*i))
517+
{
518+
_userFolder = *i;
519+
break;
520+
}
521+
}
522+
}
523+
if (_configFolder == "")
524+
{
525+
_configFolder = _userFolder;
526+
}
527+
528+
// Load existing options
529+
if (CrossPlatform::folderExists(_configFolder))
530+
{
531+
try
532+
{
533+
load();
534+
}
535+
catch (YAML::Exception &e)
536+
{
537+
Log(LOG_ERROR) << e.what();
538+
}
539+
}
540+
// Create config folder and save options
541+
else
542+
{
543+
CrossPlatform::createFolder(_configFolder);
544+
save();
545+
}
546+
}
547+
533548
/**
534549
* Returns an option in string format.
535550
* @param id Option ID.

src/Engine/Options.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ namespace Options
5757
std::vector<std::string> *getDataList();
5858
/// Gets the game's user folder.
5959
std::string getUserFolder();
60+
/// Sets the game's user folder.
61+
void setUserFolder();
6062
/// Gets a string option.
6163
std::string getString(const std::string& id);
6264
/// Gets an integer option.

0 commit comments

Comments
 (0)