### Tested versions

4.2.stable (exported only)

### System information

Linux

### Issue description

This line is the bug:

https://github.com/godotengine/godot/blob/a311a4b162364d032b03ddf2a0e603ba40615ad7/core/io/file_access_pack.cpp#L330

`p_length` is the buffer length provided by the user, but this line does not check if the result is bigger than the length of the file.

As a result, when user tries to get a buffer that is bigger than the file (something like `file.get_buffer(99999999)`), `file.get_position()` may be bigger than `file.get_length()`.

It doesn't break Godot directly, but breaks any calculations based on `get_position()`. For example, it breaks relative seeking.

There is another variable `t_read` which is checked and should probably be used instead:

https://github.com/godotengine/godot/blob/a311a4b162364d032b03ddf2a0e603ba40615ad7/core/io/file_access_pack.cpp#L324-L328

### Steps to reproduce

Since this is a bug in `FileAccessPack`, it is only reproducible in **exported** projects (something like `FileAccessUnix` doesn't have this bug, so it can't be reproduced in the editor).

To reproduce, try to `file.get_buffer(99999999)` and then use `file.get_position()` for something.

### Minimal reproduction project (MRP)

I made a simple script that attempts to make a relative seeking and breaks because of this bug:

[FileAccessPackTest.zip](https://github.com/godotengine/godot/files/13615040/FileAccessPackTest.zip)
for (int i = 0; i < sources.size(); i++) {
		if (sources[i]->try_open_pack(p_path, p_replace_files, p_offset)) {
			return OK;
		}
	}
	return ERR_FILE_UNRECOGNIZED;
}
void PackedData::add_path(const String &p_pkg_path, const String &p_path, uint64_t p_ofs, uint64_t p_size, const uint8_t *p_md5, PackSource *p_src, bool p_replace_files, bool p_encrypted) {
	String simplified_path = p_path.simplify_path();
	PathMD5 pmd5(simplified_path.md5_buffer());
	bool exists = files.has(pmd5);
	PackedFile pf;
	pf.encrypted = p_encrypted;
	pf.pack = p_pkg_path;
	pf.offset = p_ofs;
	pf.size = p_size;
	for (int i = 0; i < 16; i++) {
		pf.md5[i] = p_md5[i];
	}
	pf.src = p_src;
	if (!exists || p_replace_files) {
		files[pmd5] = pf;
	}
	if (!exists) {
		
		String p = simplified_path.replace_first("res://", "");
		PackedDir *cd = root;
		if (p.contains("/")) { 
			Vector<String> ds = p.get_base_dir().split("/");
			for (int j = 0; j < ds.size(); j++) {