From 2e498b48bbfb127b33d2e84ba87c7d9456c42558 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 21 Aug 2007 14:22:16 +0000 Subject: r24599: patch from Karolin Seeger : smbd, nmbd and winbindd can be started with invalid options currently. The first patch attached would be a possible solution. It contains an exit if an invalid option has been used. The main problem is, that existing setups with wrong options or missing arguments in start scripts will break (which is the right behaviour from my point of view). metze (This used to be commit 8532e3182ab44d4ac84823e9798293f156192aaf) --- source3/nmbd/nmbd.c | 10 +++++++++- source3/nsswitch/winbindd.c | 14 ++++++++++---- source3/smbd/server.c | 5 ++++- 3 files changed, 23 insertions(+), 6 deletions(-) (limited to 'source3') diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c index b14e5a0b61..4f1dd93cae 100644 --- a/source3/nmbd/nmbd.c +++ b/source3/nmbd/nmbd.c @@ -652,6 +652,7 @@ static BOOL open_sockets(enum smb_server_mode server_mode, int port) BOOL no_process_group = False; BOOL log_stdout = False; enum smb_server_mode server_mode = SERVER_MODE_DAEMON; + int opt; struct poptOption long_options[] = { POPT_AUTOHELP @@ -674,7 +675,14 @@ static BOOL open_sockets(enum smb_server_mode server_mode, int port) global_nmb_port = NMB_PORT; pc = poptGetContext("nmbd", argc, argv, long_options, 0); - while (poptGetNextOpt(pc) != -1) {}; + while ((opt = poptGetNextOpt(pc)) != -1) { + switch (opt) { + default: + d_fprintf(stderr, "\nInvalid option %s: %s\n", + poptBadOption(pc, 0), poptStrerror(opt)); + exit(1); + } + }; poptFreeContext(pc); global_in_nmbd = True; diff --git a/source3/nsswitch/winbindd.c b/source3/nsswitch/winbindd.c index 5af5a789ad..f1283c5a83 100644 --- a/source3/nsswitch/winbindd.c +++ b/source3/nsswitch/winbindd.c @@ -1012,10 +1012,16 @@ int main(int argc, char **argv, char **envp) /* Initialise samba/rpc client stuff */ - pc = poptGetContext("winbindd", argc, (const char **)argv, long_options, - POPT_CONTEXT_KEEP_FIRST); - - while ((opt = poptGetNextOpt(pc)) != -1) {} + pc = poptGetContext("winbindd", argc, (const char **)argv, long_options, 0); + + while ((opt = poptGetNextOpt(pc)) != -1) { + switch (opt) { + default: + d_fprintf(stderr, "\nInvalid option %s: %s\n", + poptBadOption(pc, 0), poptStrerror(opt)); + exit(1); + } + } if (server_mode == SERVER_MODE_INTERACTIVE) { log_stdout = True; diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 491482eea6..3bb60058ac 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -855,7 +855,10 @@ extern void build_options(BOOL screen); case 'b': build_options(True); /* Display output to screen as well as debug */ exit(0); - break; + default: + d_fprintf(stderr, "\nInvalid option %s: %s\n", + poptBadOption(pc, 0), poptStrerror(opt)); + exit(1); } } -- cgit