Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1420386
| From | Ben Hutchings <ben@decadent.org.uk> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH 3.2 42/46] get_rock_ridge_filename(): handle malformed NM entries |
| Date | 2016-06-12 23:50 +0200 |
| Message-ID | <rJlqz-5ve-69@gated-at.bofh.it> (permalink) |
| References | <rJlgS-5q8-5@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
3.2.81-rc1 review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <viro@zeniv.linux.org.uk>
commit 99d825822eade8d827a1817357cbf3f889a552d6 upstream.
Payloads of NM entries are not supposed to contain NUL. When we run
into such, only the part prior to the first NUL goes into the
concatenation (i.e. the directory entry name being encoded by a bunch
of NM entries). We do stop when the amount collected so far + the
claimed amount in the current NM entry exceed 254. So far, so good,
but what we return as the total length is the sum of *claimed*
sizes, not the actual amount collected. And that can grow pretty
large - not unlimited, since you'd need to put CE entries in
between to be able to get more than the maximum that could be
contained in one isofs directory entry / continuation chunk and
we are stop once we'd encountered 32 CEs, but you can get about 8Kb
easily. And that's what will be passed to readdir callback as the
name length. 8Kb __copy_to_user() from a buffer allocated by
__get_free_page()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
---
fs/isofs/rock.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
--- a/fs/isofs/rock.c
+++ b/fs/isofs/rock.c
@@ -203,6 +203,8 @@ int get_rock_ridge_filename(struct iso_d
int retnamlen = 0;
int truncate = 0;
int ret = 0;
+ char *p;
+ int len;
if (!ISOFS_SB(inode->i_sb)->s_rock)
return 0;
@@ -267,12 +269,17 @@ repeat:
rr->u.NM.flags);
break;
}
- if ((strlen(retname) + rr->len - 5) >= 254) {
+ len = rr->len - 5;
+ if (retnamlen + len >= 254) {
truncate = 1;
break;
}
- strncat(retname, rr->u.NM.name, rr->len - 5);
- retnamlen += rr->len - 5;
+ p = memchr(rr->u.NM.name, '\0', len);
+ if (unlikely(p))
+ len = p - rr->u.NM.name;
+ memcpy(retname + retnamlen, rr->u.NM.name, len);
+ retnamlen += len;
+ retname[retnamlen] = '\0';
break;
case SIG('R', 'E'):
kfree(rs.buffer);
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH 3.2 00/46] 3.2.81-rc1 review Ben Hutchings <ben@decadent.org.uk> - 2016-06-12 23:50 +0200
[PATCH 3.2 05/46] crypto: gcm - fix rfc4543 to handle async crypto correctly Ben Hutchings <ben@decadent.org.uk> - 2016-06-12 23:50 +0200
[PATCH 3.2 17/46] usb: hcd: out of bounds access in for_each_companion Ben Hutchings <ben@decadent.org.uk> - 2016-06-12 23:50 +0200
[PATCH 3.2 15/46] usb: xhci: fix wild pointers in xhci_mem_cleanup Ben Hutchings <ben@decadent.org.uk> - 2016-06-12 23:50 +0200
[PATCH 3.2 42/46] get_rock_ridge_filename(): handle malformed NM entries Ben Hutchings <ben@decadent.org.uk> - 2016-06-12 23:50 +0200
[PATCH 3.2 23/46] s390/hugetlb: add hugepages_supported define Ben Hutchings <ben@decadent.org.uk> - 2016-06-12 23:50 +0200
Re: [PATCH 3.2 00/46] 3.2.81-rc1 review Guenter Roeck <linux@roeck-us.net> - 2016-06-13 01:20 +0200
Re: [PATCH 3.2 00/46] 3.2.81-rc1 review Ben Hutchings <ben@decadent.org.uk> - 2016-06-13 01:50 +0200
Re: [PATCH 3.2 00/46] 3.2.81-rc1 review Sudip Mukherjee <sudipm.mukherjee@gmail.com> - 2016-06-15 00:00 +0200
Re: [PATCH 3.2 00/46] 3.2.81-rc1 review Ben Hutchings <ben@decadent.org.uk> - 2016-06-15 00:20 +0200
Re: [PATCH 3.2 00/46] 3.2.81-rc1 review Sudip Mukherjee <sudipm.mukherjee@gmail.com> - 2016-06-15 00:40 +0200
csiph-web