### 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)
Vector<uint8_t> key;
		key.resize(32);
		for (int i = 0; i < key.size(); i++) {
			key.write[i] = script_encryption_key[i];
		}
		Error err = fae->open_and_parse(f, key, FileAccessEncrypted::MODE_READ, false);
		ERR_FAIL_COND_V_MSG(err, false, "Can't open encrypted pack directory.");
		f = fae;
	}
	for (int i = 0; i < file_count; i++) {
		uint32_t sl = f->get_32();
		CharString cs;
		cs.resize(sl + 1);
		f->get_buffer((uint8_t *)cs.ptr(), sl);
		cs[sl] = 0;
		String path;
		path.parse_utf8(cs.ptr());
		uint64_t ofs = file_base + f->get_64();
		uint64_t size = f->get_64();
		uint8_t md5[16];
		f->get_buffer(md5, 16);
		uint32_t flags = f->get_32();
		PackedData::get_singleton()->add_path(p_path, path, ofs + p_offset, size, md5, this, p_replace_files, (flags & PACK_FILE_ENCRYPTED));
	}
	return true;
}
Ref<FileAccess> PackedSourcePCK::get_file(const String &p_path, PackedData::PackedFile *p_file) {
	return memnew(FileAccessPack(p_path, *p_file));
}
Error FileAccessPack::open_internal(const String &p_path, int p_mode_flags) {