Not like fault_in_readable() or fault_in_writeable(), in
fault_in_safe_writeable() local variable 'start' is increased page
by page to loop till the whole address range is handled. However,
it mistakenly calcalates the size of handled range with 'uaddr - start'.
Fix it here.
Signed-off-by: Baoquan He <bhe@redhat.com>
---
v1->v2:
- Fix a patch log typo caused by copy-and-paste error. Thanks
to Yanjun.
mm/gup.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mm/gup.c b/mm/gup.c
index 855ab860f88b..73777b1de679 100644
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -2207,8 +2207,8 @@ size_t fault_in_safe_writeable(const char __user *uaddr, size_t size)
} while (start != end);
mmap_read_unlock(mm);
- if (size > (unsigned long)uaddr - start)
- return size - ((unsigned long)uaddr - start);
+ if (size > start - (unsigned long)uaddr)
+ return size - (start - (unsigned long)uaddr);
return 0;
}
EXPORT_SYMBOL(fault_in_safe_writeable);
--
2.41.0
On 31.03.25 10:13, Baoquan He wrote: > Not like fault_in_readable() or fault_in_writeable(), in > fault_in_safe_writeable() local variable 'start' is increased page > by page to loop till the whole address range is handled. However, > it mistakenly calcalates the size of handled range with 'uaddr - start'. > > Fix it here. Fixes: ? Do we know of user-visible effects? > > Signed-off-by: Baoquan He <bhe@redhat.com> > --- > v1->v2: > - Fix a patch log typo caused by copy-and-paste error. Thanks > to Yanjun. > > mm/gup.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/mm/gup.c b/mm/gup.c > index 855ab860f88b..73777b1de679 100644 > --- a/mm/gup.c > +++ b/mm/gup.c > @@ -2207,8 +2207,8 @@ size_t fault_in_safe_writeable(const char __user *uaddr, size_t size) > } while (start != end); > mmap_read_unlock(mm); > > - if (size > (unsigned long)uaddr - start) > - return size - ((unsigned long)uaddr - start); > + if (size > start - (unsigned long)uaddr) > + return size - (start - (unsigned long)uaddr); > return 0; > } > EXPORT_SYMBOL(fault_in_safe_writeable); Can we instead just use the uaddr and start variables like in fault_in_readable? That is, turn "start" into a const and adjust uaddr instead. (maybe we should also handle the types of these variables similar to as in fault_in_readable) -- Cheers, David / dhildenb
On 04/01/25 at 10:10am, David Hildenbrand wrote: > On 31.03.25 10:13, Baoquan He wrote: > > Not like fault_in_readable() or fault_in_writeable(), in > > fault_in_safe_writeable() local variable 'start' is increased page > > by page to loop till the whole address range is handled. However, > > it mistakenly calcalates the size of handled range with 'uaddr - start'. > > > > Fix it here. > > Fixes: ? Do we know of user-visible effects? I believe it should impact, while I didn't hear of any complaint. Yeah, it's worth to have one Fixes. > > > > > Signed-off-by: Baoquan He <bhe@redhat.com> > > --- > > v1->v2: > > - Fix a patch log typo caused by copy-and-paste error. Thanks > > to Yanjun. > > > > mm/gup.c | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > diff --git a/mm/gup.c b/mm/gup.c > > index 855ab860f88b..73777b1de679 100644 > > --- a/mm/gup.c > > +++ b/mm/gup.c > > @@ -2207,8 +2207,8 @@ size_t fault_in_safe_writeable(const char __user *uaddr, size_t size) > > } while (start != end); > > mmap_read_unlock(mm); > > - if (size > (unsigned long)uaddr - start) > > - return size - ((unsigned long)uaddr - start); > > + if (size > start - (unsigned long)uaddr) > > + return size - (start - (unsigned long)uaddr); > > return 0; > > } > > EXPORT_SYMBOL(fault_in_safe_writeable); > > Can we instead just use the uaddr and start variables like in > fault_in_readable? > > That is, turn "start" into a const and adjust uaddr instead. Sounds good to me, that makes these similar blocks own consistent code style. Will change in v3. Thanks for reviewing. > > (maybe we should also handle the types of these variables similar to as in > fault_in_readable) > > -- > Cheers, > > David / dhildenb >
On Tue, Apr 01, 2025 at 10:10:03AM +0200, David Hildenbrand wrote: > On 31.03.25 10:13, Baoquan He wrote: > > --- a/mm/gup.c > > +++ b/mm/gup.c > > @@ -2207,8 +2207,8 @@ size_t fault_in_safe_writeable(const char __user *uaddr, size_t size) > > } while (start != end); > > mmap_read_unlock(mm); > > - if (size > (unsigned long)uaddr - start) > > - return size - ((unsigned long)uaddr - start); > > + if (size > start - (unsigned long)uaddr) > > + return size - (start - (unsigned long)uaddr); > > return 0; > > } > > EXPORT_SYMBOL(fault_in_safe_writeable); > > Can we instead just use the uaddr and start variables like in > fault_in_readable? > > That is, turn "start" into a const and adjust uaddr instead. Yes, I think that would be much cleaner. Otherwise, this looks good to me. -- Oscar Salvador SUSE Labs
On 04/01/25 at 04:00pm, Oscar Salvador wrote: > On Tue, Apr 01, 2025 at 10:10:03AM +0200, David Hildenbrand wrote: > > On 31.03.25 10:13, Baoquan He wrote: > > > --- a/mm/gup.c > > > +++ b/mm/gup.c > > > @@ -2207,8 +2207,8 @@ size_t fault_in_safe_writeable(const char __user *uaddr, size_t size) > > > } while (start != end); > > > mmap_read_unlock(mm); > > > - if (size > (unsigned long)uaddr - start) > > > - return size - ((unsigned long)uaddr - start); > > > + if (size > start - (unsigned long)uaddr) > > > + return size - (start - (unsigned long)uaddr); > > > return 0; > > > } > > > EXPORT_SYMBOL(fault_in_safe_writeable); > > > > Can we instead just use the uaddr and start variables like in > > fault_in_readable? > > > > That is, turn "start" into a const and adjust uaddr instead. > > Yes, I think that would be much cleaner. > > Otherwise, this looks good to me. Will change in v3 as both of you suggested, thanks for reviewing this v2 series.
© 2016 - 2025 Red Hat, Inc.