Author: eugen
Date: Mon Mar 12 17:37:38 2018
New Revision: 330805
URL: https://svnweb.freebsd.org/changeset/base/330805
Log:
MFC r329105: ppp(8): fix code producing debugging logs
ppp(8): fix code producing debugging logs
Fix several cases when long buffer is copied to shorter one
using snprintf that results in contents truncation and
clobbering unsaved errno value and creation of misleading logs.
PR: 218517
Approved by: mav (mentor)
Modified:
stable/10/usr.sbin/ppp/defs.h
stable/10/usr.sbin/ppp/iface.c
stable/10/usr.sbin/ppp/ip.c
stable/10/usr.sbin/ppp/ipv6cp.c
stable/10/usr.sbin/ppp/ncpaddr.c
stable/10/usr.sbin/ppp/route.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/usr.sbin/ppp/defs.h
==
--- stable/10/usr.sbin/ppp/defs.h Mon Mar 12 17:36:37 2018
(r330804)
+++ stable/10/usr.sbin/ppp/defs.h Mon Mar 12 17:37:38 2018
(r330805)
@@ -117,6 +117,8 @@
#define ROUNDUP(x) ((x) ? (1 + (((x) - 1) | (sizeof(long) - 1))) :
sizeof(long))
+#define NCP_ASCIIBUFFERSIZE52
+
#ifdef __NetBSD__
extern void randinit(void);
#else
Modified: stable/10/usr.sbin/ppp/iface.c
==
--- stable/10/usr.sbin/ppp/iface.c Mon Mar 12 17:36:37 2018
(r330804)
+++ stable/10/usr.sbin/ppp/iface.c Mon Mar 12 17:37:38 2018
(r330805)
@@ -209,7 +209,7 @@ iface_addr_Zap(const char *name, struct iface_addr *ad
#endif
struct sockaddr_in *me4, *msk4, *peer4;
struct sockaddr_storage ssme, sspeer, ssmsk;
- int res;
+ int res, saved_errno;
ncprange_getsa(>ifa, , );
ncpaddr_getsa(>peer, );
@@ -235,8 +235,9 @@ iface_addr_Zap(const char *name, struct iface_addr *ad
memcpy(peer4, , sizeof *peer4);
res = ID0ioctl(s, SIOCDIFADDR, );
+saved_errno = errno;
if (log_IsKept(LogDEBUG)) {
- char buf[100];
+ char buf[NCP_ASCIIBUFFERSIZE];
snprintf(buf, sizeof buf, "%s", ncprange_ntoa(>ifa));
log_Printf(LogWARN, "%s: DIFADDR %s -> %s returns %d\n",
@@ -260,12 +261,13 @@ iface_addr_Zap(const char *name, struct iface_addr *ad
ifra6.ifra_lifetime.ia6t_pltime = ND6_INFINITE_LIFETIME;
res = ID0ioctl(s, SIOCDIFADDR_IN6, );
+saved_errno = errno;
break;
#endif
}
if (res == -1) {
-char dst[40];
+char dst[NCP_ASCIIBUFFERSIZE];
const char *end =
#ifndef NOINET6
ncprange_family(>ifa) == AF_INET6 ? "_IN6" :
@@ -274,11 +276,11 @@ iface_addr_Zap(const char *name, struct iface_addr *ad
if (ncpaddr_family(>peer) == AF_UNSPEC)
log_Printf(LogWARN, "iface rm: ioctl(SIOCDIFADDR%s, %s): %s\n",
- end, ncprange_ntoa(>ifa), strerror(errno));
+ end, ncprange_ntoa(>ifa), strerror(saved_errno));
else {
snprintf(dst, sizeof dst, "%s", ncpaddr_ntoa(>peer));
log_Printf(LogWARN, "iface rm: ioctl(SIOCDIFADDR%s, %s -> %s): %s\n",
- end, ncprange_ntoa(>ifa), dst, strerror(errno));
+ end, ncprange_ntoa(>ifa), dst, strerror(saved_errno));
}
}
@@ -294,7 +296,7 @@ iface_addr_Add(const char *name, struct iface_addr *ad
#endif
struct sockaddr_in *me4, *msk4, *peer4;
struct sockaddr_storage ssme, sspeer, ssmsk;
- int res;
+ int res, saved_errno;
ncprange_getsa(>ifa, , );
ncpaddr_getsa(>peer, );
@@ -320,8 +322,9 @@ iface_addr_Add(const char *name, struct iface_addr *ad
memcpy(peer4, , sizeof *peer4);
res = ID0ioctl(s, SIOCAIFADDR, );
+saved_errno = errno;
if (log_IsKept(LogDEBUG)) {
- char buf[100];
+ char buf[NCP_ASCIIBUFFERSIZE];
snprintf(buf, sizeof buf, "%s", ncprange_ntoa(>ifa));
log_Printf(LogWARN, "%s: AIFADDR %s -> %s returns %d\n",
@@ -345,12 +348,13 @@ iface_addr_Add(const char *name, struct iface_addr *ad
ifra6.ifra_lifetime.ia6t_pltime = ND6_INFINITE_LIFETIME;
res = ID0ioctl(s, SIOCAIFADDR_IN6, );
+saved_errno = errno;
break;
#endif
}
if (res == -1) {
-char dst[40];
+char dst[NCP_ASCIIBUFFERSIZE];
const char *end =
#ifndef NOINET6
ncprange_family(>ifa) == AF_INET6 ? "_IN6" :
@@ -359,11 +363,11 @@ iface_addr_Add(const char *name, struct iface_addr *ad
if (ncpaddr_family(>peer) == AF_UNSPEC)
log_Printf(LogWARN, "iface add: ioctl(SIOCAIFADDR%s, %s): %s\n",
- end, ncprange_ntoa(>ifa), strerror(errno));
+ end, ncprange_ntoa(>ifa), strerror(saved_errno));
else {
snprintf(dst, sizeof dst, "%s", ncpaddr_ntoa(>peer));
log_Printf(LogWARN, "iface add: ioctl(SIOCAIFADDR%s, %s -> %s): %s\n",
- end, ncprange_ntoa(>ifa), dst, strerror(errno));
+ end, ncprange_ntoa(>ifa), dst, strerror(saved_errno));
}
}
Modified: stable/10/usr.sbin/ppp/ip.c