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:
parent
6ce63017d5
commit
32047ffd9c
5 changed files with 5 additions and 1 deletions
|
@ -239,6 +239,7 @@ Error FileAccessEncrypted::get_error() const {
|
||||||
|
|
||||||
void FileAccessEncrypted::store_buffer(const uint8_t *p_src, uint64_t p_length) {
|
void FileAccessEncrypted::store_buffer(const uint8_t *p_src, uint64_t p_length) {
|
||||||
ERR_FAIL_COND_MSG(!writing, "File has not been opened in write mode.");
|
ERR_FAIL_COND_MSG(!writing, "File has not been opened in write mode.");
|
||||||
|
ERR_FAIL_COND(!p_src && p_length > 0);
|
||||||
|
|
||||||
if (pos < get_len()) {
|
if (pos < get_len()) {
|
||||||
for (uint64_t i = 0; i < p_length; i++) {
|
for (uint64_t i = 0; i < p_length; i++) {
|
||||||
|
|
|
@ -168,6 +168,7 @@ void FileAccessMemory::store_8(uint8_t p_byte) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileAccessMemory::store_buffer(const uint8_t *p_src, uint64_t p_length) {
|
void FileAccessMemory::store_buffer(const uint8_t *p_src, uint64_t p_length) {
|
||||||
|
ERR_FAIL_COND(!p_src && p_length > 0);
|
||||||
uint64_t left = length - pos;
|
uint64_t left = length - pos;
|
||||||
uint64_t write = MIN(p_length, left);
|
uint64_t write = MIN(p_length, left);
|
||||||
if (write < p_length) {
|
if (write < p_length) {
|
||||||
|
|
|
@ -548,6 +548,7 @@ void FileAccess::store_csv_line(const Vector<String> &p_values, const String &p_
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileAccess::store_buffer(const uint8_t *p_src, uint64_t p_length) {
|
void FileAccess::store_buffer(const uint8_t *p_src, uint64_t p_length) {
|
||||||
|
ERR_FAIL_COND(!p_src && p_length > 0);
|
||||||
for (uint64_t i = 0; i < p_length; i++) {
|
for (uint64_t i = 0; i < p_length; i++) {
|
||||||
store_8(p_src[i]);
|
store_8(p_src[i]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -264,7 +264,7 @@ void FileAccessUnix::store_8(uint8_t p_dest) {
|
||||||
|
|
||||||
void FileAccessUnix::store_buffer(const uint8_t *p_src, uint64_t p_length) {
|
void FileAccessUnix::store_buffer(const uint8_t *p_src, uint64_t p_length) {
|
||||||
ERR_FAIL_COND_MSG(!f, "File must be opened before use.");
|
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(fwrite(p_src, 1, p_length, f) != p_length);
|
ERR_FAIL_COND(fwrite(p_src, 1, p_length, f) != p_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -287,6 +287,7 @@ void FileAccessWindows::store_8(uint8_t p_dest) {
|
||||||
|
|
||||||
void FileAccessWindows::store_buffer(const uint8_t *p_src, uint64_t p_length) {
|
void FileAccessWindows::store_buffer(const uint8_t *p_src, uint64_t p_length) {
|
||||||
ERR_FAIL_COND(!f);
|
ERR_FAIL_COND(!f);
|
||||||
|
ERR_FAIL_COND(!p_src && p_length > 0);
|
||||||
if (flags == READ_WRITE || flags == WRITE_READ) {
|
if (flags == READ_WRITE || flags == WRITE_READ) {
|
||||||
if (prev_op == READ) {
|
if (prev_op == READ) {
|
||||||
if (last_error != ERR_FILE_EOF) {
|
if (last_error != ERR_FILE_EOF) {
|
||||||
|
|
Loading…
Reference in a new issue