diff options
| author | Jesper Juhl <jj@chaosbits.net> | 2011-01-17 13:41:50 -0500 |
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2011-01-25 15:24:46 -0500 |
| commit | ad3d2eedf0ed3611f5f86b9e4d0d15cc76c63465 (patch) | |
| tree | f391bedf2b6ca950a6c41644f3b469457b4bc57b /fs | |
| parent | 0da2a4ac33c291728d8be5bdb865467dcb078d13 (diff) | |
NFS4: Avoid potential NULL pointer dereference in decode_and_add_ds().
On Mon, 17 Jan 2011, Mi Jinlong wrote:
>
>
> Jesper Juhl:
> > strrchr() can return NULL if nothing is found. If this happens we'll
> > dereference a NULL pointer in
> > fs/nfs/nfs4filelayoutdev.c::decode_and_add_ds().
> >
> > I tried to find some other code that guarantees that this can never
> > happen but I was unsuccessful. So, unless someone else can point to some
> > code that ensures this can never be a problem, I believe this patch is
> > needed.
> >
> > While I was changing this code I also noticed that all the dprintk()
> > statements, except one, start with "%s:". The one missing the ":" I added
> > it to.
>
> Maybe another one also should be changed at decode_and_add_ds() at line 243:
>
> 243 printk("%s Decoded address and port %s\n", __func__, buf);
>
Missed that one. Thanks.
Signed-off-by: Jesper Juhl <jj@chaosbits.net>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/nfs/nfs4filelayoutdev.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c index 51fe64ace55a..f5c9b125e8cc 100644 --- a/fs/nfs/nfs4filelayoutdev.c +++ b/fs/nfs/nfs4filelayoutdev.c | |||
| @@ -214,7 +214,7 @@ decode_and_add_ds(__be32 **pp, struct inode *inode) | |||
| 214 | 214 | ||
| 215 | /* ipv6 length plus port is legal */ | 215 | /* ipv6 length plus port is legal */ |
| 216 | if (rlen > INET6_ADDRSTRLEN + 8) { | 216 | if (rlen > INET6_ADDRSTRLEN + 8) { |
| 217 | dprintk("%s Invalid address, length %d\n", __func__, | 217 | dprintk("%s: Invalid address, length %d\n", __func__, |
| 218 | rlen); | 218 | rlen); |
| 219 | goto out_err; | 219 | goto out_err; |
| 220 | } | 220 | } |
| @@ -225,6 +225,11 @@ decode_and_add_ds(__be32 **pp, struct inode *inode) | |||
| 225 | /* replace the port dots with dashes for the in4_pton() delimiter*/ | 225 | /* replace the port dots with dashes for the in4_pton() delimiter*/ |
| 226 | for (i = 0; i < 2; i++) { | 226 | for (i = 0; i < 2; i++) { |
| 227 | char *res = strrchr(buf, '.'); | 227 | char *res = strrchr(buf, '.'); |
| 228 | if (!res) { | ||
| 229 | dprintk("%s: Failed finding expected dots in port\n", | ||
| 230 | __func__); | ||
| 231 | goto out_free; | ||
| 232 | } | ||
| 228 | *res = '-'; | 233 | *res = '-'; |
| 229 | } | 234 | } |
| 230 | 235 | ||
| @@ -240,7 +245,7 @@ decode_and_add_ds(__be32 **pp, struct inode *inode) | |||
| 240 | port = htons((tmp[0] << 8) | (tmp[1])); | 245 | port = htons((tmp[0] << 8) | (tmp[1])); |
| 241 | 246 | ||
| 242 | ds = nfs4_pnfs_ds_add(inode, ip_addr, port); | 247 | ds = nfs4_pnfs_ds_add(inode, ip_addr, port); |
| 243 | dprintk("%s Decoded address and port %s\n", __func__, buf); | 248 | dprintk("%s: Decoded address and port %s\n", __func__, buf); |
| 244 | out_free: | 249 | out_free: |
| 245 | kfree(buf); | 250 | kfree(buf); |
| 246 | out_err: | 251 | out_err: |
