2018-06-23 4:27 GMT+09:00 Dirk Gouders <dirk@xxxxxxxxxxx>: > xfwrite uses assert() to ensure it does not operate on empty strings. > Two users respect this, expr_print_file_helper() doesn't and causes > segfaults e.g. when the dependency for an empty default string is printed. > > Fix this by calling xfwrite with an empty string pattern ("") for > empty strings. > > INITRAMFS_SOURCE was one symbol that caused this problem, with this > fix applied the zconfdump() output for this symbol looks as follows: > > ------------------------------------------------------------------------ > config INITRAMFS_SOURCE > string > symbol INITRAMFS_SOURCE > prompt "Initramfs source file(s)" if BLK_DEV_INITRD > default "" if BLK_DEV_INITRD > help > This can be either a single cpio archive with a .cpio suffix or a > space-separated list of directories and files for building the > initramfs image. A cpio archive should contain a filesystem archive > to be used as an initramfs image. Directories should contain a > filesystem layout to be included in the initramfs image. Files > should contain entries according to the format described by the > "usr/gen_init_cpio" program in the kernel tree. > > When multiple directories and files are specified then the > initramfs image will be the aggregate of all of them. > > See <file:Documentation/early-userspace/README> for more details. > > If you are not sure, leave it blank. > ------------------------------------------------------------------------ > > Signed-off-by: Dirk Gouders <dirk@xxxxxxxxxxx> > --- Hmm, please let me think about this. I know this is an easy way to fix the seg-fault, but I think it is not a correct way. If the config entry were like this: config INITRAMFS_SOURCE string "Initramfs source file(s)" default "foo" It would be dumped like this: config INITRAMFS_SOURCE string symbol INITRAMFS_SOURCE prompt "Initramfs source file(s)" default foo I want it to be displayed like this: default "foo" If we can quote the string values, the problem will be eventually fixed. It may not be easy to fix it... > scripts/kconfig/expr.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c > index e1a39e90841d..e064bf4c2881 100644 > --- a/scripts/kconfig/expr.c > +++ b/scripts/kconfig/expr.c > @@ -1231,7 +1231,10 @@ void expr_print(struct expr *e, > > static void expr_print_file_helper(void *data, struct symbol *sym, const char *str) > { > - xfwrite(str, strlen(str), 1, data); > + if (*str != '\0') > + xfwrite(str, strlen(str), 1, data); > + else > + xfwrite("\"\"", 2, 1, data); > } > > void expr_fprint(struct expr *e, FILE *out) > -- > 2.13.6 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Best Regards Masahiro Yamada -- To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html