summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--discover/syslinux-parser.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/discover/syslinux-parser.c b/discover/syslinux-parser.c
index b127494..be7b94a 100644
--- a/discover/syslinux-parser.c
+++ b/discover/syslinux-parser.c
@@ -36,6 +36,11 @@ struct syslinux_options {
char *cfg_dir;
};
+struct conf_file_stat {
+ char *name;
+ struct stat stat;
+ struct list_item list;
+};
static const char *const syslinux_conf_files[] = {
"/boot/syslinux/syslinux.cfg",
@@ -416,9 +421,12 @@ fail:
static int syslinux_parse(struct discover_context *dc)
{
+ struct conf_file_stat *confcmp, *confdat;
+ struct list processed_conf_files;
struct syslinux_options *state;
const char * const *filename;
struct conf_context *conf;
+ struct stat statbuf;
char *cfg_dir;
int len, rc;
char *buf;
@@ -441,6 +449,8 @@ static int syslinux_parse(struct discover_context *dc)
conf->parser_info = state = talloc_zero(conf, struct syslinux_options);
list_init(&state->processed_options);
+ list_init(&processed_conf_files);
+
/*
* set the global defaults
* by spec 'default' defaults to 'linux' and
@@ -453,10 +463,37 @@ static int syslinux_parse(struct discover_context *dc)
conf_set_global_option(conf, "append", "");
for (filename = syslinux_conf_files; *filename; filename++) {
+ /*
+ * guard against duplicate entries in case-insensitive
+ * filesystems, mainly vfat boot partitions
+ */
+ rc = parser_stat_path(dc, dc->device, *filename, &statbuf);
+ if (rc)
+ continue;
+
+ rc = 0;
+
+ list_for_each_entry(&processed_conf_files, confcmp, list) {
+ if (confcmp->stat.st_ino == statbuf.st_ino) {
+ pb_log("conf file %s is a path duplicate of %s..skipping\n",
+ *filename, confcmp->name);
+ rc = 1;
+ break;
+ }
+ }
+
+ if (rc)
+ continue;
+
rc = parser_request_file(dc, dc->device, *filename, &buf, &len);
if (rc)
continue;
+ confdat = talloc_zero(conf, struct conf_file_stat);
+ confdat->stat = statbuf;
+ confdat->name = talloc_strdup(confdat, *filename);
+ list_add(&processed_conf_files, &confdat->list);
+
/*
* save location of root config file for possible
* INCLUDE directives later
OpenPOWER on IntegriCloud