FileAccess: Don't err in `store_buffer` with buffer of size 0

The error check was added for `FileAccessUnix` but it's not an error when both
`p_src` and `p_length` are zero.

Added correct error checks to all implementations to prevent the actual
erroneous case: `p_src` is nullptr but `p_length > 0` (risk of null pointer
indexing).

Fixes #33564.

(cherry picked from commit 01d5c463be)
This commit is contained in:
Rémi Verschelde 2021-06-07 18:31:50 +02:00
parent 6a98050afa
commit 089fde5c59
No known key found for this signature in database
GPG Key ID: C3336907360768E1
5 changed files with 5 additions and 3 deletions

View File

@ -258,6 +258,7 @@ Error FileAccessEncrypted::get_error() const {
void FileAccessEncrypted::store_buffer(const uint8_t *p_src, int p_length) {
ERR_FAIL_COND_MSG(!writing, "File has not been opened in write mode.");
ERR_FAIL_COND(!p_src && p_length > 0);
if (pos < data.size()) {

View File

@ -184,7 +184,7 @@ void FileAccessMemory::store_8(uint8_t p_byte) {
}
void FileAccessMemory::store_buffer(const uint8_t *p_src, int p_length) {
ERR_FAIL_COND(!p_src && p_length > 0);
int left = length - pos;
int write = MIN(p_length, left);
if (write < p_length) {

View File

@ -591,7 +591,7 @@ void FileAccess::store_csv_line(const Vector<String> &p_values, const String &p_
}
void FileAccess::store_buffer(const uint8_t *p_src, int p_length) {
ERR_FAIL_COND(!p_src && p_length > 0);
for (int i = 0; i < p_length; i++)
store_8(p_src[i]);
}

View File

@ -276,7 +276,7 @@ void FileAccessUnix::store_8(uint8_t p_dest) {
void FileAccessUnix::store_buffer(const uint8_t *p_src, int p_length) {
ERR_FAIL_COND_MSG(!f, "File must be opened before use.");
ERR_FAIL_COND(!p_src);
ERR_FAIL_COND(!p_src && p_length > 0);
ERR_FAIL_COND((int)fwrite(p_src, 1, p_length, f) != p_length);
}

View File

@ -302,6 +302,7 @@ void FileAccessWindows::store_8(uint8_t p_dest) {
void FileAccessWindows::store_buffer(const uint8_t *p_src, int p_length) {
ERR_FAIL_COND(!f);
ERR_FAIL_COND(!p_src && p_length > 0);
if (flags == READ_WRITE || flags == WRITE_READ) {
if (prev_op == READ) {
if (last_error != ERR_FILE_EOF) {