Message ID | b55f7eed-1c65-4adc-95d1-6c7c65a54a6e@moroto.mountain (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | proc/vmcore: fix signedness bug in read_from_oldmem() | expand |
On Tue, Jul 25, 2023 at 08:03:16PM +0300, Dan Carpenter wrote: > The bug is the error handling: > > if (tmp < nr_bytes) { > > "tmp" can hold negative error codes but because "nr_bytes" is type > size_t the negative error codes are treated as very high positive > values (success). Fix this by changing "nr_bytes" to type ssize_t. The > "nr_bytes" variable is used to store values between 1 and PAGE_SIZE and > they can fit in ssize_t without any issue. > > Fixes: 5d8de293c224 ("vmcore: convert copy_oldmem_page() to take an iov_iter") > Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org> Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Hi Dan, On 07/25/23 at 08:03pm, Dan Carpenter wrote: > The bug is the error handling: > > if (tmp < nr_bytes) { > > "tmp" can hold negative error codes but because "nr_bytes" is type > size_t the negative error codes are treated as very high positive > values (success). Fix this by changing "nr_bytes" to type ssize_t. The > "nr_bytes" variable is used to store values between 1 and PAGE_SIZE and > they can fit in ssize_t without any issue. > > Fixes: 5d8de293c224 ("vmcore: convert copy_oldmem_page() to take an iov_iter") > Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org> > --- > fs/proc/vmcore.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c > index cb80a7703d58..1fb213f379a5 100644 > --- a/fs/proc/vmcore.c > +++ b/fs/proc/vmcore.c > @@ -132,7 +132,7 @@ ssize_t read_from_oldmem(struct iov_iter *iter, size_t count, > u64 *ppos, bool encrypted) > { > unsigned long pfn, offset; > - size_t nr_bytes; > + ssize_t nr_bytes; > ssize_t read = 0, tmp; > int idx; Thanks for this fix. Just curious, this is found out by code exploring, or any breaking? Acked-by: Baoquan He <bhe@redhat.com>
On Wed, Jul 26, 2023 at 01:56:29PM +0800, Baoquan He wrote: > > Thanks for this fix. Just curious, this is found out by code exploring, > or any breaking? It's from static analysis, looking at when error codes are type promoted to unsigned. I pushed the Smatch check for this yesterday. https://github.com/error27/smatch/commit/a2e6ca07e2ef83a72c9ffa3508af1398a6ecc7ed regards, dan carpenter
On 07/26/23 at 09:03am, Dan Carpenter wrote: > On Wed, Jul 26, 2023 at 01:56:29PM +0800, Baoquan He wrote: > > > > Thanks for this fix. Just curious, this is found out by code exploring, > > or any breaking? > > It's from static analysis, looking at when error codes are type promoted > to unsigned. I pushed the Smatch check for this yesterday. I see, thanks for telling. > > https://github.com/error27/smatch/commit/a2e6ca07e2ef83a72c9ffa3508af1398a6ecc7ed > > regards, > dan carpenter >
diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c index cb80a7703d58..1fb213f379a5 100644 --- a/fs/proc/vmcore.c +++ b/fs/proc/vmcore.c @@ -132,7 +132,7 @@ ssize_t read_from_oldmem(struct iov_iter *iter, size_t count, u64 *ppos, bool encrypted) { unsigned long pfn, offset; - size_t nr_bytes; + ssize_t nr_bytes; ssize_t read = 0, tmp; int idx;
The bug is the error handling: if (tmp < nr_bytes) { "tmp" can hold negative error codes but because "nr_bytes" is type size_t the negative error codes are treated as very high positive values (success). Fix this by changing "nr_bytes" to type ssize_t. The "nr_bytes" variable is used to store values between 1 and PAGE_SIZE and they can fit in ssize_t without any issue. Fixes: 5d8de293c224 ("vmcore: convert copy_oldmem_page() to take an iov_iter") Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org> --- fs/proc/vmcore.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)