diff options
author | Hisham Muhammad <hisham@gobolinux.org> | 2007-08-10 06:13:13 +0000 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2007-08-10 06:13:13 +0000 |
commit | f356997269257e9cba06f10b92a14e6c2d7be000 (patch) | |
tree | 6f8f7648be935da5a6dc25be9cc8578fd3114e37 /htop.c | |
parent | e685bdeea080160684faaf17169faac0e614dfc7 (diff) |
Fix crash on invalid command line arguments:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=435651
Diffstat (limited to 'htop.c')
-rw-r--r-- | htop.c | 34 |
1 files changed, 20 insertions, 14 deletions
@@ -208,32 +208,38 @@ int main(int argc, char** argv) { uid_t userId = 0; int sortKey = 0; - if (argc > 0) { - if (String_eq(argv[1], "--help")) { + int arg = 1; + while (arg < argc) { + if (String_eq(argv[arg], "--help")) { printHelpFlag(); - } else if (String_eq(argv[1], "--version")) { + } else if (String_eq(argv[arg], "--version")) { printVersionFlag(); - } else if (String_eq(argv[1], "--sort-key")) { - if (argc < 2) printHelpFlag(); - if (String_eq(argv[2], "help")) { + } else if (String_eq(argv[arg], "--sort-key")) { + if (arg == argc - 1) printHelpFlag(); + arg++; + char* field = argv[arg]; + if (String_eq(field, "help")) { for (int j = 1; j < LAST_PROCESSFIELD; j++) printf ("%s\n", Process_fieldNames[j]); exit(0); } - sortKey = ColumnsPanel_fieldNameToIndex(argv[2]); + sortKey = ColumnsPanel_fieldNameToIndex(field); if (sortKey == -1) { - fprintf(stderr, "Error: invalid column \"%s\".\n", argv[2]); + fprintf(stderr, "Error: invalid column \"%s\".\n", field); exit(1); } - } else if (String_eq(argv[1], "-d")) { - if (argc < 2) printHelpFlag(); - sscanf(argv[2], "%d", &delay); + } else if (String_eq(argv[arg], "-d")) { + if (arg == argc - 1) printHelpFlag(); + arg++; + sscanf(argv[arg], "%d", &delay); if (delay < 1) delay = 1; if (delay > 100) delay = 100; - } else if (String_eq(argv[1], "-u")) { - if (argc < 2) printHelpFlag(); - setUserOnly(argv[2], &userOnly, &userId); + } else if (String_eq(argv[arg], "-u")) { + if (arg == argc - 1) printHelpFlag(); + arg++; + setUserOnly(argv[arg], &userOnly, &userId); } + arg++; } if (access(PROCDIR, R_OK) != 0) { |