Commit 1bdb8633 authored by Bodo Möller's avatar Bodo Möller
Browse files

New option "-crlf" to s_client and s_server which tells them to convert

LFs into CRLFs when forwarding data from stdin to the TLS connection.
This is necessary for properly talking HTTP.
Because of the code freeze this change is by default disabled for now;
without -DAPPS_CRLF, the code is exactly as before.
parent c97cbcb3
Loading
Loading
Loading
Loading
+39 −1
Original line number Diff line number Diff line
@@ -56,6 +56,9 @@
 * [including the GNU Public Licence.]
 */

#ifdef APPS_CRLF
# include <assert.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -138,6 +141,9 @@ static void sc_usage(void)
	BIO_printf(bio_err," -state        - print the 'ssl' states\n");
#ifdef FIONBIO
	BIO_printf(bio_err," -nbio         - Run with non-blocking IO\n");
#endif
#ifdef APPS_CRLF
	BIO_printf(bio_err," -crlf         - convert LF from terminal into CRLF\n");
#endif
	BIO_printf(bio_err," -quiet        - no s_client output\n");
	BIO_printf(bio_err," -ssl2         - just use SSLv2\n");
@@ -165,6 +171,9 @@ int MAIN(int argc, char **argv)
	char *cert_file=NULL,*key_file=NULL;
	char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
	int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
#ifdef APPS_CRLF
	int crlf=0;
#endif
	int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
	SSL_CTX *ctx=NULL;
	int ret=1,in_init=1,i,nbio_test=0;
@@ -235,6 +244,10 @@ int MAIN(int argc, char **argv)
			if (--argc < 1) goto bad;
			cert_file= *(++argv);
			}
#ifdef APPS_CRLF
		else if	(strcmp(*argv,"-crlf") == 0)
			crlf=1;
#endif
		else if	(strcmp(*argv,"-quiet") == 0)
			c_quiet=1;
		else if	(strcmp(*argv,"-pause") == 0)
@@ -634,6 +647,31 @@ printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240
#ifndef WINDOWS
		else if (FD_ISSET(fileno(stdin),&readfds))
			{
#ifdef APPS_CRLF
			if (crlf)
				{
				int j, lf_num;

				i=read(fileno(stdin),cbuf,BUFSIZZ/2);
				lf_num = 0;
				/* both loops are skipped when i <= 0 */
				for (j = 0; j < i; j++)
					if (cbuf[j] == '\n')
						lf_num++;
				for (j = i-1; j >= 0; j--)
					{
					cbuf[j+lf_num] = cbuf[j];
					if (cbuf[j] == '\n')
						{
						lf_num--;
						i++;
						cbuf[j+lf_num] = '\r';
						}
					}
				assert(lf_num == 0);
				}
			else
#endif
				i=read(fileno(stdin),cbuf,BUFSIZZ);

			if ((!c_quiet) && ((i <= 0) || (cbuf[0] == 'Q')))
+39 −1
Original line number Diff line number Diff line
@@ -56,6 +56,9 @@
 * [including the GNU Public Licence.]
 */

#ifdef APPS_CRLF
# include <assert.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -166,6 +169,9 @@ static char *s_dcert_file=NULL,*s_dkey_file=NULL;
static int s_nbio=0;
#endif
static int s_nbio_test=0;
#ifdef APPS_CRLF
	int s_crlf=0;
#endif
static SSL_CTX *ctx=NULL;
static int www=0;

@@ -213,6 +219,9 @@ static void sv_usage(void)
	BIO_printf(bio_err," -nbio         - Run with non-blocking IO\n");
#endif
	BIO_printf(bio_err," -nbio_test    - test with the non-blocking test bio\n");
#ifdef APPS_CRLF
	BIO_printf(bio_err," -crlf         - convert LF from terminal into CRLF\n");
#endif
	BIO_printf(bio_err," -debug        - Print more output\n");
	BIO_printf(bio_err," -state        - Print the SSL states\n");
	BIO_printf(bio_err," -CApath arg   - PEM format directory of CA's\n");
@@ -516,6 +525,10 @@ int MAIN(int argc, char *argv[])
			{ hack=1; }
		else if	(strcmp(*argv,"-state") == 0)
			{ state=1; }
#ifdef APPS_CRLF
		else if	(strcmp(*argv,"-crlf") == 0)
			{ s_crlf=1; }
#endif
		else if	(strcmp(*argv,"-quiet") == 0)
			{ s_quiet=1; }
		else if	(strcmp(*argv,"-bugs") == 0)
@@ -800,6 +813,31 @@ static int sv_body(char *hostname, int s, unsigned char *context)
		if (i <= 0) continue;
		if (FD_ISSET(fileno(stdin),&readfds))
			{
#ifdef APPS_CRLF
			if (s_crlf)
				{
				int j, lf_num;

				i=read(fileno(stdin), buf, bufsize/2);
				lf_num = 0;
				/* both loops are skipped when i <= 0 */
				for (j = 0; j < i; j++)
					if (buf[j] == '\n')
						lf_num++;
				for (j = i-1; j >= 0; j--)
					{
					buf[j+lf_num] = buf[j];
					if (buf[j] == '\n')
						{
						lf_num--;
						i++;
						buf[j+lf_num] = '\r';
						}
					}
				assert(lf_num == 0);
				}
			else
#endif
				i=read(fileno(stdin),buf,bufsize);
			if (!s_quiet)
				{