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

Commit 990e9dc3 authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

x86/ldt: Make all size computations unsigned



ldt->size can never be negative. The helper functions take 'unsigned int'
arguments which are assigned from ldt->size. The related user space
user_desc struct member entry_number is unsigned as well.

But ldt->size itself and a few local variables which are related to
ldt->size are type 'int' which makes no sense whatsoever and results in
typecasts which make the eyes bleed.

Clean it up and convert everything which is related to ldt->size to
unsigned it.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
Cc: Dan Carpenter <dan.carpenter@oracle.com>
parent 296dc580
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -2299,7 +2299,7 @@ valid_user_frame(const void __user *fp, unsigned long size)
static unsigned long get_segment_base(unsigned int segment)
static unsigned long get_segment_base(unsigned int segment)
{
{
	struct desc_struct *desc;
	struct desc_struct *desc;
	int idx = segment >> 3;
	unsigned int idx = segment >> 3;


	if ((segment & SEGMENT_TI_MASK) == SEGMENT_LDT) {
	if ((segment & SEGMENT_TI_MASK) == SEGMENT_LDT) {
#ifdef CONFIG_MODIFY_LDT_SYSCALL
#ifdef CONFIG_MODIFY_LDT_SYSCALL
+1 −1
Original line number Original line Diff line number Diff line
@@ -47,7 +47,7 @@ struct ldt_struct {
	 * allocations, but it's not worth trying to optimize.
	 * allocations, but it's not worth trying to optimize.
	 */
	 */
	struct desc_struct *entries;
	struct desc_struct *entries;
	int size;
	unsigned int size;
};
};


/*
/*
+5 −5
Original line number Original line Diff line number Diff line
@@ -37,7 +37,7 @@ static void flush_ldt(void *current_mm)
static struct ldt_struct *alloc_ldt_struct(unsigned int size)
static struct ldt_struct *alloc_ldt_struct(unsigned int size)
{
{
	struct ldt_struct *new_ldt;
	struct ldt_struct *new_ldt;
	int alloc_size;
	unsigned int alloc_size;


	if (size > LDT_ENTRIES)
	if (size > LDT_ENTRIES)
		return NULL;
		return NULL;
@@ -207,11 +207,11 @@ static int read_default_ldt(void __user *ptr, unsigned long bytecount)
static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode)
static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode)
{
{
	struct mm_struct *mm = current->mm;
	struct mm_struct *mm = current->mm;
	struct ldt_struct *new_ldt, *old_ldt;
	unsigned int oldsize, newsize;
	struct user_desc ldt_info;
	struct desc_struct ldt;
	struct desc_struct ldt;
	int error;
	int error;
	struct user_desc ldt_info;
	int oldsize, newsize;
	struct ldt_struct *new_ldt, *old_ldt;


	error = -EINVAL;
	error = -EINVAL;
	if (bytecount != sizeof(ldt_info))
	if (bytecount != sizeof(ldt_info))
@@ -249,7 +249,7 @@ static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode)


	old_ldt = mm->context.ldt;
	old_ldt = mm->context.ldt;
	oldsize = old_ldt ? old_ldt->size : 0;
	oldsize = old_ldt ? old_ldt->size : 0;
	newsize = max((int)(ldt_info.entry_number + 1), oldsize);
	newsize = max(ldt_info.entry_number + 1, oldsize);


	error = -ENOMEM;
	error = -ENOMEM;
	new_ldt = alloc_ldt_struct(newsize);
	new_ldt = alloc_ldt_struct(newsize);