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

Commit 652d703b authored by Srivatsa S. Bhat's avatar Srivatsa S. Bhat Committed by Greg Kroah-Hartman
Browse files

char_dev: Fix off-by-one bugs in find_dynamic_major()



CHRDEV_MAJOR_DYN_END and CHRDEV_MAJOR_DYN_EXT_END are valid major
numbers. So fix the loop iteration to include them in the search for
free major numbers.

While at it, also remove a redundant if condition ("cd->major != i"),
as it will never be true.

Signed-off-by: default avatarSrivatsa S. Bhat <srivatsa@csail.mit.edu>
Reviewed-by: default avatarLogan Gunthorpe <logang@deltatee.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent bd329f02
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -67,18 +67,18 @@ static int find_dynamic_major(void)
	int i;
	struct char_device_struct *cd;

	for (i = ARRAY_SIZE(chrdevs)-1; i > CHRDEV_MAJOR_DYN_END; i--) {
	for (i = ARRAY_SIZE(chrdevs)-1; i >= CHRDEV_MAJOR_DYN_END; i--) {
		if (chrdevs[i] == NULL)
			return i;
	}

	for (i = CHRDEV_MAJOR_DYN_EXT_START;
	     i > CHRDEV_MAJOR_DYN_EXT_END; i--) {
	     i >= CHRDEV_MAJOR_DYN_EXT_END; i--) {
		for (cd = chrdevs[major_to_index(i)]; cd; cd = cd->next)
			if (cd->major == i)
				break;

		if (cd == NULL || cd->major != i)
		if (cd == NULL)
			return i;
	}