From b02570228737f8db4ca664f65e65bf8cb686c230 Mon Sep 17 00:00:00 2001
From: Matt O'Gorman <mogorman@digium.com>
Date: Sat, 11 Nov 2006 02:12:27 +0000
Subject: [PATCH] safe terminal output is sweet.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@47491 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 include/asterisk/term.h |  2 ++
 main/logger.c           | 10 ++++++++--
 main/term.c             | 28 ++++++++++++++++++++++++++++
 3 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/include/asterisk/term.h b/include/asterisk/term.h
index f3c41d8eb9..3b454ce2c4 100644
--- a/include/asterisk/term.h
+++ b/include/asterisk/term.h
@@ -59,6 +59,8 @@ char *term_color_code(char *outbuf, int fgcolor, int bgcolor, int maxout);
 
 char *term_strip(char *outbuf, char *inbuf, int maxout);
 
+void term_filter_escapes(char *line);
+
 char *term_prompt(char *outbuf, const char *inbuf, int maxout);
 
 char *term_prep(void);
diff --git a/main/logger.c b/main/logger.c
index 95a768dbd9..660fb2f741 100644
--- a/main/logger.c
+++ b/main/logger.c
@@ -716,8 +716,10 @@ void ast_log(int level, const char *file, int line, const char *function, const
 			va_start(ap, fmt);
 			res = ast_dynamic_str_thread_set_va(&buf, BUFSIZ, &log_buf, fmt, ap);
 			va_end(ap);
-			if (res != AST_DYNSTR_BUILD_FAILED)
+			if (res != AST_DYNSTR_BUILD_FAILED) {
+				term_filter_escapes(buf->str);
 				fputs(buf->str, stdout);
+			}
 		}
 		return;
 	}
@@ -781,7 +783,8 @@ void ast_log(int level, const char *file, int line, const char *function, const
 					term_color(tmp2, file, COLOR_BRWHITE, 0, sizeof(tmp2)),
 					term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)),
 					term_color(tmp4, function, COLOR_BRWHITE, 0, sizeof(tmp4)));
-
+				/*filter to the console!*/
+				term_filter_escapes(buf->str);
 				ast_console_puts_mutable(buf->str);
 				
 				va_start(ap, fmt);
@@ -892,6 +895,9 @@ void ast_verbose(const char *fmt, ...)
 
 	if (res == AST_DYNSTR_BUILD_FAILED)
 		return;
+	
+	/* filter out possibly hazardous escape sequences */
+	term_filter_escapes(buf->str);
 
 	AST_LIST_LOCK(&verbosers);
 	AST_LIST_TRAVERSE(&verbosers, v, list)
diff --git a/main/term.c b/main/term.c
index a38399eda4..e92a27077f 100644
--- a/main/term.c
+++ b/main/term.c
@@ -264,6 +264,34 @@ char *term_prompt(char *outbuf, const char *inbuf, int maxout)
 	return outbuf;
 }
 
+
+/* filter escape sequences */
+void term_filter_escapes(char *line)
+ {
+	 int i;
+   
+	 for (i=0; i < strlen(line); i++) {
+		 if (line[i] == ESC) {					 
+			 if (line[i+1] == '\x5b') {
+				 switch (line[i+2]) {
+				 	case '\x30':
+						 break;
+					 case '\x31':
+						 break;
+					 case '\x33':
+						 break;
+					 default:
+						 /* replace ESC with a space */
+						 line[i] = ' ';
+				 }
+			 } else {
+				 /* replace ESC with a space */
+				 line[i] = ' ';
+			 }
+		 } 
+	 }
+ }
+
 char *term_prep(void)
 {
 	return prepdata;
-- 
GitLab