]> granicus.if.org Git - procps-ng/commitdiff
top: exploit msg handler override to avoid corrupt tty
authorJim Warner <james.warner@comcast.net>
Tue, 14 Nov 2017 05:00:00 +0000 (00:00 -0500)
committerCraig Small <csmall@enc.com.au>
Wed, 20 Dec 2017 10:07:44 +0000 (21:07 +1100)
Way back in November of 2011, the library was equipped
with an overridable error message handler function. It
was done expressly for a program like top which alters
the tty. But that support was withdrawn shortly after.

This was all done in the lead up to v3.3.2. That's the
release where NLS support was added and it represented
a hectic time. In hindsight, the changes went too far.

So this commit, in a minimal fashion, restores ability
to address a potential fatal library error. After all,
any properly behaving library would never unilaterally
subject a caller to a stderr message and then an exit.

[ when exposing 1 variable in libprocps.sym, 2 other ]
[ existing symbols were repositioned alphabetically. ]

Reference(s):
. generalized library memory provisions
commit 7126cc4491847ce5d50e603fe48666f94bfc60bf
. top exploit library memory provisions
commit 88087ec5a5968304d6461be2c2fbe05885ffdad8
. library xalloc type functions made private
commit 2865ded64e72e0bec721dad9b442dab0899ee2b0
. restored prior top memory logic
commit 05f5deb97c454b3558892ff4266efc81547f88d5

Signed-off-by: Jim Warner <james.warner@comcast.net>
proc/libprocps.sym
top/top.c
top/top.h

index 1996dc5a03b9131d7dabc49c06ac5b406622fd09..75f334a9440d5fa231b7cc0f2824a8aaa40e26d0 100644 (file)
@@ -47,7 +47,9 @@ global:
        page_bytes;
        pretty_print_signals;
        print_uptime;
+       procps_linux_version;
        put_slabinfo;
+       pwcache_get_user;
        readeither;
        readproc;
        readproctab2;
@@ -62,8 +64,7 @@ global:
        tty_to_dev;
        unix_print_signals;
        uptime;
-       pwcache_get_user;
-       procps_linux_version;
+       xalloc_err_handler;
 local:
        *;
 };
index e90935c435f42b6fbaeb9714fcc2ff5c5294fa5c..840c52693461d12e613f0e2bf21a361dd7f4153f 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -47,6 +47,7 @@
 #include "../include/fileutils.h"
 #include "../include/nls.h"
 
+#include "../proc/alloc.h"
 #include "../proc/devname.h"
 #include "../proc/numa.h"
 #include "../proc/procps.h"
@@ -640,6 +641,20 @@ static void sig_resize (int dont_care_sig) {
    Frames_signal = BREAK_sig;
    (void)dont_care_sig;
 } // end: sig_resize
+
+
+        /*
+         * Handles libproc memory errors, so our tty can be reset */
+static void xalloc_our_handler (const char *fmts, ...) {
+   static char buf[MEDBUFSIZ];
+   va_list va;
+
+   va_start(va, fmts);
+   vsnprintf(buf, sizeof(buf), fmts, va);
+   va_end(va);
+   scat(buf, "\n");
+   bye_bye(buf);
+} // end: xalloc_our_handler
 \f
 /*######  Special UTF-8 Multi-Byte support  ##############################*/
 
@@ -3465,6 +3480,9 @@ static void before (char *me) {
    // accommodate nls/gettext potential translations
    initialize_nls();
 
+   // override default library memory alloc error handler
+   xalloc_err_handler = xalloc_our_handler;
+
    // establish cpu particulars
 #ifdef PRETEND8CPUS
    smp_num_cpus = 8;
index 813a957b65149e3df7348be3c993b2034aaf5733..31683cd2f6c6cbd6d98980c56bce9f15dd80db1b 100644 (file)
--- a/top/top.h
+++ b/top/top.h
@@ -681,6 +681,7 @@ typedef struct WIN_t {
 //atic void          sig_endpgm (int dont_care_sig);
 //atic void          sig_paused (int dont_care_sig);
 //atic void          sig_resize (int dont_care_sig);
+//atic void          xalloc_our_handler (const char *fmts, ...);
 /*------  Special UTF-8 Multi-Byte support  ------------------------------*/
 /*atic char          UTF8_tab[] = { ... }                                 */
 //atic int           utf8_delta (const char *str);