All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] ligceph: fix overflow in __decode_pool_names()
@ 2012-04-29  6:59 Xi Wang
  2012-04-29  6:59 ` [PATCH 2/3] libceph: fix overflow in osdmap_decode() Xi Wang
                   ` (2 more replies)
  0 siblings, 3 replies; 12+ messages in thread
From: Xi Wang @ 2012-04-29  6:59 UTC (permalink / raw)
  To: Alex Elder, Sage Weil; +Cc: ceph-devel, Xi Wang

`len' is read from network and thus needs validation.  Otherwise a
large `len' would cause out-of-bounds access via the memcpy() call.
In addition, len = 0xffffffff would overflow the kmalloc() size,
leading to out-of-bounds write.

This patch adds a check of `len' via ceph_decode_need().  Also use
kstrndup rather than kmalloc/memcpy.

Signed-off-by: Xi Wang <xi.wang@gmail.com>
---
 net/ceph/osdmap.c |    9 +++------
 1 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
index 29ad46e..f80afc3 100644
--- a/net/ceph/osdmap.c
+++ b/net/ceph/osdmap.c
@@ -495,15 +495,12 @@ static int __decode_pool_names(void **p, void *end, struct ceph_osdmap *map)
 		ceph_decode_32_safe(p, end, pool, bad);
 		ceph_decode_32_safe(p, end, len, bad);
 		dout("  pool %d len %d\n", pool, len);
+		ceph_decode_need(p, end, len, bad);
 		pi = __lookup_pg_pool(&map->pg_pools, pool);
 		if (pi) {
 			kfree(pi->name);
-			pi->name = kmalloc(len + 1, GFP_NOFS);
-			if (pi->name) {
-				memcpy(pi->name, *p, len);
-				pi->name[len] = '\0';
-				dout("  name is %s\n", pi->name);
-			}
+			pi->name = kstrndup(*p, len, GFP_NOFS);
+			dout("  name is %s\n", pi->name);
 		}
 		*p += len;
 	}
-- 
1.7.5.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2012-06-06 19:20 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-29  6:59 [PATCH 1/3] ligceph: fix overflow in __decode_pool_names() Xi Wang
2012-04-29  6:59 ` [PATCH 2/3] libceph: fix overflow in osdmap_decode() Xi Wang
2012-06-06 16:26   ` Alex Elder
2012-06-06 17:56     ` Xi Wang
2012-06-06 19:14       ` Alex Elder
2012-06-06 19:20         ` Xi Wang
2012-04-29  6:59 ` [PATCH 3/3] libceph: fix overflow in osdmap_apply_incremental() Xi Wang
2012-06-06 16:26   ` Alex Elder
2012-04-29  7:07 ` [PATCH v2 1/3] libceph: fix overflow in __decode_pool_names() Xi Wang
2012-06-06 16:26   ` Alex Elder
2012-06-06 17:54     ` Xi Wang
2012-06-06 19:14       ` Alex Elder

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.