[xen staging] xenconsole: add option to avoid escape sequences in log

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[xen staging] xenconsole: add option to avoid escape sequences in log

patchbot
commit deb0e164dee2ffb92846d3046452930e6fc3b384
Author:     Marek Marczykowski-Górecki <[hidden email]>
AuthorDate: Tue Jul 31 05:15:32 2018 +0200
Commit:     Wei Liu <[hidden email]>
CommitDate: Wed Aug 1 10:23:24 2018 +0100

    xenconsole: add option to avoid escape sequences in log
   
    Add --replace-escape option to xenconsoled, which replaces ESC with
    '.' in console output written to log file. This makes it slightly safer
    to do tail -f on a console output of untrusted guest.
    The pty output is unaffected by this option.
   
    Signed-off-by: Marek Marczykowski-Górecki <[hidden email]>
    Acked-by: Wei Liu <[hidden email]>
    [ wei: move variables into a narrower scope ]
    Signed-off-by: Wei Liu <[hidden email]>
---
 tools/console/daemon/io.c   | 27 ++++++++++++++++++++++++++-
 tools/console/daemon/main.c |  8 +++++++-
 2 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c
index e22009aa39..8dac279bbb 100644
--- a/tools/console/daemon/io.c
+++ b/tools/console/daemon/io.c
@@ -68,6 +68,7 @@ extern int log_time_hv;
 extern int log_time_guest;
 extern char *log_dir;
 extern int discard_overflowed_data;
+extern int replace_escape;
 
 static int log_time_hv_needts = 1;
 static int log_time_guest_needts = 1;
@@ -227,10 +228,34 @@ static inline int console_iter_int_arg3(struct domain *d,
  return ret;
 }
 
+static void do_replace_escape(const char *src, char *dest, int len)
+{
+ int i;
+
+ for (i = 0; i < len; i++) {
+ if (src[i] == '\033')
+ dest[i] = '.';
+ else
+ dest[i] = src[i];
+ }
+}
+
 static int write_all(int fd, const char* buf, size_t len)
 {
  while (len) {
- ssize_t ret = write(fd, buf, len);
+ ssize_t ret;
+ if (replace_escape) {
+ char buf_replaced[1024];
+ size_t this_round;
+
+ if (len > sizeof(buf_replaced))
+ this_round = sizeof(buf_replaced);
+ else
+ this_round = len;
+ do_replace_escape(buf, buf_replaced, this_round);
+ ret = write(fd, buf_replaced, this_round);
+ } else
+ ret = write(fd, buf, len);
  if (ret == -1 && errno == EINTR)
  continue;
  if (ret <= 0)
diff --git a/tools/console/daemon/main.c b/tools/console/daemon/main.c
index 806d2fd611..5d9d55b430 100644
--- a/tools/console/daemon/main.c
+++ b/tools/console/daemon/main.c
@@ -40,6 +40,7 @@ int log_time_hv = 0;
 int log_time_guest = 0;
 char *log_dir = NULL;
 int discard_overflowed_data = 1;
+int replace_escape = 0;
 
 static void handle_hup(int sig)
 {
@@ -48,7 +49,8 @@ static void handle_hup(int sig)
 
 static void usage(char *name)
 {
- printf("Usage: %s [-h] [-V] [-v] [-i] [--log=none|guest|hv|all] [--log-dir=DIR] [--pid-file=PATH] [-t, --timestamp=none|guest|hv|all] [-o, --overflow-data=discard|keep]\n", name);
+ printf("Usage: %s [-h] [-V] [-v] [-i] [--log=none|guest|hv|all] [--log-dir=DIR] [--pid-file=PATH] [-t, --timestamp=none|guest|hv|all] [-o, --overflow-data=discard|keep] [--replace-escape]\n", name);
+ printf("  --replace-escape  - replace ESC character with dot when writing console log\n");
 }
 
 static void version(char *name)
@@ -104,6 +106,7 @@ int main(int argc, char **argv)
  { "pid-file", 1, 0, 'p' },
  { "timestamp", 1, 0, 't' },
  { "overflow-data", 1, 0, 'o'},
+ { "replace-escape", 0, 0, 'e'},
  { 0 },
  };
  bool is_interactive = false;
@@ -168,6 +171,9 @@ int main(int argc, char **argv)
  discard_overflowed_data = 1;
  }
  break;
+ case 'e':
+ replace_escape = 1;
+ break;
  case '?':
  fprintf(stderr,
  "Try `%s --help' for more information\n",
--
generated by git-patchbot for /home/xen/git/xen.git#staging


_______________________________________________
Xen-changelog mailing list
[hidden email]
https://lists.xenproject.org/xen-changelog