From 5dfb46e14f1f31bb4354be91590c90a91a6b3a34 Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Fri, 26 Aug 2011 21:04:26 +0000 Subject: [PATCH] Stricter checks for command-line options (thanks to Sebastian Pipping) --- ChangeLog | 2 ++ htop.c | 21 ++++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5643e356..f5db0e94 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,8 @@ What's new in version 0.9.1 * Option for counting CPUs from zero (thanks to Sean Noonan) * Meters update in every screen (no longer halting while on Setup, etc.) +* Stricter checks for command-line options + (thanks to Sebastian Pipping) * BUGFIX: Support larger numbers for process times. (thanks to Tristan Nakagawa for the report.) * BUGFIX: Segfault in BarMeterMode_draw() for small terminal widths diff --git a/htop.c b/htop.c index 88ef59d9..d737ff35 100644 --- a/htop.c +++ b/htop.c @@ -228,12 +228,14 @@ static void addUserToVector(int key, void* userCast, void* panelCast) { Panel_add(panel, (Object*) ListItem_new(user, key)); } -static void setUserOnly(const char* userName, bool* userOnly, uid_t* userId) { +static bool setUserOnly(const char* userName, bool* userOnly, uid_t* userId) { struct passwd* user = getpwnam(userName); if (user) { *userOnly = true; *userId = user->pw_uid; + return true; } + return false; } static inline void setSortKey(ProcessList* pl, ProcessField sortKey, Panel* panel, Settings* settings) { @@ -295,16 +297,25 @@ int main(int argc, char** argv) { } break; case 'd': - sscanf(optarg, "%d", &delay); - if (delay < 1) delay = 1; - if (delay > 100) delay = 100; + if (sscanf(optarg, "%d", &delay) == 1) { + if (delay < 1) delay = 1; + if (delay > 100) delay = 100; + } else { + fprintf(stderr, "Error: invalid delay value \"%s\".\n", optarg); + exit(1); + } break; case 'u': - setUserOnly(optarg, &userOnly, &userId); + if (!setUserOnly(optarg, &userOnly, &userId)) { + fprintf(stderr, "Error: invalid user \"%s\".\n", optarg); + exit(1); + } break; case 'C': usecolors=0; break; + default: + exit(1); } }