Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 85356398 authored by Richard Weinberger's avatar Richard Weinberger
Browse files

um: fix ubd cow size



ubd_file_size() cannot use ubd_dev->cow.file because at this time
ubd_dev->cow.file is not initialized.
Therefore, ubd_file_size() will always report a wrong disk size when
COW files are used.
Reading from /dev/ubd* would crash the kernel.

We have to read the correct disk size from the COW file's backing
file.

Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
CC: stable@kernel.org
parent 0d65ede0
Loading
Loading
Loading
Loading
+30 −1
Original line number Diff line number Diff line
@@ -511,8 +511,37 @@ __uml_exitcall(kill_io_thread);
static inline int ubd_file_size(struct ubd *ubd_dev, __u64 *size_out)
{
	char *file;
	int fd;
	int err;

	__u32 version;
	__u32 align;
	char *backing_file;
	time_t mtime;
	unsigned long long size;
	int sector_size;
	int bitmap_offset;

	if (ubd_dev->file && ubd_dev->cow.file) {
		file = ubd_dev->cow.file;

	file = ubd_dev->cow.file ? ubd_dev->cow.file : ubd_dev->file;
		goto out;
	}

	fd = os_open_file(ubd_dev->file, global_openflags, 0);
	if (fd < 0)
		return fd;

	err = read_cow_header(file_reader, &fd, &version, &backing_file, \
		&mtime, &size, &sector_size, &align, &bitmap_offset);
	os_close_file(fd);

	if(err == -EINVAL)
		file = ubd_dev->file;
	else
		file = backing_file;

out:
	return os_file_size(file, size_out);
}