Module Name: src
Committed By: christos
Date: Sat Dec 24 23:48:17 UTC 2011
Modified Files:
src/sbin/route: route.c
Log Message:
PR/45661: Henning Petersen: Overlapping buffer in route.c.
To generate a diff of this commit:
cvs rdiff -u -r1.134 -r1.135 src/sbin/route/route.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sbin/route/route.c
diff -u src/sbin/route/route.c:1.134 src/sbin/route/route.c:1.135
--- src/sbin/route/route.c:1.134 Fri Nov 11 10:09:32 2011
+++ src/sbin/route/route.c Sat Dec 24 18:48:17 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: route.c,v 1.134 2011/11/11 15:09:32 gdt Exp $ */
+/* $NetBSD: route.c,v 1.135 2011/12/24 23:48:17 christos Exp $ */
/*
* Copyright (c) 1983, 1989, 1991, 1993
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1983, 19
#if 0
static char sccsid[] = "@(#)route.c 8.6 (Berkeley) 4/28/95";
#else
-__RCSID("$NetBSD: route.c,v 1.134 2011/11/11 15:09:32 gdt Exp $");
+__RCSID("$NetBSD: route.c,v 1.135 2011/12/24 23:48:17 christos Exp $");
#endif
#endif /* not lint */
@@ -592,18 +592,24 @@ routename(const struct sockaddr *sa, str
{
union mpls_shim ms;
const union mpls_shim *pms;
- int psize = sizeof(struct sockaddr_mpls);
+ size_t psize = sizeof(struct sockaddr_mpls), len;
ms.s_addr =((const struct sockaddr_mpls*)sa)->smpls_addr.s_addr;
ms.s_addr = ntohl(ms.s_addr);
- snprintf(line, sizeof(line), "%u", ms.shim.label);
+ len = snprintf(line, sizeof(line), "%u", ms.shim.label);
+ if (len > sizeof(line))
+ errx(1, "snprintf");
pms = &((const struct sockaddr_mpls*)sa)->smpls_addr;
- while(psize < sa->sa_len) {
+ while (psize < sa->sa_len) {
+ size_t alen;
pms++;
ms.s_addr = ntohl(pms->s_addr);
- snprintf(line, sizeof(line), "%s %u", line,
+ alen = snprintf(line + len, sizeof(line) - len, " %u",
ms.shim.label);
+ if (alen + len > sizeof(line))
+ errx(1, "snprintf");
+ len += alen;
psize += sizeof(ms);
}
break;