changeset 18925:ff17864ba6e0

lib-master: Make sure we can't accidentally add duplicate getopt args.
author Timo Sirainen <tss@iki.fi>
date Fri, 07 Aug 2015 15:32:14 +0300
parents f611d66e56f6
children 00f306fc5bde
files src/lib-master/master-service.c src/lib-master/master-service.h
diffstat 2 files changed, 22 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-master/master-service.c	Fri Aug 07 15:30:26 2015 +0300
+++ b/src/lib-master/master-service.c	Fri Aug 07 15:32:14 2015 +0300
@@ -251,6 +251,8 @@
 {
 	int c;
 
+	i_assert(master_getopt_str_is_valid(service->getopt_str));
+
 	while ((c = getopt(service->argc, service->argv,
 			   service->getopt_str)) > 0) {
 		if (!master_service_parse_option(service, c, optarg))
@@ -259,6 +261,23 @@
 	return c;
 }
 
+bool master_getopt_str_is_valid(const char *str)
+{
+	unsigned int i, j;
+
+	/* make sure there are no duplicates. there are few enough characters
+	   that this should be fast enough. */
+	for (i = 0; str[i] != '\0'; i++) {
+		if (str[i] == ':' || str[i] == '+' || str[i] == '-')
+			continue;
+		for (j = i+1; str[j] != '\0'; j++) {
+			if (str[i] == str[j])
+				return FALSE;
+		}
+	}
+	return TRUE;
+}
+
 void master_service_init_log(struct master_service *service,
 			     const char *prefix)
 {
--- a/src/lib-master/master-service.h	Fri Aug 07 15:30:26 2015 +0300
+++ b/src/lib-master/master-service.h	Fri Aug 07 15:32:14 2015 +0300
@@ -63,6 +63,9 @@
 /* Call getopt() and handle internal parameters. Return values are the same as
    getopt()'s. */
 int master_getopt(struct master_service *service);
+/* Returns TRUE if str is a valid getopt_str. Currently this only checks for
+   duplicate args so they aren't accidentally added. */
+bool master_getopt_str_is_valid(const char *str);
 /* Parser command line option. Returns TRUE if processed. */
 bool master_service_parse_option(struct master_service *service,
 				 int opt, const char *arg);