aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormillert <millert@openbsd.org>2020-05-21 15:38:05 +0000
committerGilles Chehade <gilles@poolp.org>2020-05-21 21:06:37 +0200
commit3cd16ecd7ae83a4ba093f5376f5c4ea229316790 (patch)
tree8c5c4896773cf10306211ec44c6cadb88a5a2ed7
parenttmp move (diff)
downloadOpenSMTPD-3cd16ecd7ae83a4ba093f5376f5c4ea229316790.tar.xz
OpenSMTPD-3cd16ecd7ae83a4ba093f5376f5c4ea229316790.zip
Correct getsockname(2)/getpeername(2) usage.
Fixes an uninitialized variable and a potential stack overflow with IPv6 connections. From Leah Neukirchen; OK eric@ deraadt@
-rw-r--r--usr.sbin/smtpd/mta_session.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/usr.sbin/smtpd/mta_session.c b/usr.sbin/smtpd/mta_session.c
index 632f5be7..ad1c3c84 100644
--- a/usr.sbin/smtpd/mta_session.c
+++ b/usr.sbin/smtpd/mta_session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mta_session.c,v 1.135 2020/04/24 11:34:07 eric Exp $ */
+/* $OpenBSD: mta_session.c,v 1.136 2020/05/21 15:38:05 millert Exp $ */
/*
* Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -1811,21 +1811,25 @@ mta_filter_end(struct mta_session *s)
static void
mta_connected(struct mta_session *s)
{
- struct sockaddr sa_src;
- struct sockaddr sa_dest;
+ struct sockaddr_storage sa_src;
+ struct sockaddr_storage sa_dest;
int sa_len;
log_info("%016"PRIx64" mta connected", s->id);
- if (getsockname(io_fileno(s->io), &sa_src, &sa_len) == -1)
+ sa_len = sizeof sa_src;
+ if (getsockname(io_fileno(s->io),
+ (struct sockaddr *)&sa_src, &sa_len) == -1)
bzero(&sa_src, sizeof sa_src);
- if (getpeername(io_fileno(s->io), &sa_dest, &sa_len) == -1)
+ sa_len = sizeof sa_dest;
+ if (getpeername(io_fileno(s->io),
+ (struct sockaddr *)&sa_dest, &sa_len) == -1)
bzero(&sa_dest, sizeof sa_dest);
mta_report_link_connect(s,
s->route->dst->ptrname, 1,
- (struct sockaddr_storage *)&sa_src,
- (struct sockaddr_storage *)&sa_dest);
+ &sa_src,
+ &sa_dest);
}
static void