From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759110AbbFBPKw (ORCPT ); Tue, 2 Jun 2015 11:10:52 -0400 Received: from cantor2.suse.de ([195.135.220.15]:42587 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753759AbbFBPKo (ORCPT ); Tue, 2 Jun 2015 11:10:44 -0400 From: Jan Kara To: Linus Torvalds Cc: Andrew Morton , LKML , Jan Kara Subject: [PATCH 1/2] lib: Fix strnlen_user() to not touch memory after specified maximum Date: Tue, 2 Jun 2015 17:10:28 +0200 Message-Id: <1433257829-1743-1-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.1.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If the specified maximum length of the string is a multiple of unsigned long, we would load one long behind the specified maximum. If that happens to be in a next page, we can hit a page fault although we were not expected to. Fix the off-by-one bug in the test whether we are at the end of the specified range. CC: Linus Torvalds Signed-off-by: Jan Kara --- lib/strnlen_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/strnlen_user.c b/lib/strnlen_user.c index a28df5206d95..fd03ae980013 100644 --- a/lib/strnlen_user.c +++ b/lib/strnlen_user.c @@ -57,7 +57,7 @@ static inline long do_strnlen_user(const char __user *src, unsigned long count, return res + find_zero(data) + 1 - align; } res += sizeof(unsigned long); - if (unlikely(max < sizeof(unsigned long))) + if (unlikely(max <= sizeof(unsigned long))) break; max -= sizeof(unsigned long); if (unlikely(__get_user(c,(unsigned long __user *)(src+res)))) -- 2.1.4