Re: [PATCH] jfs: Add missing NULL pointer check in __get_metapage

Juerg Haefliger <[email protected]>
Newsgroups gmane.comp.file-systems.jfs.general
Message-ID <778bc3d1-4bf4-ed83-3cc3-19d6efb5cceb__48423.7410863445$1509605980$gmane$org@canonical.com>

On 10/30/2017 11:13 PM, Dave Kleikamp wrote:
> On 10/25/2017 02:50 AM, Juerg Haefliger wrote:
>> Is this a patch you might consider?
> 
> Sorry it's taken me so long to respond.
> 
> I don't think this is the right fix. A failed allocation will still
> result in a null pointer dereference by the caller, __get_metapage(). I
> think the check needs to be put there. Like this:
> 
> --- a/fs/jfs/jfs_metapage.c
> +++ b/fs/jfs/jfs_metapage.c
> @@ -663,6 +663,8 @@ struct metapage *__get_metapage(struct inode *inode,
> unsigned long lblock,
>  	} else {
>  		INCREMENT(mpStat.pagealloc);
>  		mp = alloc_metapage(GFP_NOFS);
> +		if (!mp)
> +			goto unlock;
>  		mp->page = page;
>  		mp->sb = inode->i_sb;
>  		mp->flag = 0;

I don't understand. This is part of the patch that I sent.


> 
> Furthermore, it looks like all the callers of __get_metapage() check for
> a null return, so I'm not sure we need to handle the error at this
> point. I might have to look a bit harder at that, since there are many
> callers.

I don't understand this either :-) Yes, the callers do check for a null
pointer but things blow up (in __get_metapage) before that check without
the above fix.

...Juerg


> 
> Thanks,
> Shaggy
> 
>>
>> Thanks
>> ...Juerg
>>
>>
>> On 10/04/2017 10:24 AM, Juerg Haefliger wrote:
>>> alloc_metapage can return a NULL pointer so check for that. And also emit
>>> an error message if that happens.
>>>
>>> Signed-off-by: Juerg Haefliger <[email protected]>
>>> ---
>>>  fs/jfs/jfs_metapage.c | 20 +++++++++++++-------
>>>  1 file changed, 13 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/fs/jfs/jfs_metapage.c b/fs/jfs/jfs_metapage.c
>>> index 1c4b9ad4d7ab..00f21af66872 100644
>>> --- a/fs/jfs/jfs_metapage.c
>>> +++ b/fs/jfs/jfs_metapage.c
>>> @@ -187,14 +187,18 @@ static inline struct metapage *alloc_metapage(gfp_t gfp_mask)
>>>  {
>>>  	struct metapage *mp = mempool_alloc(metapage_mempool, gfp_mask);
>>>  
>>> -	if (mp) {
>>> -		mp->lid = 0;
>>> -		mp->lsn = 0;
>>> -		mp->data = NULL;
>>> -		mp->clsn = 0;
>>> -		mp->log = NULL;
>>> -		init_waitqueue_head(&mp->wait);
>>> +	if (!mp) {
>>> +		jfs_err("mempool_alloc failed!\n");
>>> +		return NULL;
>>>  	}
>>> +
>>> +	mp->lid = 0;
>>> +	mp->lsn = 0;
>>> +	mp->data = NULL;
>>> +	mp->clsn = 0;
>>> +	mp->log = NULL;
>>> +	init_waitqueue_head(&mp->wait);
>>> +
>>>  	return mp;
>>>  }
>>>  
>>> @@ -663,6 +667,8 @@ struct metapage *__get_metapage(struct inode *inode, unsigned long lblock,
>>>  	} else {
>>>  		INCREMENT(mpStat.pagealloc);
>>>  		mp = alloc_metapage(GFP_NOFS);
>>> +		if (!mp)
>>> +			goto unlock;
>>>  		mp->page = page;
>>>  		mp->sb = inode->i_sb;
>>>  		mp->flag = 0;
>>>

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

_______________________________________________
Jfs-discussion mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jfs-discussion
signature.asc (application/pgp-signature, 845 B)
-----BEGIN PGP SIGNATURE-----

iQI7BAEBCAAlBQJZ+sI9HhxqdWVyZy5oYWVmbGlnZXJAY2Fub25pY2FsLmNvbQAK
CRB1TDqW+fi0jMVgD/wOQQVeGi4AK5VgmDyIOJFMILf3ifAgOFTGDtIxZWFyf/fH
5V1yMkofSQL4KC+YbhXiBjKeElnVgZLQpQkaqI9qfaarGeZIdml6MWg7QVJrxo6Y
qtrsttAiDFRePkAy11FTLvzwLGS31WmPGWXcHdGW7pL7h4SdqB0ylSoyEIgReFsh
jYEt95zMwpC+n9EkTMWYkuFaJqr07WlHEDz2yVw7yIbmGbOS1mi09YL5HnWh8UZU
fpIJKVw/UFKkcO2cVFJ1IZW2CGVZfboiNFoAMN2BmTr8aBv/Q7l9woOdlcRrKXZW
l2Gas3uLsmOPri4LWQtKKJW4rG7Qpc3l/AVcJ8H6oDaVz5NYoDvQ3+j1C9HMJaoy
eEihkJlFiqurxcRXA+p0xXB0WE8NtfY6sVIc/VGTEGOOH1fytlQjhNAjn1Xy4YWB
aP1Nr/L32aCH2xwGwEvER4wnCSfOpdj94+3ZbGFUiB0+NHxIbui69cH00CEEwzkg
qF4DXD1llbcvXZeTddqkZq3axPBRaaQPM9i7mKwbax9YgUKtBe45gHduD2A0icx2
P+iW5wcVnY93w4umYmOjrrb7Jq4NjWj1KcQm4r47YV0WxNW4seTZ2vfpZ9es41Z9
0m9Zs5sZs3KWY7EsGF5iuBuQkHVu+Alc91XOq6kJQprFrhJjllB3sMUbZ0MHMw==
=k8UF
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.