Note: environment files are treated differently by Openbox, which will simply
source the file as a valid shell script before running the window manager. Files
-are instead parsed directly by labwc, although any environment variables
-referenced as $VARIABLE or ${VARIABLE} will be substituted and the tilde (~)
-will be expanded as the user's home directory.
+are instead parsed directly by labwc so that environment variables can be
+re-loaded on --reconfigure.
+
+Any environment variables referenced as $VARIABLE or ${VARIABLE} will be
+substituted and the tilde (~) will be expanded as the user's home directory.
+
+Please note that as labwc reloads the environment file(s) on reconfigure,
+recursive/circular assignments (for example FOO=$FOO:bar) should not be made.
The *autostart* file is executed as a shell script after labwc has read its
configuration and set variables defined in the environment file. Additionally,
NULL
};
+#define LAB_ENV_VAR_MAX_SIZE 1024
static void
process_line(char *line)
{
struct buf value = BUF_INIT;
buf_add(&value, string_strip(++p));
+
+ /*
+ * Users should not assign environment variables recursively (for
+ * example FOO=$FOO:bar) in the environment file because they would just
+ * keep growing on reconfigure. We could of course try to remember the
+ * original values, but it adds complexity for which we currently cannot
+ * see a use-case that could not easily be handled by some shell scripts
+ * separate from the environment file.
+ *
+ * Consequently we just check the size of the environment variables to
+ * defensively handle that growth issue in the case of inadvertent
+ * recursion.
+ */
+ if (value.len > LAB_ENV_VAR_MAX_SIZE) {
+ wlr_log(WLR_ERROR, "ignoring environment variable assignment as "
+ "its size is greater than %d bytes which indicates recursion "
+ "(%s=%s)", LAB_ENV_VAR_MAX_SIZE, key, value.data);
+ goto err;
+ }
+
buf_expand_shell_variables(&value);
buf_expand_tilde(&value);
setenv(key, value.data, 1);
+
+err:
buf_reset(&value);
}
+#undef LAB_ENV_VAR_MAX_SIZE
+
/* return true on successful read */
static bool
read_environment_file(const char *filename)