Dave I have done the suggested modifications, have a look
I haven't walked through all the restricted command list code paths to verify that they can work properly for all architectures without, say, kernel_init(), the 3 machdep_init() calls, vm_init() etc. having run. Certainly trying to rd or dis vmalloc addresses would display garbage data or just fail, but that's to be expected. I quickly tried this on a x86 and x86_64 -- but have you tried this on an ia64 or ppc64?
I tested on ppc64 and on corrupted dump and it worked fine
The only thing I'm not excited about is all the re-tinkering with the help screen output. Why bother? I'd prefer to keep things simple. During initialization, display a WARNING message that lists the supported commands just prior to the first prompt. And then just leave the help screen alone, and let your command-restriction mechanism display the per-command message: error(INFO, "command: %s not available in minimal mode\n", args[0]); ...and then perhaps followed up immediately with the acceptable command list again.
I have done this code change
Another minor suggestion -- I think you can put the "eval" command in the supported list. I use it all the time, and in this minimal environment it may come in very handy. (There may be others, but they're probably not worth having...)
allowed eval to be executed in minimal mode Thanks Yeehaw
Signed-off-by: Sharyathi Nagesh <sharyath@xxxxxxxxxx> Signed-off-by: Sachin P Sant <sachinp@xxxxxxxxxx> --- diff -Naurp crash-old/cmdline.c crash-new/cmdline.c --- crash-old/cmdline.c 2008-03-31 22:58:31.000000000 +0530 +++ crash-new/cmdline.c 2008-08-18 09:25:21.000000000 +0530 @@ -2137,3 +2137,11 @@ wait_for_children(ulong waitflag) stall(1000); } } + +int minimal_functions(char *name) +{ + return STREQ("log", name) || STREQ("help",name) || \ + STREQ("dis", name) || STREQ("q", name) || \ + STREQ("sym", name) || STREQ("exit", name)|| \ + STREQ("rd", name) || STREQ("eval", name) ; +} diff -Naurp crash-old/defs.h crash-new/defs.h --- crash-old/defs.h 2008-03-31 22:58:31.000000000 +0530 +++ crash-new/defs.h 2008-08-04 13:36:23.000000000 +0530 @@ -183,6 +183,7 @@ struct number_option { #define PLEASE_WAIT (0x200000000000000ULL) #define IFILE_ERROR (0x400000000000000ULL) #define KERNTYPES (0x800000000000000ULL) +#define MINIMAL_MODE (0x1000000000000000ULL) #define ACTIVE() (pc->flags & LIVE_SYSTEM) #define DUMPFILE() (!(pc->flags & LIVE_SYSTEM)) @@ -3129,6 +3130,7 @@ int received_SIGINT(void); void debug_redirect(char *); int CRASHPAGER_valid(void); char *setup_scroll_command(void); +int minimal_functions(char *); /* * tools.c diff -Naurp crash-old/main.c crash-new/main.c --- crash-old/main.c 2008-08-18 11:50:38.000000000 +0530 +++ crash-new/main.c 2008-08-18 11:54:31.000000000 +0530 @@ -56,6 +56,7 @@ static struct option long_options[] = { {"no_scroll", 0, 0, 0}, {"reloc", required_argument, 0, 0}, {"active", 0, 0, 0}, + {"minimal", 0, 0, 0}, {0, 0, 0, 0} }; @@ -197,6 +198,9 @@ main(int argc, char **argv) kt->flags |= RELOC_SET; } + else if (STREQ(long_options[option_index].name, "minimal")) + pc->flags |= MINIMAL_MODE; + else { error(INFO, "internal error: option %s unhandled\n", long_options[option_index].name); @@ -492,7 +496,7 @@ main_loop(void) #else error(FATAL, XEN_HYPERVISOR_NOT_SUPPORTED); #endif - } else { + } else if(!(pc->flags & MINIMAL_MODE)){ read_in_kernel_config(IKCFG_INIT); kernel_init(); machdep_init(POST_GDB); @@ -520,7 +524,7 @@ main_loop(void) #else error(FATAL, XEN_HYPERVISOR_NOT_SUPPORTED); #endif - } else { + } else if(!(pc->flags & MINIMAL_MODE)){ display_sys_stats(); show_context(CURRENT_CONTEXT()); } @@ -528,6 +532,11 @@ main_loop(void) } pc->flags |= RUNTIME; + + if(pc->flags & MINIMAL_MODE){ + error(WARNING, "In minimal mode you have access to only these \n \ + commands: 'log', 'dis', 'rd','sym', 'eval' and 'exit' \n"); + } /* * Return here if a non-recoverable error occurs @@ -610,7 +619,14 @@ reattempt: return; pc->curcmd = pc->program_name; - error(INFO, "command not found: %s\n", args[0]); + if (!(pc->flags & MINIMAL_MODE)) + error(INFO, "command not found: %s\n", args[0]); + else{ + error(INFO, + "command: %s not available in minimal mode\n", args[0]); + error(INFO, + "supported commands:'log', 'dis', 'rd', 'sym', 'eval', 'exit' \n"); + } if (pc->curcmd_flags & REPEAT) pc->curcmd_flags &= ~REPEAT; @@ -625,6 +641,9 @@ get_command_table_entry(char *name) { struct command_table_entry *cp; struct extension_table *ext; + + if ((pc->flags & MINIMAL_MODE) && !minimal_functions(name)) + return NULL; for (cp = pc->cmd_table; cp->name; cp++) { if (STREQ(cp->name, name))
-- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility