From 5eea2566bc6a6bb415735129446e200f978e6066 Mon Sep 17 00:00:00 2001 From: dataisland Date: Mon, 9 Sep 2024 14:25:58 -0500 Subject: [PATCH 1/5] Fix conditional check in SkipSpaces function to prevent out-of-bound access. The `SkipSpaces` function's condition was updated to ensure that the pointer check `in != end` is evaluated before dereferencing the pointer. This change prevents potential out-of-bound access when the input pointer reaches the end. --- include/assimp/ParsingUtils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/assimp/ParsingUtils.h b/include/assimp/ParsingUtils.h index e0ee2d77c..ecd30a0e5 100644 --- a/include/assimp/ParsingUtils.h +++ b/include/assimp/ParsingUtils.h @@ -103,7 +103,7 @@ AI_FORCE_INLINE bool IsSpaceOrNewLine(char_t in) { // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool SkipSpaces(const char_t *in, const char_t **out, const char_t *end) { - while ((*in == (char_t)' ' || *in == (char_t)'\t') && in != end) { + while (in != end && (*in == (char_t)' ' || *in == (char_t)'\t')) { ++in; } *out = in; From cdcd22f86550a25b6fc5c1b9ba5e5dd2ab326958 Mon Sep 17 00:00:00 2001 From: dataisland Date: Mon, 9 Sep 2024 14:35:43 -0500 Subject: [PATCH 2/5] Avoid input is wrong --- include/assimp/ParsingUtils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/assimp/ParsingUtils.h b/include/assimp/ParsingUtils.h index ecd30a0e5..28609f347 100644 --- a/include/assimp/ParsingUtils.h +++ b/include/assimp/ParsingUtils.h @@ -103,7 +103,7 @@ AI_FORCE_INLINE bool IsSpaceOrNewLine(char_t in) { // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool SkipSpaces(const char_t *in, const char_t **out, const char_t *end) { - while (in != end && (*in == (char_t)' ' || *in == (char_t)'\t')) { + while (in >= end && (*in == (char_t)' ' || *in == (char_t)'\t')) { ++in; } *out = in; From 2fcab41c18fe22d33a7ce2b696fa4b3da11cd9a9 Mon Sep 17 00:00:00 2001 From: dataisland Date: Tue, 10 Sep 2024 02:24:43 +0000 Subject: [PATCH 3/5] Fix all in != end --- include/assimp/ParsingUtils.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/assimp/ParsingUtils.h b/include/assimp/ParsingUtils.h index 28609f347..f930ab4ff 100644 --- a/include/assimp/ParsingUtils.h +++ b/include/assimp/ParsingUtils.h @@ -103,7 +103,7 @@ AI_FORCE_INLINE bool IsSpaceOrNewLine(char_t in) { // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool SkipSpaces(const char_t *in, const char_t **out, const char_t *end) { - while (in >= end && (*in == (char_t)' ' || *in == (char_t)'\t')) { + while (in < end && (*in == (char_t)' ' || *in == (char_t)'\t')) { ++in; } *out = in; @@ -119,12 +119,12 @@ AI_FORCE_INLINE bool SkipSpaces(const char_t **inout, const char_t *end) { // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool SkipLine(const char_t *in, const char_t **out, const char_t *end) { - while ((*in != (char_t)'\r' && *in != (char_t)'\n' && *in != (char_t)'\0') && in != end) { + while (in < end && (*in != (char_t)'\r' && *in != (char_t)'\n' && *in != (char_t)'\0')) { ++in; } // files are opened in binary mode. Ergo there are both NL and CR - while ((*in == (char_t)'\r' || *in == (char_t)'\n') && in != end) { + while (in < end && (*in == (char_t)'\r' || *in == (char_t)'\n')) { ++in; } *out = in; @@ -140,7 +140,7 @@ AI_FORCE_INLINE bool SkipLine(const char_t **inout, const char_t *end) { // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool SkipSpacesAndLineEnd(const char_t *in, const char_t **out, const char_t *end) { - while ((*in == (char_t)' ' || *in == (char_t)'\t' || *in == (char_t)'\r' || *in == (char_t)'\n') && in != end) { + while (in < end && (*in == (char_t)' ' || *in == (char_t)'\t' || *in == (char_t)'\r' || *in == (char_t)'\n')) { ++in; } *out = in; From 7697d8c3defa003df5c4abe6951e8a1cf3d6f72f Mon Sep 17 00:00:00 2001 From: dataisland Date: Wed, 11 Sep 2024 03:24:28 +0000 Subject: [PATCH 4/5] Fix some minor bugs --- include/assimp/LineSplitter.h | 4 +++- include/assimp/ParsingUtils.h | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/include/assimp/LineSplitter.h b/include/assimp/LineSplitter.h index 635349dc0..ef487bfc2 100644 --- a/include/assimp/LineSplitter.h +++ b/include/assimp/LineSplitter.h @@ -155,7 +155,7 @@ AI_FORCE_INLINE LineSplitter::LineSplitter(StreamReaderLE& stream, bool skip_emp mSkip_empty_lines(skip_empty_lines), mTrim(trim) { mCur.reserve(1024); - mEnd = mCur.c_str() + 1024; + mEnd = mCur.c_str() + mCur.size(); operator++(); mIdx = 0; } @@ -172,6 +172,7 @@ AI_FORCE_INLINE LineSplitter& LineSplitter::operator++() { char s; mCur.clear(); + mEnd = mCur.c_str() + mCur.size(); while (mStream.GetRemainingSize() && (s = mStream.GetI1(), 1)) { if (s == '\n' || s == '\r') { if (mSkip_empty_lines) { @@ -194,6 +195,7 @@ AI_FORCE_INLINE LineSplitter& LineSplitter::operator++() { break; } mCur += s; + mEnd = mCur.c_str() + mCur.size(); } ++mIdx; diff --git a/include/assimp/ParsingUtils.h b/include/assimp/ParsingUtils.h index f930ab4ff..20d029145 100644 --- a/include/assimp/ParsingUtils.h +++ b/include/assimp/ParsingUtils.h @@ -107,7 +107,7 @@ AI_FORCE_INLINE bool SkipSpaces(const char_t *in, const char_t **out, const char ++in; } *out = in; - return !IsLineEnd(*in); + return in < end && !IsLineEnd(*in); } // --------------------------------------------------------------------------------- @@ -128,7 +128,7 @@ AI_FORCE_INLINE bool SkipLine(const char_t *in, const char_t **out, const char_t ++in; } *out = in; - return *in != (char_t)'\0'; + return in < end && *in != (char_t)'\0'; } // --------------------------------------------------------------------------------- @@ -144,7 +144,7 @@ AI_FORCE_INLINE bool SkipSpacesAndLineEnd(const char_t *in, const char_t **out, ++in; } *out = in; - return *in != '\0'; + return in < end && *in != '\0'; } // --------------------------------------------------------------------------------- From ca1e096ed522287f6e0aae08b4186f61ef17f7d3 Mon Sep 17 00:00:00 2001 From: dataisland Date: Wed, 11 Sep 2024 10:55:35 -0500 Subject: [PATCH 5/5] Change size to capacity --- include/assimp/LineSplitter.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/assimp/LineSplitter.h b/include/assimp/LineSplitter.h index ef487bfc2..84a843898 100644 --- a/include/assimp/LineSplitter.h +++ b/include/assimp/LineSplitter.h @@ -155,7 +155,7 @@ AI_FORCE_INLINE LineSplitter::LineSplitter(StreamReaderLE& stream, bool skip_emp mSkip_empty_lines(skip_empty_lines), mTrim(trim) { mCur.reserve(1024); - mEnd = mCur.c_str() + mCur.size(); + mEnd = mCur.c_str() + mCur.capacity(); operator++(); mIdx = 0; } @@ -172,7 +172,7 @@ AI_FORCE_INLINE LineSplitter& LineSplitter::operator++() { char s; mCur.clear(); - mEnd = mCur.c_str() + mCur.size(); + mEnd = mCur.c_str() + mCur.capacity(); while (mStream.GetRemainingSize() && (s = mStream.GetI1(), 1)) { if (s == '\n' || s == '\r') { if (mSkip_empty_lines) { @@ -195,7 +195,7 @@ AI_FORCE_INLINE LineSplitter& LineSplitter::operator++() { break; } mCur += s; - mEnd = mCur.c_str() + mCur.size(); + mEnd = mCur.c_str() + mCur.capacity(); } ++mIdx;