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: Thomas 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>
This commit is contained in:
parent
296dc5806d
commit
990e9dc381
@ -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
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user