Fix buffer overflow in __pmDecodeNameReq routine
authorNathan Scott <nathans@redhat.com>
Mon, 13 Aug 2012 01:28:43 +0000 (11:28 +1000)
committerNathan Scott <nathans@redhat.com>
Mon, 13 Aug 2012 01:28:43 +0000 (11:28 +1000)
DecodeNameReq does not check the namelen field against the PDU size.
This can lead to a crash.

Original report and fixes reviewed by Florian Weimer of the Red Hat
Security team.  Red Hat bugzilla bug #841180.

Security advisory CVE-2012-3418.

src/libpcp/src/p_pmns.c

index 6a93d0b..e361e88 100644 (file)
@@ -494,16 +494,26 @@ static int
 DecodeNameReq(__pmPDU *pdubuf, char **name_p, int *subtype)
 {
     namereq_t  *namereq_pdu;
+    char       *pdu_end;
     char       *name;
     int                namelen;
 
     namereq_pdu = (namereq_t *)pdubuf;
+    pdu_end = (char *)pdubuf + namereq_pdu->hdr.len;
+
+    if (pdu_end - (char *)namereq_pdu < sizeof(namereq_t) - sizeof(int))
+       return PM_ERR_IPC;
 
     /* only set it if you want it */
     if (subtype != NULL)
        *subtype = ntohl(namereq_pdu->subtype);
-
     namelen = ntohl(namereq_pdu->namelen);
+
+    if (namelen < 0 || namelen > namereq_pdu->hdr.len)
+       return PM_ERR_IPC;
+    if (sizeof(namereq_t) - sizeof(int) + namelen > (size_t)(pdu_end - (char *)namereq_pdu))
+       return PM_ERR_IPC;
+
     name = malloc(namelen+1);
     if (name == NULL)
        return -oserror();