Bläddra i källkod

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.
Rémi Verschelde 4 år sedan
förälder
incheckning
01d5c463be

+ 1 - 0
core/io/file_access_encrypted.cpp

@@ -257,6 +257,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_length()) {
 	if (pos < get_length()) {
 		for (uint64_t i = 0; i < p_length; i++) {
 		for (uint64_t i = 0; i < p_length; i++) {

+ 1 - 0
core/io/file_access_memory.cpp

@@ -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) {

+ 1 - 0
core/os/file_access.cpp

@@ -551,6 +551,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]);
 	}
 	}

+ 1 - 1
drivers/unix/file_access_unix.cpp

@@ -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);
 }
 }
 
 

+ 1 - 0
drivers/windows/file_access_windows.cpp

@@ -294,6 +294,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) {