diff options
author | 2021-02-09 14:17:51 +0100 | |
---|---|---|
committer | 2021-02-09 14:17:51 +0100 | |
commit | 2d7ae93af2e802a52fa7b9c968029528460dde19 (patch) | |
tree | ce056b583ffb0923d862940f83d092c2284c3099 /patches | |
parent | gen_initramfs.sh: append_eudev(): log udevadm errors to $LOGFILE (diff) | |
download | genkernel-2d7ae93af2e802a52fa7b9c968029528460dde19.tar.gz genkernel-2d7ae93af2e802a52fa7b9c968029528460dde19.tar.bz2 genkernel-2d7ae93af2e802a52fa7b9c968029528460dde19.zip |
eudev: allow empty properties
Signed-off-by: Thomas Deutschmann <whissi@gentoo.org>
Diffstat (limited to 'patches')
-rw-r--r-- | patches/eudev/3.2.9/eudev-3.2.9-allow-empty-properties.patch | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/patches/eudev/3.2.9/eudev-3.2.9-allow-empty-properties.patch b/patches/eudev/3.2.9/eudev-3.2.9-allow-empty-properties.patch new file mode 100644 index 00000000..2eb75655 --- /dev/null +++ b/patches/eudev/3.2.9/eudev-3.2.9-allow-empty-properties.patch @@ -0,0 +1,130 @@ +https://github.com/gentoo/eudev/pull/192 + +--- a/src/udev/udevadm-hwdb.c ++++ b/src/udev/udevadm-hwdb.c +@@ -426,21 +426,24 @@ static int insert_data(struct trie *trie, struct udev_list *match_list, + char *value; + struct udev_list_entry *entry; + ++ assert(line[0] == ' '); ++ + value = strchr(line, '='); + if (!value) { +- log_error("Error, key/value pair expected but got '%s' in '%s':", line, filename); ++ log_error("Warning, key-value pair expected but got \"%s\", ignoring", line); + return -EINVAL; + } + + value[0] = '\0'; + value++; + +- /* libudev requires properties to start with a space */ ++ /* Replace multiple leading spaces by a single space */ + while (isblank(line[0]) && isblank(line[1])) + line++; + +- if (line[0] == '\0' || value[0] == '\0') { +- log_error("Error, empty key or value '%s' in '%s':", line, filename); ++ if (isempty(line + 1)) { ++ log_error("Warning, empty key in \"%s=%s\", ignoring", ++ line, value); + return -EINVAL; + } + +@@ -459,17 +462,21 @@ static int import_file(struct udev *udev, struct trie *trie, const char *filenam + FILE *f; + char line[LINE_MAX]; + struct udev_list match_list; ++ uint32_t line_number = 0; ++ int r = 0, err; + + udev_list_init(udev, &match_list, false); + + f = fopen(filename, "re"); +- if (f == NULL) ++ if (!f) + return -errno; + + while (fgets(line, sizeof(line), f)) { + size_t len; + char *pos; + ++ ++line_number; ++ + /* comment line */ + if (line[0] == '#') + continue; +@@ -491,7 +498,8 @@ static int import_file(struct udev *udev, struct trie *trie, const char *filenam + break; + + if (line[0] == ' ') { +- log_error("Error, MATCH expected but got '%s' in '%s':", line, filename); ++ log_error("Warning, match expected but got indented property \"%s\", ignoring line", line); ++ r = -EINVAL; + break; + } + +@@ -502,46 +510,55 @@ static int import_file(struct udev *udev, struct trie *trie, const char *filenam + + case HW_MATCH: + if (len == 0) { +- log_error("Error, DATA expected but got empty line in '%s':", filename); ++ log_error("Warning, property expected, ignoring record with no properties"); ++ r = -EINVAL; + state = HW_NONE; + udev_list_cleanup(&match_list); + break; + } + +- /* another match */ + if (line[0] != ' ') { ++ /* another match */ + udev_list_entry_add(&match_list, line, NULL); + break; + } + + /* first data */ + state = HW_DATA; +- insert_data(trie, &match_list, line, filename); ++ err = insert_data(trie, &match_list, line, filename); ++ if (err < 0) ++ r = err; + break; + + case HW_DATA: +- /* end of record */ + if (len == 0) { ++ /* end of record */ + state = HW_NONE; + udev_list_cleanup(&match_list); + break; + } + + if (line[0] != ' ') { +- log_error("Error, DATA expected but got '%s' in '%s':", line, filename); ++ log_error("Warning, property or empty line expected, got \"%s\", ignoring record", line); ++ r = -EINVAL; + state = HW_NONE; + udev_list_cleanup(&match_list); + break; + } + +- insert_data(trie, &match_list, line, filename); ++ err = insert_data(trie, &match_list, line, filename); ++ if (err < 0) ++ r = err; + break; + }; + } + ++ if (state == HW_MATCH) ++ log_error("Warning, property expected, ignoring record with no properties"); ++ + fclose(f); + udev_list_cleanup(&match_list); +- return 0; ++ return r; + } + + static void help(void) { + |