### 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)
p_file = fix_path(p_file);
	PackedData::PackedDir *pd = _find_dir(p_file.get_base_dir());
	if (!pd) {
		return false;
	}
	return pd->files.has(p_file.get_file());
}
bool DirAccessPack::dir_exists(String p_dir) {
	p_dir = fix_path(p_dir);
	return _find_dir(p_dir) != nullptr;
}
Error DirAccessPack::make_dir(String p_dir) {
	return ERR_UNAVAILABLE;
}
Error DirAccessPack::rename(String p_from, String p_to) {
	return ERR_UNAVAILABLE;
}
Error DirAccessPack::remove(String p_name) {
	return ERR_UNAVAILABLE;
}
uint64_t DirAccessPack::get_space_left() {
	return 0;
}
String DirAccessPack::get_filesystem_type() const {
	return "PCK";
}
DirAccessPack::DirAccessPack() {
	current = PackedData::get_singleton()->root;
}