Fix: Add security asserts.

pull/5004/head
Kim Kulling 2023-03-10 08:48:11 +01:00 committed by GitHub
parent c82a6d05b0
commit 63dae0a7f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 33 additions and 22 deletions

View File

@ -47,48 +47,59 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <assimp/cfileio.h> #include <assimp/cfileio.h>
#include <assimp/IOStream.hpp> #include <assimp/IOStream.hpp>
#include <assimp/IOSystem.hpp> #include <assimp/IOSystem.hpp>
#include <assimp/ai_assert.h>
namespace Assimp { namespace Assimp {
class CIOSystemWrapper; class CIOSystemWrapper;
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// Custom IOStream implementation for the C-API /// @brief Custom IOStream implementation for the C-API-
class CIOStreamWrapper : public IOStream { // ------------------------------------------------------------------------------------------------
class CIOStreamWrapper final : public IOStream {
public: public:
explicit CIOStreamWrapper(aiFile *pFile, CIOSystemWrapper *io) : explicit CIOStreamWrapper(aiFile *pFile, CIOSystemWrapper *io);
mFile(pFile), ~CIOStreamWrapper() override;
mIO(io) {} size_t Read(void *pvBuffer, size_t pSize, size_t pCount) override;
~CIOStreamWrapper(void); size_t Write(const void *pvBuffer, size_t pSize, size_t pCount) override;
aiReturn Seek(size_t pOffset, aiOrigin pOrigin) override;
size_t Read(void *pvBuffer, size_t pSize, size_t pCount); size_t Tell(void) const override;
size_t Write(const void *pvBuffer, size_t pSize, size_t pCount); size_t FileSize() const override;
aiReturn Seek(size_t pOffset, aiOrigin pOrigin); void Flush() override;
size_t Tell(void) const;
size_t FileSize() const;
void Flush();
private: private:
aiFile *mFile; aiFile *mFile;
CIOSystemWrapper *mIO; CIOSystemWrapper *mIO;
}; };
class CIOSystemWrapper : public IOSystem { inline CIOStreamWrapper::CIOStreamWrapper(aiFile *pFile, CIOSystemWrapper *io) :
mFile(pFile),
mIO(io) {
ai_assert(io != nullptr);
}
// ------------------------------------------------------------------------------------------------
/// @brief Custom IO-System wrapper implementation for the C-API.
// ------------------------------------------------------------------------------------------------
class CIOSystemWrapper final : public IOSystem {
friend class CIOStreamWrapper; friend class CIOStreamWrapper;
public: public:
explicit CIOSystemWrapper(aiFileIO *pFile) : explicit CIOSystemWrapper(aiFileIO *pFile);
mFileSystem(pFile) {} ~CIOSystemWrapper() override = default;
bool Exists(const char *pFile) const override;
bool Exists(const char *pFile) const; char getOsSeparator() const override;
char getOsSeparator() const; IOStream *Open(const char *pFile, const char *pMode = "rb") override;
IOStream *Open(const char *pFile, const char *pMode = "rb"); void Close(IOStream *pFile) override;
void Close(IOStream *pFile);
private: private:
aiFileIO *mFileSystem; aiFileIO *mFileSystem;
}; };
inline CIOSystemWrapper::CIOSystemWrapper(aiFileIO *pFile) : mFileSystem(pFile) {
ai_assert(pFile != nullptr);
}
} // namespace Assimp } // namespace Assimp
#endif #endif // AI_CIOSYSTEM_H_INCLUDED