diff options
author | millert <millert@openbsd.org> | 2020-05-21 15:38:05 +0000 |
---|---|---|
committer | Gilles Chehade <gilles@poolp.org> | 2020-05-21 21:06:37 +0200 |
commit | 3cd16ecd7ae83a4ba093f5376f5c4ea229316790 (patch) | |
tree | 8c5c4896773cf10306211ec44c6cadb88a5a2ed7 | |
parent | tmp move (diff) | |
download | OpenSMTPD-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.c | 18 |
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 |