From b53c57c4d0aeac6f8f1aa9737927ff60fff8e4d5 Mon Sep 17 00:00:00 2001 From: Jeremie Courreges-Anglas Date: Sun, 13 Oct 2019 15:07:14 +0000 Subject: Factor out socket cleanup code As a side effect this shuts down the TLS connection before closing the underlying socket for redirectionss. ok job@ --- usr.bin/ftp/fetch.c | 57 +++++++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 26 deletions(-) (limited to 'usr.bin/ftp/fetch.c') diff --git a/usr.bin/ftp/fetch.c b/usr.bin/ftp/fetch.c index 552eaee2fe1..6f87ea58a45 100644 --- a/usr.bin/ftp/fetch.c +++ b/usr.bin/ftp/fetch.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fetch.c,v 1.172 2019/10/09 16:43:22 jca Exp $ */ +/* $OpenBSD: fetch.c,v 1.173 2019/10/13 15:07:13 jca Exp $ */ /* $NetBSD: fetch.c,v 1.14 1997/08/18 10:20:20 lukem Exp $ */ /*- @@ -76,6 +76,7 @@ char *recode_credentials(const char *_userinfo); int ftp_printf(FILE *, struct tls *, const char *, ...) __attribute__((format(printf, 3, 4))); char *ftp_readline(FILE *, struct tls *, size_t *); size_t ftp_read(FILE *, struct tls *, char *, size_t); +void ftp_close(FILE **fin, struct tls **tls, volatile int *fd); #ifndef NOSSL int proxy_connect(int, char *, char *); int SSL_vprintf(struct tls *, const char *, va_list); @@ -919,14 +920,7 @@ noslash: *loctail = '\0'; if (verbose) fprintf(ttyout, "Redirected to %s\n", redirurl); - if (fin != NULL) { - fclose(fin); - fin = NULL; - } - if (fd != -1) { - close(fd); - fd = -1; - } + ftp_close(&fin, &tls, &fd); rval = url_get(redirurl, proxyenv, savefile, lastfile); free(redirurl); goto cleanup_url_get; @@ -1063,26 +1057,10 @@ improper: cleanup_url_get: #ifndef NOSSL - if (tls != NULL) { - if (tls_session_fd != -1) - dprintf(STDERR_FILENO, "tls session resumed: %s\n", - tls_conn_session_resumed(tls) ? "yes" : "no"); - do { - i = tls_close(tls); - } while (i == TLS_WANT_POLLIN || i == TLS_WANT_POLLOUT); - tls_free(tls); - } free(full_host); free(sslhost); #endif /* !NOSSL */ - if (fin != NULL) { - fclose(fin); - fin = NULL; - } - if (fd != -1) { - close(fd); - fd = -1; - } + ftp_close(&fin, &tls, &fd); if (out >= 0 && out != fileno(stdout)) close(out); free(buf); @@ -1594,6 +1572,33 @@ ftp_printf(FILE *fp, struct tls *tls, const char *fmt, ...) return (ret); } +void +ftp_close(FILE **fin, struct tls **tls, volatile int *fd) +{ +#ifndef NOSSL + int ret; + + if (*tls != NULL) { + if (tls_session_fd != -1) + dprintf(STDERR_FILENO, "tls session resumed: %s\n", + tls_conn_session_resumed(*tls) ? "yes" : "no"); + do { + ret = tls_close(*tls); + } while (ret == TLS_WANT_POLLIN || ret == TLS_WANT_POLLOUT); + tls_free(*tls); + *tls = NULL; + } +#endif + if (*fin != NULL) { + fclose(*fin); + *fin = NULL; + } + if (*fd != -1) { + close(*fd); + *fd = -1; + } +} + #ifndef NOSSL int SSL_vprintf(struct tls *tls, const char *fmt, va_list ap) -- cgit v1.2.3