| 506 | } |
| 507 | |
| 508 | IOHANDLE OpenFile(const char *pFilename, int Flags, int Type, char *pBuffer = nullptr, int BufferSize = 0) override |
| 509 | { |
| 510 | TranslateType(Type, pFilename); |
| 511 | |
| 512 | dbg_assert((Flags & IOFLAG_WRITE) == 0 || Type == TYPE_SAVE || Type == TYPE_ABSOLUTE, "IOFLAG_WRITE only usable with TYPE_SAVE and TYPE_ABSOLUTE"); |
| 513 | |
| 514 | char aBuffer[IO_MAX_PATH_LENGTH]; |
| 515 | if(!pBuffer) |
| 516 | { |
| 517 | pBuffer = aBuffer; |
| 518 | BufferSize = sizeof(aBuffer); |
| 519 | } |
| 520 | pBuffer[0] = '\0'; |
| 521 | |
| 522 | if(Type == TYPE_ABSOLUTE) |
| 523 | { |
| 524 | return io_open(GetPath(TYPE_ABSOLUTE, pFilename, pBuffer, BufferSize), Flags); |
| 525 | } |
| 526 | |
| 527 | if(str_startswith(pFilename, "mapres/../skins/")) |
| 528 | { |
| 529 | pFilename = pFilename + str_length("mapres/../"); |
| 530 | } |
| 531 | if(pFilename[0] == '/' || pFilename[0] == '\\' || str_find(pFilename, "../") != nullptr || str_find(pFilename, "..\\") != nullptr |
| 532 | #ifdef CONF_FAMILY_WINDOWS |
| 533 | || (pFilename[0] && pFilename[1] == ':') |
| 534 | #endif |
| 535 | ) |
| 536 | { |
| 537 | // don't escape base directory |
| 538 | return nullptr; |
| 539 | } |
| 540 | else if(Type == TYPE_ALL) |
| 541 | { |
| 542 | // check all available directories |
| 543 | for(int i = TYPE_SAVE; i < m_NumPaths; ++i) |
| 544 | { |
| 545 | IOHANDLE Handle = io_open(GetPath(i, pFilename, pBuffer, BufferSize), Flags); |
| 546 | if(Handle) |
| 547 | { |
| 548 | return Handle; |
| 549 | } |
| 550 | } |
| 551 | return nullptr; |
| 552 | } |
| 553 | else if(Type >= TYPE_SAVE && Type < m_NumPaths) |
| 554 | { |
| 555 | // check wanted directory |
| 556 | return io_open(GetPath(Type, pFilename, pBuffer, BufferSize), Flags); |
| 557 | } |
| 558 | else |
| 559 | { |
| 560 | dbg_assert_failed("Type invalid"); |
| 561 | } |
| 562 | } |
| 563 | |
| 564 | template<typename F> |
| 565 | bool GenericExists(const char *pFilename, int Type, F &&CheckFunction) const |
no test coverage detected