Index: /branches/rel_ag_9_4_5/sshd/ssh.c
===================================================================
--- /branches/rel_ag_9_4_5/sshd/ssh.c	(revision 20276)
+++ /branches/rel_ag_9_4_5/sshd/ssh.c	(working copy)
@@ -202,6 +202,41 @@
 
 extern int CA_ssh_login(Sensitive *, const char *, struct sockaddr *, struct passwd *, char *);
 
+static int
+valid_hostname(const char *s)
+{
+	size_t i;
+
+	if (*s == '-')
+		return 0;
+	for (i = 0; s[i] != 0; i++) {
+		if (strchr("'`\"$\\;&<>|(){}", s[i]) != NULL ||
+		    isspace((u_char)s[i]) || iscntrl((u_char)s[i]))
+			return 0;
+	}
+	return 1;
+}
+
+static int
+valid_ruser(const char *s)
+{
+	size_t i;
+
+	if (*s == '-')
+		return 0;
+	for (i = 0; s[i] != 0; i++) {
+		if (strchr("'`\";&<>|(){}", s[i]) != NULL)
+			return 0;
+		/* Disallow '-' after whitespace */
+		if (isspace((u_char)s[i]) && s[i + 1] == '-')
+			return 0;
+		/* Disallow \ in last position */
+		if (s[i] == '\\' && s[i + 1] == '\0')
+			return 0;
+	}
+	return 1;
+}
+
 /*
  * Main program for the ssh client.
  */
@@ -555,6 +590,12 @@
 	if (!host)
 		usage();
 
+	if (!valid_hostname(host))
+		fatal("hostname contains invalid characters");
+	if (options.user != NULL && !valid_ruser(options.user))
+		fatal("remote username contains invalid characters");
+ 	// host_arg = xstrdup(host);
+
 	SSLeay_add_all_algorithms();
 	ERR_load_crypto_strings();
 
