3f891b1
commit 0aec2900f63820c3405ba38a4d1cd67cc22f0715
3f891b1
Author: Miroslav Lichvar <mlichvar@redhat.com>
3f891b1
Date:   Mon Jul 18 17:26:47 2011 +0200
3f891b1
3f891b1
    Clear scrollback buffer when locking terminal
3f891b1
    
3f891b1
    Linux kernel 3.0 adds a new command to clear the scrollback buffer in
3f891b1
    the linux console. It's available in the ncurses terminfo entry as
3f891b1
    extended capability E3. This is useful to prevent an attacker to read
3f891b1
    content of a locked terminal via Shift-PgUp key.
3f891b1
3f891b1
diff --git a/src/display.c b/src/display.c
3f891b1
index 5fa11cb..038c435 100644
3f891b1
--- a/src/display.c
3f891b1
+++ b/src/display.c
3f891b1
@@ -3779,4 +3779,10 @@ char **cmdv;
3f891b1
 
3f891b1
 #endif /* BLANKER_PRG */
3f891b1
 
3f891b1
+void
3f891b1
+ClearScrollbackBuffer()
3f891b1
+{
3f891b1
+  if (D_CE3)
3f891b1
+    AddCStr(D_CE3);
3f891b1
+}
3f891b1
 
3f891b1
diff --git a/src/extern.h b/src/extern.h
3f891b1
index c787d99..d3fecf0 100644
3f891b1
--- a/src/extern.h
3f891b1
+++ b/src/extern.h
3f891b1
@@ -316,6 +316,7 @@ extern int   color256to88 __P((int));
3f891b1
 extern void  ResetIdle __P((void));
3f891b1
 extern void  KillBlanker __P((void));
3f891b1
 extern void  DisplaySleep1000 __P((int, int));
3f891b1
+extern void  ClearScrollbackBuffer __P((void));
3f891b1
 
3f891b1
 /* resize.c */
3f891b1
 extern int   ChangeWindowSize __P((struct win *, int, int, int));
3f891b1
diff --git a/src/screen.c b/src/screen.c
3f891b1
index cc8f565..3efb67b 100644
3f891b1
--- a/src/screen.c
3f891b1
+++ b/src/screen.c
3f891b1
@@ -1967,6 +1967,7 @@ int mode;
3f891b1
 #endif
3f891b1
     case D_LOCK:
3f891b1
       ClearAll();
3f891b1
+      ClearScrollbackBuffer();
3f891b1
       sign = SIG_LOCK;
3f891b1
       /* tell attacher to lock terminal with a lockprg. */
3f891b1
       break;
3f891b1
diff --git a/src/term.c b/src/term.c
3f891b1
index 991de1b..7485900 100644
3f891b1
--- a/src/term.c
3f891b1
+++ b/src/term.c
3f891b1
@@ -83,6 +83,7 @@ struct term term[T_N] =
3f891b1
   { "CD", T_STR  },
3f891b1
   { "ce", T_STR  },
3f891b1
   { "cb", T_STR  },
3f891b1
+  { "E3", T_STR  },
3f891b1
 
3f891b1
 /* initialise */
3f891b1
   { "is", T_STR  },