summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--calmwm.h2
-rw-r--r--conf.c36
-rw-r--r--parse.y7
3 files changed, 30 insertions, 15 deletions
diff --git a/calmwm.h b/calmwm.h
index 4ea482e..389c269 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -522,7 +522,7 @@ int			 conf_bind_mouse(struct conf *, const char *,
     			     const char *);
 void			 conf_clear(struct conf *);
 void			 conf_client(struct client_ctx *);
-void			 conf_cmd_add(struct conf *, const char *,
+int			 conf_cmd_add(struct conf *, const char *,
 			     const char *);
 void			 conf_cursor(struct conf *);
 void			 conf_grab_kbd(Window);
diff --git a/conf.c b/conf.c
index 9ecf1b4..8f067d0 100644
--- a/conf.c
+++ b/conf.c
@@ -35,21 +35,32 @@ static const char	*conf_bind_getmask(const char *, unsigned int *);
 static void	 	 conf_unbind_kbd(struct conf *, struct keybinding *);
 static void	 	 conf_unbind_mouse(struct conf *, struct mousebinding *);
 
-/* Add an command menu entry to the end of the menu */
-void
+int
 conf_cmd_add(struct conf *c, const char *name, const char *path)
 {
+	struct cmd	*cmd;
+
 	/* "term" and "lock" have special meanings. */
-	if (strcmp(name, "term") == 0)
-		(void)strlcpy(c->termpath, path, sizeof(c->termpath));
-	else if (strcmp(name, "lock") == 0)
-		(void)strlcpy(c->lockpath, path, sizeof(c->lockpath));
-	else {
-		struct cmd *cmd = xmalloc(sizeof(*cmd));
-		(void)strlcpy(cmd->name, name, sizeof(cmd->name));
-		(void)strlcpy(cmd->path, path, sizeof(cmd->path));
+	if (strcmp(name, "term") == 0) {
+		if (strlcpy(c->termpath, path, sizeof(c->termpath)) >=
+		    sizeof(c->termpath))
+			return (0);
+	} else if (strcmp(name, "lock") == 0) {
+		if (strlcpy(c->lockpath, path, sizeof(c->lockpath)) >=
+		    sizeof(c->lockpath))
+			return (0);
+	} else {
+		cmd = xmalloc(sizeof(*cmd));
+
+		if (strlcpy(cmd->name, name, sizeof(cmd->name)) >=
+		    sizeof(cmd->name))
+			return (0);
+		if (strlcpy(cmd->path, path, sizeof(cmd->path)) >=
+		    sizeof(cmd->path))
+			return (0);
 		TAILQ_INSERT_TAIL(&c->cmdq, cmd, entry);
 	}
+	return (1);
 }
 
 void
@@ -249,9 +260,8 @@ conf_init(struct conf *c)
 	for (i = 0; i < nitems(color_binds); i++)
 		c->color[i] = xstrdup(color_binds[i]);
 
-	/* Default term/lock */
-	(void)strlcpy(c->termpath, "xterm", sizeof(c->termpath));
-	(void)strlcpy(c->lockpath, "xlock", sizeof(c->lockpath));
+	conf_cmd_add(c, "lock", "xlock");
+	conf_cmd_add(c, "term", "xterm");
 
 	(void)snprintf(c->known_hosts, sizeof(c->known_hosts), "%s/%s",
 	    homedir, ".ssh/known_hosts");
diff --git a/parse.y b/parse.y
index 672a896..fb8c01e 100644
--- a/parse.y
+++ b/parse.y
@@ -137,7 +137,12 @@ main		: FONTNAME STRING		{
 			conf->snapdist = $2;
 		}
 		| COMMAND STRING string		{
-			conf_cmd_add(conf, $2, $3);
+			if (!conf_cmd_add(conf, $2, $3)) {
+				yyerror("command name/path too long");
+				free($2);
+				free($3);
+				YYERROR;
+			}
 			free($2);
 			free($3);
 		}