linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value()
@ 2021-10-01  5:32 Masahiro Yamada
  2021-10-01  5:32 ` [PATCH 02/10] kconfig: refactor conf_write_heading() Masahiro Yamada
                   ` (9 more replies)
  0 siblings, 10 replies; 16+ messages in thread
From: Masahiro Yamada @ 2021-10-01  5:32 UTC (permalink / raw)
  To: linux-kbuild; +Cc: Masahiro Yamada, linux-kernel

sym_escape_string_value() returns a malloc'ed memory, but as
(const char *). So, it must be casted to (void *) when it is free'd.
This is odd.

The return type of sym_escape_string_value() should be (char *).

I exploited that free(NULL) has no effect.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

 scripts/kconfig/conf.c      | 15 +++++++--------
 scripts/kconfig/confdata.c  | 27 ++++++++++++++-------------
 scripts/kconfig/lkc_proto.h |  2 +-
 scripts/kconfig/symbol.c    |  3 ++-
 4 files changed, 24 insertions(+), 23 deletions(-)

diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c
index 5d84b44a2a2a..310fdd408793 100644
--- a/scripts/kconfig/conf.c
+++ b/scripts/kconfig/conf.c
@@ -647,17 +647,16 @@ static void check_conf(struct menu *menu)
 		switch (input_mode) {
 		case listnewconfig:
 			if (sym->name) {
-				const char *str;
+				const char *val = sym_get_string_value(sym);
+				char *escaped = NULL;
 
 				if (sym->type == S_STRING) {
-					str = sym_get_string_value(sym);
-					str = sym_escape_string_value(str);
-					printf("%s%s=%s\n", CONFIG_, sym->name, str);
-					free((void *)str);
-				} else {
-					str = sym_get_string_value(sym);
-					printf("%s%s=%s\n", CONFIG_, sym->name, str);
+					escaped = sym_escape_string_value(val);
+					val = escaped;
 				}
+
+				printf("%s%s=%s\n", CONFIG_, sym->name, val);
+				free(escaped);
 			}
 			break;
 		case helpnewconfig:
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index cf72680cd769..9b2271eb43d6 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -728,21 +728,22 @@ static struct conf_printer header_printer_cb =
 static void conf_write_symbol(FILE *fp, struct symbol *sym,
 			      struct conf_printer *printer, void *printer_arg)
 {
-	const char *str;
+	const char *val;
+	char *escaped = NULL;
 
-	switch (sym->type) {
-	case S_UNKNOWN:
-		break;
-	case S_STRING:
-		str = sym_get_string_value(sym);
-		str = sym_escape_string_value(str);
-		printer->print_symbol(fp, sym, str, printer_arg);
-		free((void *)str);
-		break;
-	default:
-		str = sym_get_string_value(sym);
-		printer->print_symbol(fp, sym, str, printer_arg);
+	if (sym->type == S_UNKNOWN)
+		return;
+
+	val = sym_get_string_value(sym);
+
+	if (sym->type == S_STRING) {
+		escaped = sym_escape_string_value(val);
+		val = escaped;
 	}
+
+	printer->print_symbol(fp, sym, val, printer_arg);
+
+	free(escaped);
 }
 
 static void
diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h
index a11626bdc421..e6955df49973 100644
--- a/scripts/kconfig/lkc_proto.h
+++ b/scripts/kconfig/lkc_proto.h
@@ -18,7 +18,7 @@ extern struct symbol * symbol_hash[SYMBOL_HASHSIZE];
 
 struct symbol * sym_lookup(const char *name, int flags);
 struct symbol * sym_find(const char *name);
-const char * sym_escape_string_value(const char *in);
+char *sym_escape_string_value(const char *in);
 struct symbol ** sym_re_search(const char *pattern);
 const char * sym_type_name(enum symbol_type type);
 void sym_calc_value(struct symbol *sym);
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
index 5844d636d38f..6bf8665a6a0f 100644
--- a/scripts/kconfig/symbol.c
+++ b/scripts/kconfig/symbol.c
@@ -871,7 +871,8 @@ struct symbol *sym_find(const char *name)
 	return symbol;
 }
 
-const char *sym_escape_string_value(const char *in)
+/* The returned pointer must be freed on the caller side */
+char *sym_escape_string_value(const char *in)
 {
 	const char *p;
 	size_t reslen;
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 02/10] kconfig: refactor conf_write_heading()
  2021-10-01  5:32 [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value() Masahiro Yamada
@ 2021-10-01  5:32 ` Masahiro Yamada
  2021-10-01  5:32 ` [PATCH 03/10] kconfig: refactor conf_write_symbol() Masahiro Yamada
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2021-10-01  5:32 UTC (permalink / raw)
  To: linux-kbuild; +Cc: Masahiro Yamada, linux-kernel

All the call sites of conf_write_heading() pass NULL to the third
argument, and it is not used in the function.

Also, the print_comment hooks are doing much more complex than
needed.

Rewrite the code.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

 scripts/kconfig/confdata.c | 95 +++++++++++++-------------------------
 1 file changed, 33 insertions(+), 62 deletions(-)

diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index 9b2271eb43d6..ed1bb8ba971b 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -161,7 +161,6 @@ static int conf_touch_dep(const char *name)
 
 struct conf_printer {
 	void (*print_symbol)(FILE *, struct symbol *, const char *, void *);
-	void (*print_comment)(FILE *, const char *, void *);
 };
 
 static void conf_warning(const char *fmt, ...)
@@ -594,6 +593,36 @@ int conf_read(const char *name)
 	return 0;
 }
 
+struct comment_style {
+	const char *comment_line;
+	const char *comment_block_begin;
+	const char *comment_block_end;
+};
+
+static const struct comment_style comment_style_pound = {
+	.comment_line = "#",
+	.comment_block_begin = "#",
+	.comment_block_end = "#",
+};
+
+static const struct comment_style comment_style_c = {
+	.comment_line = " *",
+	.comment_block_begin = "/*",
+	.comment_block_end = " */",
+};
+
+static void conf_write_heading(FILE *fp, const struct comment_style *cs)
+{
+	fprintf(fp, "%s\n", cs->comment_block_begin);
+
+	fprintf(fp, "%s Automatically generated file; DO NOT EDIT.\n",
+		cs->comment_line);
+
+	fprintf(fp, "%s %s\n", cs->comment_line, rootmenu.prompt->text);
+
+	fprintf(fp, "%s\n", cs->comment_block_end);
+}
+
 /*
  * Kconfig configuration printer
  *
@@ -625,30 +654,9 @@ kconfig_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
 	fprintf(fp, "%s%s=%s\n", CONFIG_, sym->name, value);
 }
 
-static void
-kconfig_print_comment(FILE *fp, const char *value, void *arg)
-{
-	const char *p = value;
-	size_t l;
-
-	for (;;) {
-		l = strcspn(p, "\n");
-		fprintf(fp, "#");
-		if (l) {
-			fprintf(fp, " ");
-			xfwrite(p, l, 1, fp);
-			p += l;
-		}
-		fprintf(fp, "\n");
-		if (*p++ == '\0')
-			break;
-	}
-}
-
 static struct conf_printer kconfig_printer_cb =
 {
 	.print_symbol = kconfig_print_symbol,
-	.print_comment = kconfig_print_comment,
 };
 
 /*
@@ -697,32 +705,9 @@ header_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
 
 }
 
-static void
-header_print_comment(FILE *fp, const char *value, void *arg)
-{
-	const char *p = value;
-	size_t l;
-
-	fprintf(fp, "/*\n");
-	for (;;) {
-		l = strcspn(p, "\n");
-		fprintf(fp, " *");
-		if (l) {
-			fprintf(fp, " ");
-			xfwrite(p, l, 1, fp);
-			p += l;
-		}
-		fprintf(fp, "\n");
-		if (*p++ == '\0')
-			break;
-	}
-	fprintf(fp, " */\n");
-}
-
 static struct conf_printer header_printer_cb =
 {
 	.print_symbol = header_print_symbol,
-	.print_comment = header_print_comment,
 };
 
 static void conf_write_symbol(FILE *fp, struct symbol *sym,
@@ -746,20 +731,6 @@ static void conf_write_symbol(FILE *fp, struct symbol *sym,
 	free(escaped);
 }
 
-static void
-conf_write_heading(FILE *fp, struct conf_printer *printer, void *printer_arg)
-{
-	char buf[256];
-
-	snprintf(buf, sizeof(buf),
-	    "\n"
-	    "Automatically generated file; DO NOT EDIT.\n"
-	    "%s\n",
-	    rootmenu.prompt->text);
-
-	printer->print_comment(fp, buf, printer_arg);
-}
-
 /*
  * Write out a minimal config.
  * All values that has default values are skipped as this is redundant.
@@ -876,7 +847,7 @@ int conf_write(const char *name)
 	if (!out)
 		return 1;
 
-	conf_write_heading(out, &kconfig_printer_cb, NULL);
+	conf_write_heading(out, &comment_style_pound);
 
 	if (!conf_get_changed())
 		sym_clear_all_valid();
@@ -1080,8 +1051,8 @@ int conf_write_autoconf(int overwrite)
 		return 1;
 	}
 
-	conf_write_heading(out, &kconfig_printer_cb, NULL);
-	conf_write_heading(out_h, &header_printer_cb, NULL);
+	conf_write_heading(out, &comment_style_pound);
+	conf_write_heading(out_h, &comment_style_c);
 
 	for_all_symbols(i, sym) {
 		sym_calc_value(sym);
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 03/10] kconfig: refactor conf_write_symbol()
  2021-10-01  5:32 [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value() Masahiro Yamada
  2021-10-01  5:32 ` [PATCH 02/10] kconfig: refactor conf_write_heading() Masahiro Yamada
@ 2021-10-01  5:32 ` Masahiro Yamada
  2021-10-28  5:16   ` Boris Kolpackov
  2021-10-01  5:32 ` [PATCH 04/10] kconfig: refactor listnewconfig code Masahiro Yamada
                   ` (7 subsequent siblings)
  9 siblings, 1 reply; 16+ messages in thread
From: Masahiro Yamada @ 2021-10-01  5:32 UTC (permalink / raw)
  To: linux-kbuild; +Cc: Masahiro Yamada, linux-kernel

I do not think 'struct conf_printer' is so useful.

Add simple functions, print_symbol_for_*() to write out one symbol.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

 scripts/kconfig/confdata.c | 136 ++++++++++++++++---------------------
 1 file changed, 57 insertions(+), 79 deletions(-)

diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index ed1bb8ba971b..ce11e7442d12 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -11,6 +11,7 @@
 #include <fcntl.h>
 #include <limits.h>
 #include <stdarg.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -159,10 +160,6 @@ static int conf_touch_dep(const char *name)
 	return 0;
 }
 
-struct conf_printer {
-	void (*print_symbol)(FILE *, struct symbol *, const char *, void *);
-};
-
 static void conf_warning(const char *fmt, ...)
 	__attribute__ ((format (printf, 1, 2)));
 
@@ -629,91 +626,52 @@ static void conf_write_heading(FILE *fp, const struct comment_style *cs)
  * This printer is used when generating the resulting configuration after
  * kconfig invocation and `defconfig' files. Unset symbol might be omitted by
  * passing a non-NULL argument to the printer.
- *
  */
-static void
-kconfig_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
-{
-
-	switch (sym->type) {
-	case S_BOOLEAN:
-	case S_TRISTATE:
-		if (*value == 'n') {
-			bool skip_unset = (arg != NULL);
-
-			if (!skip_unset)
-				fprintf(fp, "# %s%s is not set\n",
-				    CONFIG_, sym->name);
-			return;
-		}
-		break;
-	default:
-		break;
-	}
-
-	fprintf(fp, "%s%s=%s\n", CONFIG_, sym->name, value);
-}
+enum output_n { OUTPUT_N, OUTPUT_N_AS_UNSET, OUTPUT_N_NONE };
 
-static struct conf_printer kconfig_printer_cb =
+static void __print_symbol(FILE *fp, struct symbol *sym, enum output_n output_n,
+			   bool escape_string)
 {
-	.print_symbol = kconfig_print_symbol,
-};
+	const char *val;
+	char *escaped = NULL;
 
-/*
- * Header printer
- *
- * This printer is used when generating the `include/generated/autoconf.h' file.
- */
-static void
-header_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
-{
+	if (sym->type == S_UNKNOWN)
+		return;
 
-	switch (sym->type) {
-	case S_BOOLEAN:
-	case S_TRISTATE: {
-		const char *suffix = "";
+	val = sym_get_string_value(sym);
 
-		switch (*value) {
-		case 'n':
-			break;
-		case 'm':
-			suffix = "_MODULE";
-			/* fall through */
-		default:
-			fprintf(fp, "#define %s%s%s 1\n",
-			    CONFIG_, sym->name, suffix);
-		}
-		break;
+	if ((sym->type == S_BOOLEAN || sym->type == S_TRISTATE) &&
+	    output_n != OUTPUT_N && *val == 'n') {
+		if (output_n == OUTPUT_N_AS_UNSET)
+			fprintf(fp, "# %s%s is not set\n", CONFIG_, sym->name);
+		return;
 	}
-	case S_HEX: {
-		const char *prefix = "";
 
-		if (value[0] != '0' || (value[1] != 'x' && value[1] != 'X'))
-			prefix = "0x";
-		fprintf(fp, "#define %s%s %s%s\n",
-		    CONFIG_, sym->name, prefix, value);
-		break;
-	}
-	case S_STRING:
-	case S_INT:
-		fprintf(fp, "#define %s%s %s\n",
-		    CONFIG_, sym->name, value);
-		break;
-	default:
-		break;
+	if (sym->type == S_STRING && escape_string) {
+		escaped = sym_escape_string_value(val);
+		val = escaped;
 	}
 
+	fprintf(fp, "%s%s=%s\n", CONFIG_, sym->name, val);
+
+	free(escaped);
 }
 
-static struct conf_printer header_printer_cb =
+static void print_symbol_for_dotconfig(FILE *fp, struct symbol *sym)
 {
-	.print_symbol = header_print_symbol,
-};
+	__print_symbol(fp, sym, OUTPUT_N_AS_UNSET, true);
+}
+
+static void print_symbol_for_autoconf(FILE *fp, struct symbol *sym)
+{
+	__print_symbol(fp, sym, OUTPUT_N_NONE, true);
+}
 
-static void conf_write_symbol(FILE *fp, struct symbol *sym,
-			      struct conf_printer *printer, void *printer_arg)
+static void print_symbol_for_c(FILE *fp, struct symbol *sym)
 {
 	const char *val;
+	const char *sym_suffix = "";
+	const char *val_prefix = "";
 	char *escaped = NULL;
 
 	if (sym->type == S_UNKNOWN)
@@ -721,12 +679,32 @@ static void conf_write_symbol(FILE *fp, struct symbol *sym,
 
 	val = sym_get_string_value(sym);
 
-	if (sym->type == S_STRING) {
+	switch (sym->type) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		switch (*val) {
+		case 'n':
+			return;
+		case 'm':
+			sym_suffix = "_MODULE";
+			/* fall through */
+		default:
+			val = "1";
+		}
+		break;
+	case S_HEX:
+		if (val[0] != '0' || (val[1] != 'x' && val[1] != 'X'))
+			val_prefix = "0x";
+		break;
+	case S_STRING:
 		escaped = sym_escape_string_value(val);
 		val = escaped;
+	default:
+		break;
 	}
 
-	printer->print_symbol(fp, sym, val, printer_arg);
+	fprintf(fp, "#define %s%s%s %s%s\n", CONFIG_, sym->name, sym_suffix,
+		val_prefix, val);
 
 	free(escaped);
 }
@@ -787,7 +765,7 @@ int conf_write_defconfig(const char *filename)
 						goto next_menu;
 				}
 			}
-			conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
+			print_symbol_for_dotconfig(out, sym);
 		}
 next_menu:
 		if (menu->list != NULL) {
@@ -874,7 +852,7 @@ int conf_write(const char *name)
 				need_newline = false;
 			}
 			sym->flags |= SYMBOL_WRITTEN;
-			conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
+			print_symbol_for_dotconfig(out, sym);
 		}
 
 next:
@@ -1060,8 +1038,8 @@ int conf_write_autoconf(int overwrite)
 			continue;
 
 		/* write symbols to auto.conf and autoconf.h */
-		conf_write_symbol(out, sym, &kconfig_printer_cb, (void *)1);
-		conf_write_symbol(out_h, sym, &header_printer_cb, NULL);
+		print_symbol_for_autoconf(out, sym);
+		print_symbol_for_c(out_h, sym);
 	}
 	fclose(out);
 	fclose(out_h);
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 04/10] kconfig: refactor listnewconfig code
  2021-10-01  5:32 [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value() Masahiro Yamada
  2021-10-01  5:32 ` [PATCH 02/10] kconfig: refactor conf_write_heading() Masahiro Yamada
  2021-10-01  5:32 ` [PATCH 03/10] kconfig: refactor conf_write_symbol() Masahiro Yamada
@ 2021-10-01  5:32 ` Masahiro Yamada
  2021-10-01  5:32 ` [PATCH 05/10] kconfig: move sym_escape_string_value() to confdata.c Masahiro Yamada
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2021-10-01  5:32 UTC (permalink / raw)
  To: linux-kbuild; +Cc: Masahiro Yamada, linux-kernel

We can reuse __print_symbol() helper to print symbols for listnewconfig.
Only the difference is the format for "n" symbols.

This prints "CONFIG_FOO=n" instead of "# CONFIG_FOO is not set".

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

 scripts/kconfig/conf.c      | 14 ++------------
 scripts/kconfig/confdata.c  |  5 +++++
 scripts/kconfig/lkc_proto.h |  1 +
 3 files changed, 8 insertions(+), 12 deletions(-)

diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c
index 310fdd408793..971da3598fe4 100644
--- a/scripts/kconfig/conf.c
+++ b/scripts/kconfig/conf.c
@@ -646,18 +646,8 @@ static void check_conf(struct menu *menu)
 
 		switch (input_mode) {
 		case listnewconfig:
-			if (sym->name) {
-				const char *val = sym_get_string_value(sym);
-				char *escaped = NULL;
-
-				if (sym->type == S_STRING) {
-					escaped = sym_escape_string_value(val);
-					val = escaped;
-				}
-
-				printf("%s%s=%s\n", CONFIG_, sym->name, val);
-				free(escaped);
-			}
+			if (sym->name)
+				print_symbol_for_listconfig(sym);
 			break;
 		case helpnewconfig:
 			printf("-----\n");
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index ce11e7442d12..adbb9a955c43 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -667,6 +667,11 @@ static void print_symbol_for_autoconf(FILE *fp, struct symbol *sym)
 	__print_symbol(fp, sym, OUTPUT_N_NONE, true);
 }
 
+void print_symbol_for_listconfig(struct symbol *sym)
+{
+	__print_symbol(stdout, sym, OUTPUT_N, true);
+}
+
 static void print_symbol_for_c(FILE *fp, struct symbol *sym)
 {
 	const char *val;
diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h
index e6955df49973..ec4a01bb60ce 100644
--- a/scripts/kconfig/lkc_proto.h
+++ b/scripts/kconfig/lkc_proto.h
@@ -19,6 +19,7 @@ extern struct symbol * symbol_hash[SYMBOL_HASHSIZE];
 struct symbol * sym_lookup(const char *name, int flags);
 struct symbol * sym_find(const char *name);
 char *sym_escape_string_value(const char *in);
+void print_symbol_for_listconfig(struct symbol *sym);
 struct symbol ** sym_re_search(const char *pattern);
 const char * sym_type_name(enum symbol_type type);
 void sym_calc_value(struct symbol *sym);
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 05/10] kconfig: move sym_escape_string_value() to confdata.c
  2021-10-01  5:32 [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value() Masahiro Yamada
                   ` (2 preceding siblings ...)
  2021-10-01  5:32 ` [PATCH 04/10] kconfig: refactor listnewconfig code Masahiro Yamada
@ 2021-10-01  5:32 ` Masahiro Yamada
  2021-10-01  5:32 ` [PATCH 06/10] kconfig: add conf_get_autoheader_name() Masahiro Yamada
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2021-10-01  5:32 UTC (permalink / raw)
  To: linux-kbuild; +Cc: Masahiro Yamada, linux-kernel

Now that sym_escape_string_value() is only used in confdata.c
it can be a 'static' function.

Rename it escape_string_value() because it is agnostic about
(struct sym *).

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

 scripts/kconfig/confdata.c  | 47 +++++++++++++++++++++++++++++++++++--
 scripts/kconfig/lkc_proto.h |  1 -
 scripts/kconfig/symbol.c    | 44 ----------------------------------
 3 files changed, 45 insertions(+), 47 deletions(-)

diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index adbb9a955c43..78af1dd68894 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -620,6 +620,49 @@ static void conf_write_heading(FILE *fp, const struct comment_style *cs)
 	fprintf(fp, "%s\n", cs->comment_block_end);
 }
 
+/* The returned pointer must be freed on the caller side */
+static char *escape_string_value(const char *in)
+{
+	const char *p;
+	char *out;
+	size_t len;
+
+	len = strlen(in) + strlen("\"\"") + 1;
+
+	p = in;
+	while (1) {
+		p += strcspn(p, "\"\\");
+
+		if (p[0] == '\0')
+			break;
+
+		len++;
+		p++;
+	}
+
+	out = xmalloc(len);
+	out[0] = '\0';
+
+	strcat(out, "\"");
+
+	p = in;
+	while (1) {
+		len = strcspn(p, "\"\\");
+		strncat(out, p, len);
+		p += len;
+
+		if (p[0] == '\0')
+			break;
+
+		strcat(out, "\\");
+		strncat(out, p++, 1);
+	}
+
+	strcat(out, "\"");
+
+	return out;
+}
+
 /*
  * Kconfig configuration printer
  *
@@ -648,7 +691,7 @@ static void __print_symbol(FILE *fp, struct symbol *sym, enum output_n output_n,
 	}
 
 	if (sym->type == S_STRING && escape_string) {
-		escaped = sym_escape_string_value(val);
+		escaped = escape_string_value(val);
 		val = escaped;
 	}
 
@@ -702,7 +745,7 @@ static void print_symbol_for_c(FILE *fp, struct symbol *sym)
 			val_prefix = "0x";
 		break;
 	case S_STRING:
-		escaped = sym_escape_string_value(val);
+		escaped = escape_string_value(val);
 		val = escaped;
 	default:
 		break;
diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h
index ec4a01bb60ce..edd1e617b25c 100644
--- a/scripts/kconfig/lkc_proto.h
+++ b/scripts/kconfig/lkc_proto.h
@@ -18,7 +18,6 @@ extern struct symbol * symbol_hash[SYMBOL_HASHSIZE];
 
 struct symbol * sym_lookup(const char *name, int flags);
 struct symbol * sym_find(const char *name);
-char *sym_escape_string_value(const char *in);
 void print_symbol_for_listconfig(struct symbol *sym);
 struct symbol ** sym_re_search(const char *pattern);
 const char * sym_type_name(enum symbol_type type);
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
index 6bf8665a6a0f..0572330bf8a7 100644
--- a/scripts/kconfig/symbol.c
+++ b/scripts/kconfig/symbol.c
@@ -871,50 +871,6 @@ struct symbol *sym_find(const char *name)
 	return symbol;
 }
 
-/* The returned pointer must be freed on the caller side */
-char *sym_escape_string_value(const char *in)
-{
-	const char *p;
-	size_t reslen;
-	char *res;
-	size_t l;
-
-	reslen = strlen(in) + strlen("\"\"") + 1;
-
-	p = in;
-	for (;;) {
-		l = strcspn(p, "\"\\");
-		p += l;
-
-		if (p[0] == '\0')
-			break;
-
-		reslen++;
-		p++;
-	}
-
-	res = xmalloc(reslen);
-	res[0] = '\0';
-
-	strcat(res, "\"");
-
-	p = in;
-	for (;;) {
-		l = strcspn(p, "\"\\");
-		strncat(res, p, l);
-		p += l;
-
-		if (p[0] == '\0')
-			break;
-
-		strcat(res, "\\");
-		strncat(res, p++, 1);
-	}
-
-	strcat(res, "\"");
-	return res;
-}
-
 struct sym_match {
 	struct symbol	*sym;
 	off_t		so, eo;
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 06/10] kconfig: add conf_get_autoheader_name()
  2021-10-01  5:32 [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value() Masahiro Yamada
                   ` (3 preceding siblings ...)
  2021-10-01  5:32 ` [PATCH 05/10] kconfig: move sym_escape_string_value() to confdata.c Masahiro Yamada
@ 2021-10-01  5:32 ` Masahiro Yamada
  2021-10-01  5:32 ` [PATCH 07/10] kconfig: refactor conf_write_autoconf() Masahiro Yamada
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2021-10-01  5:32 UTC (permalink / raw)
  To: linux-kbuild; +Cc: Masahiro Yamada, linux-kernel

For consistency with conf_get_autoconfig_name()

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

 scripts/kconfig/confdata.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index 78af1dd68894..2c518aaa5255 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -223,6 +223,13 @@ static const char *conf_get_autoconfig_name(void)
 	return name ? name : "include/config/auto.conf";
 }
 
+static const char *conf_get_autoheader_name(void)
+{
+	char *name = getenv("KCONFIG_AUTOHEADER");
+
+	return name ? name : "include/generated/autoconf.h";
+}
+
 static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
 {
 	char *p2;
@@ -1092,9 +1099,7 @@ int conf_write_autoconf(int overwrite)
 	fclose(out);
 	fclose(out_h);
 
-	name = getenv("KCONFIG_AUTOHEADER");
-	if (!name)
-		name = "include/generated/autoconf.h";
+	name = conf_get_autoheader_name();
 	if (make_parent_dir(name))
 		return 1;
 	if (rename(".tmpconfig.h", name))
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 07/10] kconfig: refactor conf_write_autoconf()
  2021-10-01  5:32 [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value() Masahiro Yamada
                   ` (4 preceding siblings ...)
  2021-10-01  5:32 ` [PATCH 06/10] kconfig: add conf_get_autoheader_name() Masahiro Yamada
@ 2021-10-01  5:32 ` Masahiro Yamada
  2021-10-01  5:32 ` [PATCH 08/10] kconfig: refactor conf_write_dep() Masahiro Yamada
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2021-10-01  5:32 UTC (permalink / raw)
  To: linux-kbuild; +Cc: Masahiro Yamada, linux-kernel

This function does similar for auto.conf and autoconf.h

Create __conf_write_autoconf() helper to factor out the common code.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

 scripts/kconfig/confdata.c | 94 +++++++++++++++++++++++---------------
 1 file changed, 57 insertions(+), 37 deletions(-)

diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index 2c518aaa5255..6eb2c806fec0 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -1058,13 +1058,53 @@ static int conf_touch_deps(void)
 	return 0;
 }
 
+static int __conf_write_autoconf(const char *filename,
+				 void (*print_symbol)(FILE *, struct symbol *),
+				 const struct comment_style *comment_style)
+{
+	char tmp[PATH_MAX];
+	FILE *file;
+	struct symbol *sym;
+	int ret, i;
+
+	if (make_parent_dir(filename))
+		return -1;
+
+	ret = snprintf(tmp, sizeof(tmp), "%s.tmp", filename);
+	if (ret >= sizeof(tmp)) /* check truncation */
+		return -1;
+
+	file = fopen(tmp, "w");
+	if (!file) {
+		perror("fopen");
+		return -1;
+	}
+
+	conf_write_heading(file, comment_style);
+
+	for_all_symbols(i, sym)
+		if ((sym->flags & SYMBOL_WRITE) && sym->name)
+			print_symbol(file, sym);
+
+	/* check possible errors in conf_write_heading() and print_symbol() */
+	if (ferror(file))
+		return -1;
+
+	fclose(file);
+
+	if (rename(tmp, filename)) {
+		perror("rename");
+		return -1;
+	}
+
+	return 0;
+}
+
 int conf_write_autoconf(int overwrite)
 {
 	struct symbol *sym;
-	const char *name;
 	const char *autoconf_name = conf_get_autoconfig_name();
-	FILE *out, *out_h;
-	int i;
+	int ret, i;
 
 	if (!overwrite && is_present(autoconf_name))
 		return 0;
@@ -1074,45 +1114,25 @@ int conf_write_autoconf(int overwrite)
 	if (conf_touch_deps())
 		return 1;
 
-	out = fopen(".tmpconfig", "w");
-	if (!out)
-		return 1;
-
-	out_h = fopen(".tmpconfig.h", "w");
-	if (!out_h) {
-		fclose(out);
-		return 1;
-	}
-
-	conf_write_heading(out, &comment_style_pound);
-	conf_write_heading(out_h, &comment_style_c);
-
-	for_all_symbols(i, sym) {
+	for_all_symbols(i, sym)
 		sym_calc_value(sym);
-		if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
-			continue;
 
-		/* write symbols to auto.conf and autoconf.h */
-		print_symbol_for_autoconf(out, sym);
-		print_symbol_for_c(out_h, sym);
-	}
-	fclose(out);
-	fclose(out_h);
-
-	name = conf_get_autoheader_name();
-	if (make_parent_dir(name))
-		return 1;
-	if (rename(".tmpconfig.h", name))
-		return 1;
+	ret = __conf_write_autoconf(conf_get_autoheader_name(),
+				    print_symbol_for_c,
+				    &comment_style_c);
+	if (ret)
+		return ret;
 
-	if (make_parent_dir(autoconf_name))
-		return 1;
 	/*
-	 * This must be the last step, kbuild has a dependency on auto.conf
-	 * and this marks the successful completion of the previous steps.
+	 * Create include/config/auto.conf. This must be the last step because
+	 * Kbuild has a dependency on auto.conf and this marks the successful
+	 * completion of the previous steps.
 	 */
-	if (rename(".tmpconfig", autoconf_name))
-		return 1;
+	ret = __conf_write_autoconf(conf_get_autoconfig_name(),
+				    print_symbol_for_autoconf,
+				    &comment_style_pound);
+	if (ret)
+		return ret;
 
 	return 0;
 }
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 08/10] kconfig: refactor conf_write_dep()
  2021-10-01  5:32 [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value() Masahiro Yamada
                   ` (5 preceding siblings ...)
  2021-10-01  5:32 ` [PATCH 07/10] kconfig: refactor conf_write_autoconf() Masahiro Yamada
@ 2021-10-01  5:32 ` Masahiro Yamada
  2021-10-01  5:32 ` [PATCH 09/10] kconfig: refactor conf_touch_dep() Masahiro Yamada
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2021-10-01  5:32 UTC (permalink / raw)
  To: linux-kbuild; +Cc: Masahiro Yamada, linux-kernel

The if ... else inside the for-loop is unneeded because one empty
line is placed after printing the last element of deps_config.

Currently, all errors in conf_write_dep() are ignored. Add proper
error checks.

Rename it to conf_write_autoconf_cmd(), which is more intuitive.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

 scripts/kconfig/confdata.c | 54 ++++++++++++++++++++++++++------------
 1 file changed, 37 insertions(+), 17 deletions(-)

diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index 6eb2c806fec0..75e45e69d660 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -957,32 +957,50 @@ int conf_write(const char *name)
 }
 
 /* write a dependency file as used by kbuild to track dependencies */
-static int conf_write_dep(const char *name)
+static int conf_write_autoconf_cmd(const char *autoconf_name)
 {
+	char name[PATH_MAX], tmp[PATH_MAX];
 	struct file *file;
 	FILE *out;
+	int ret;
 
-	out = fopen("..config.tmp", "w");
-	if (!out)
-		return 1;
-	fprintf(out, "deps_config := \\\n");
-	for (file = file_list; file; file = file->next) {
-		if (file->next)
-			fprintf(out, "\t%s \\\n", file->name);
-		else
-			fprintf(out, "\t%s\n", file->name);
+	ret = snprintf(name, sizeof(name), "%s.cmd", autoconf_name);
+	if (ret >= sizeof(name)) /* check truncation */
+		return -1;
+
+	if (make_parent_dir(name))
+		return -1;
+
+	ret = snprintf(tmp, sizeof(tmp), "%s.cmd.tmp", autoconf_name);
+	if (ret >= sizeof(tmp)) /* check truncation */
+		return -1;
+
+	out = fopen(tmp, "w");
+	if (!out) {
+		perror("fopen");
+		return -1;
 	}
-	fprintf(out, "\n%s: \\\n"
-		     "\t$(deps_config)\n\n", conf_get_autoconfig_name());
 
-	env_write_dep(out, conf_get_autoconfig_name());
+	fprintf(out, "deps_config := \\\n");
+	for (file = file_list; file; file = file->next)
+		fprintf(out, "\t%s \\\n", file->name);
+
+	fprintf(out, "\n%s: $(deps_config)\n\n", autoconf_name);
+
+	env_write_dep(out, autoconf_name);
 
 	fprintf(out, "\n$(deps_config): ;\n");
+
+	if (ferror(out)) /* error check for all fprintf() calls */
+		return -1;
+
 	fclose(out);
 
-	if (make_parent_dir(name))
-		return 1;
-	rename("..config.tmp", name);
+	if (rename(tmp, name)) {
+		perror("rename");
+		return -1;
+	}
+
 	return 0;
 }
 
@@ -1109,7 +1127,9 @@ int conf_write_autoconf(int overwrite)
 	if (!overwrite && is_present(autoconf_name))
 		return 0;
 
-	conf_write_dep("include/config/auto.conf.cmd");
+	ret = conf_write_autoconf_cmd(autoconf_name);
+	if (ret)
+		return -1;
 
 	if (conf_touch_deps())
 		return 1;
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 09/10] kconfig: refactor conf_touch_dep()
  2021-10-01  5:32 [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value() Masahiro Yamada
                   ` (6 preceding siblings ...)
  2021-10-01  5:32 ` [PATCH 08/10] kconfig: refactor conf_write_dep() Masahiro Yamada
@ 2021-10-01  5:32 ` Masahiro Yamada
  2021-10-01  5:32 ` [PATCH 10/10] [for next only] kconfig: generate include/generated/rustc_cfg Masahiro Yamada
  2021-10-05 15:37 ` [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value() Masahiro Yamada
  9 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2021-10-01  5:32 UTC (permalink / raw)
  To: linux-kbuild; +Cc: Masahiro Yamada, linux-kernel

If this function fails to touch a dummy header due to missing parent
directory, then it creates it and touches the file again.

This was needed because CONFIG_FOO_BAR was previously tracked by
include/config/foo/bar.h. (include/config/foo/ may not exist here)

This is no longer the case since commit 0e0345b77ac4 ("kbuild: redo
fake deps at include/config/*.h"); now all the fake headers are placed
right under include/config/, like include/config/FOO_BAR.

Do not try to create parent directory, include/config/, which already
exists.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

 scripts/kconfig/confdata.c | 22 ++++------------------
 1 file changed, 4 insertions(+), 18 deletions(-)

diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index 75e45e69d660..9ece2f3b61a6 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -130,31 +130,17 @@ static size_t depfile_prefix_len;
 /* touch depfile for symbol 'name' */
 static int conf_touch_dep(const char *name)
 {
-	int fd, ret;
-	char *d;
+	int fd;
 
 	/* check overflow: prefix + name + '\0' must fit in buffer. */
 	if (depfile_prefix_len + strlen(name) + 1 > sizeof(depfile_path))
 		return -1;
 
-	d = depfile_path + depfile_prefix_len;
-	strcpy(d, name);
+	strcpy(depfile_path + depfile_prefix_len, name);
 
-	/* Assume directory path already exists. */
 	fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
-	if (fd == -1) {
-		if (errno != ENOENT)
-			return -1;
-
-		ret = make_parent_dir(depfile_path);
-		if (ret)
-			return ret;
-
-		/* Try it again. */
-		fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
-		if (fd == -1)
-			return -1;
-	}
+	if (fd == -1)
+		return -1;
 	close(fd);
 
 	return 0;
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 10/10] [for next only] kconfig: generate include/generated/rustc_cfg
  2021-10-01  5:32 [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value() Masahiro Yamada
                   ` (7 preceding siblings ...)
  2021-10-01  5:32 ` [PATCH 09/10] kconfig: refactor conf_touch_dep() Masahiro Yamada
@ 2021-10-01  5:32 ` Masahiro Yamada
  2021-10-01 11:28   ` n.schier
  2021-10-05 15:37 ` [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value() Masahiro Yamada
  9 siblings, 1 reply; 16+ messages in thread
From: Masahiro Yamada @ 2021-10-01  5:32 UTC (permalink / raw)
  To: linux-kbuild; +Cc: Masahiro Yamada, linux-kernel

This patch is not intended for the mainline.

I created this patch for Stephen Rothwell to resolve the merge
conflicts more easily.

The Rust tree is touching scripts/kconfig/confdata.c to generate
include/generated/rustc_cfg, which would cause complicated conflicts
with changes from the kbuild tree.

I re-implemented it to produce the equaivalent rustc_cfg.

I also fixed the memory leak; the original code from the Rust tree
did not free the malloc'ed pointer.

Stephen:
When you resolve the conflicts in confdata.c, please take this one.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

 scripts/kconfig/confdata.c | 42 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index 9ece2f3b61a6..4767f3810cf4 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -603,6 +603,9 @@ static const struct comment_style comment_style_c = {
 
 static void conf_write_heading(FILE *fp, const struct comment_style *cs)
 {
+	if (!cs) /* no heading for rustc_cfg? */
+		return;
+
 	fprintf(fp, "%s\n", cs->comment_block_begin);
 
 	fprintf(fp, "%s Automatically generated file; DO NOT EDIT.\n",
@@ -750,6 +753,39 @@ static void print_symbol_for_c(FILE *fp, struct symbol *sym)
 	free(escaped);
 }
 
+/* rustc configuration */
+static void print_symbol_for_rustc_cfg(FILE *fp, struct symbol *sym)
+{
+	const char *val;
+	char *escaped;
+
+	if (sym->type == S_UNKNOWN)
+		return;
+
+	val = sym_get_string_value(sym);
+	escaped = escape_string_value(val);
+
+	if (sym->type == S_BOOLEAN || sym->type == S_TRISTATE) {
+		if (*val == 'n')
+			return;
+
+		/*
+		 * To have similar functionality to the C macro `IS_ENABLED()`
+		 * we provide an empty `--cfg CONFIG_X` here in both `y`
+		 * and `m` cases.
+		 *
+		 * Then, the common `fprintf()` below will also give us
+		 * a `--cfg CONFIG_X="y"` or `--cfg CONFIG_X="m"`, which can
+		 * be used as the equivalent of `IS_BUILTIN()`/`IS_MODULE()`.
+		 */
+		fprintf(fp, "--cfg=%s%s\n", CONFIG_, sym->name);
+	}
+
+	fprintf(fp, "--cfg=%s%s=%s\n", CONFIG_, sym->name, escaped);
+
+	free(escaped);
+}
+
 /*
  * Write out a minimal config.
  * All values that has default values are skipped as this is redundant.
@@ -1129,6 +1165,12 @@ int conf_write_autoconf(int overwrite)
 	if (ret)
 		return ret;
 
+	ret = __conf_write_autoconf("include/generated/rustc_cfg",
+				    print_symbol_for_rustc_cfg,
+				    NULL);
+	if (ret)
+		return ret;
+
 	/*
 	 * Create include/config/auto.conf. This must be the last step because
 	 * Kbuild has a dependency on auto.conf and this marks the successful
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH 10/10] [for next only] kconfig: generate include/generated/rustc_cfg
  2021-10-01  5:32 ` [PATCH 10/10] [for next only] kconfig: generate include/generated/rustc_cfg Masahiro Yamada
@ 2021-10-01 11:28   ` n.schier
  2021-10-02  8:59     ` Masahiro Yamada
  0 siblings, 1 reply; 16+ messages in thread
From: n.schier @ 2021-10-01 11:28 UTC (permalink / raw)
  To: Masahiro Yamada; +Cc: linux-kbuild, linux-kernel

On Fri, Oct 01, 2021 at 02:32:53PM +0900, Masahiro Yamada wrote:
> This patch is not intended for the mainline.
> 
> I created this patch for Stephen Rothwell to resolve the merge
> conflicts more easily.
> 
> The Rust tree is touching scripts/kconfig/confdata.c to generate
> include/generated/rustc_cfg, which would cause complicated conflicts
> with changes from the kbuild tree.
> 
> I re-implemented it to produce the equaivalent rustc_cfg.
> 
> I also fixed the memory leak; the original code from the Rust tree
> did not free the malloc'ed pointer.
> 
> Stephen:
> When you resolve the conflicts in confdata.c, please take this one.
> 
> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> ---
> 
>  scripts/kconfig/confdata.c | 42 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 42 insertions(+)
> 
> diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
> index 9ece2f3b61a6..4767f3810cf4 100644
> --- a/scripts/kconfig/confdata.c
> +++ b/scripts/kconfig/confdata.c
> @@ -603,6 +603,9 @@ static const struct comment_style comment_style_c = {
>  
>  static void conf_write_heading(FILE *fp, const struct comment_style *cs)
>  {
> +	if (!cs) /* no heading for rustc_cfg? */
> +		return;
> +
>  	fprintf(fp, "%s\n", cs->comment_block_begin);
>  
>  	fprintf(fp, "%s Automatically generated file; DO NOT EDIT.\n",
> @@ -750,6 +753,39 @@ static void print_symbol_for_c(FILE *fp, struct symbol *sym)
>  	free(escaped);
>  }
>  
> +/* rustc configuration */
> +static void print_symbol_for_rustc_cfg(FILE *fp, struct symbol *sym)
> +{
> +	const char *val;
> +	char *escaped;
> +
> +	if (sym->type == S_UNKNOWN)
> +		return;
> +
> +	val = sym_get_string_value(sym);
> +	escaped = escape_string_value(val);
> +
> +	if (sym->type == S_BOOLEAN || sym->type == S_TRISTATE) {
> +		if (*val == 'n')
> +			return;

I'd expect a "free(escaped);" here.

> +
> +		/*
> +		 * To have similar functionality to the C macro `IS_ENABLED()`
> +		 * we provide an empty `--cfg CONFIG_X` here in both `y`
> +		 * and `m` cases.
> +		 *
> +		 * Then, the common `fprintf()` below will also give us
> +		 * a `--cfg CONFIG_X="y"` or `--cfg CONFIG_X="m"`, which can
> +		 * be used as the equivalent of `IS_BUILTIN()`/`IS_MODULE()`.
> +		 */
> +		fprintf(fp, "--cfg=%s%s\n", CONFIG_, sym->name);
> +	}
> +
> +	fprintf(fp, "--cfg=%s%s=%s\n", CONFIG_, sym->name, escaped);
> +
> +	free(escaped);
> +}
> +
>  /*
>   * Write out a minimal config.
>   * All values that has default values are skipped as this is redundant.
> @@ -1129,6 +1165,12 @@ int conf_write_autoconf(int overwrite)
>  	if (ret)
>  		return ret;
>  
> +	ret = __conf_write_autoconf("include/generated/rustc_cfg",
> +				    print_symbol_for_rustc_cfg,
> +				    NULL);
> +	if (ret)
> +		return ret;
> +
>  	/*
>  	 * Create include/config/auto.conf. This must be the last step because
>  	 * Kbuild has a dependency on auto.conf and this marks the successful
> -- 
> 2.30.2
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 10/10] [for next only] kconfig: generate include/generated/rustc_cfg
  2021-10-01 11:28   ` n.schier
@ 2021-10-02  8:59     ` Masahiro Yamada
  0 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2021-10-02  8:59 UTC (permalink / raw)
  To: Nicolas Schier; +Cc: Linux Kbuild mailing list, Linux Kernel Mailing List

On Fri, Oct 1, 2021 at 8:29 PM <n.schier@avm.de> wrote:
>
> On Fri, Oct 01, 2021 at 02:32:53PM +0900, Masahiro Yamada wrote:
> > This patch is not intended for the mainline.
> >
> > I created this patch for Stephen Rothwell to resolve the merge
> > conflicts more easily.
> >
> > The Rust tree is touching scripts/kconfig/confdata.c to generate
> > include/generated/rustc_cfg, which would cause complicated conflicts
> > with changes from the kbuild tree.
> >
> > I re-implemented it to produce the equaivalent rustc_cfg.
> >
> > I also fixed the memory leak; the original code from the Rust tree
> > did not free the malloc'ed pointer.
> >
> > Stephen:
> > When you resolve the conflicts in confdata.c, please take this one.
> >
> > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> > ---
> >
> >  scripts/kconfig/confdata.c | 42 ++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 42 insertions(+)
> >
> > diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
> > index 9ece2f3b61a6..4767f3810cf4 100644
> > --- a/scripts/kconfig/confdata.c
> > +++ b/scripts/kconfig/confdata.c
> > @@ -603,6 +603,9 @@ static const struct comment_style comment_style_c = {
> >
> >  static void conf_write_heading(FILE *fp, const struct comment_style *cs)
> >  {
> > +     if (!cs) /* no heading for rustc_cfg? */
> > +             return;
> > +
> >       fprintf(fp, "%s\n", cs->comment_block_begin);
> >
> >       fprintf(fp, "%s Automatically generated file; DO NOT EDIT.\n",
> > @@ -750,6 +753,39 @@ static void print_symbol_for_c(FILE *fp, struct symbol *sym)
> >       free(escaped);
> >  }
> >
> > +/* rustc configuration */
> > +static void print_symbol_for_rustc_cfg(FILE *fp, struct symbol *sym)
> > +{
> > +     const char *val;
> > +     char *escaped;
> > +
> > +     if (sym->type == S_UNKNOWN)
> > +             return;
> > +
> > +     val = sym_get_string_value(sym);
> > +     escaped = escape_string_value(val);
> > +
> > +     if (sym->type == S_BOOLEAN || sym->type == S_TRISTATE) {
> > +             if (*val == 'n')
> > +                     return;
>
> I'd expect a "free(escaped);" here.


Thank you for catching it.

I just sent v2.





-- 
Best Regards
Masahiro Yamada

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value()
  2021-10-01  5:32 [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value() Masahiro Yamada
                   ` (8 preceding siblings ...)
  2021-10-01  5:32 ` [PATCH 10/10] [for next only] kconfig: generate include/generated/rustc_cfg Masahiro Yamada
@ 2021-10-05 15:37 ` Masahiro Yamada
  9 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2021-10-05 15:37 UTC (permalink / raw)
  To: Linux Kbuild mailing list; +Cc: Linux Kernel Mailing List

On Fri, Oct 1, 2021 at 2:33 PM Masahiro Yamada <masahiroy@kernel.org> wrote:
>
> sym_escape_string_value() returns a malloc'ed memory, but as
> (const char *). So, it must be casted to (void *) when it is free'd.
> This is odd.
>
> The return type of sym_escape_string_value() should be (char *).
>
> I exploited that free(NULL) has no effect.
>
> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> ---


All applied to linux-kbuild.

I pushed 10/10 v3 to the for-next branch.


>
>  scripts/kconfig/conf.c      | 15 +++++++--------
>  scripts/kconfig/confdata.c  | 27 ++++++++++++++-------------
>  scripts/kconfig/lkc_proto.h |  2 +-
>  scripts/kconfig/symbol.c    |  3 ++-
>  4 files changed, 24 insertions(+), 23 deletions(-)
>
> diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c
> index 5d84b44a2a2a..310fdd408793 100644
> --- a/scripts/kconfig/conf.c
> +++ b/scripts/kconfig/conf.c
> @@ -647,17 +647,16 @@ static void check_conf(struct menu *menu)
>                 switch (input_mode) {
>                 case listnewconfig:
>                         if (sym->name) {
> -                               const char *str;
> +                               const char *val = sym_get_string_value(sym);
> +                               char *escaped = NULL;
>
>                                 if (sym->type == S_STRING) {
> -                                       str = sym_get_string_value(sym);
> -                                       str = sym_escape_string_value(str);
> -                                       printf("%s%s=%s\n", CONFIG_, sym->name, str);
> -                                       free((void *)str);
> -                               } else {
> -                                       str = sym_get_string_value(sym);
> -                                       printf("%s%s=%s\n", CONFIG_, sym->name, str);
> +                                       escaped = sym_escape_string_value(val);
> +                                       val = escaped;
>                                 }
> +
> +                               printf("%s%s=%s\n", CONFIG_, sym->name, val);
> +                               free(escaped);
>                         }
>                         break;
>                 case helpnewconfig:
> diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
> index cf72680cd769..9b2271eb43d6 100644
> --- a/scripts/kconfig/confdata.c
> +++ b/scripts/kconfig/confdata.c
> @@ -728,21 +728,22 @@ static struct conf_printer header_printer_cb =
>  static void conf_write_symbol(FILE *fp, struct symbol *sym,
>                               struct conf_printer *printer, void *printer_arg)
>  {
> -       const char *str;
> +       const char *val;
> +       char *escaped = NULL;
>
> -       switch (sym->type) {
> -       case S_UNKNOWN:
> -               break;
> -       case S_STRING:
> -               str = sym_get_string_value(sym);
> -               str = sym_escape_string_value(str);
> -               printer->print_symbol(fp, sym, str, printer_arg);
> -               free((void *)str);
> -               break;
> -       default:
> -               str = sym_get_string_value(sym);
> -               printer->print_symbol(fp, sym, str, printer_arg);
> +       if (sym->type == S_UNKNOWN)
> +               return;
> +
> +       val = sym_get_string_value(sym);
> +
> +       if (sym->type == S_STRING) {
> +               escaped = sym_escape_string_value(val);
> +               val = escaped;
>         }
> +
> +       printer->print_symbol(fp, sym, val, printer_arg);
> +
> +       free(escaped);
>  }
>
>  static void
> diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h
> index a11626bdc421..e6955df49973 100644
> --- a/scripts/kconfig/lkc_proto.h
> +++ b/scripts/kconfig/lkc_proto.h
> @@ -18,7 +18,7 @@ extern struct symbol * symbol_hash[SYMBOL_HASHSIZE];
>
>  struct symbol * sym_lookup(const char *name, int flags);
>  struct symbol * sym_find(const char *name);
> -const char * sym_escape_string_value(const char *in);
> +char *sym_escape_string_value(const char *in);
>  struct symbol ** sym_re_search(const char *pattern);
>  const char * sym_type_name(enum symbol_type type);
>  void sym_calc_value(struct symbol *sym);
> diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
> index 5844d636d38f..6bf8665a6a0f 100644
> --- a/scripts/kconfig/symbol.c
> +++ b/scripts/kconfig/symbol.c
> @@ -871,7 +871,8 @@ struct symbol *sym_find(const char *name)
>         return symbol;
>  }
>
> -const char *sym_escape_string_value(const char *in)
> +/* The returned pointer must be freed on the caller side */
> +char *sym_escape_string_value(const char *in)
>  {
>         const char *p;
>         size_t reslen;
> --
> 2.30.2
>


-- 
Best Regards
Masahiro Yamada

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 03/10] kconfig: refactor conf_write_symbol()
  2021-10-01  5:32 ` [PATCH 03/10] kconfig: refactor conf_write_symbol() Masahiro Yamada
@ 2021-10-28  5:16   ` Boris Kolpackov
  2021-11-05  8:46     ` Masahiro Yamada
  0 siblings, 1 reply; 16+ messages in thread
From: Boris Kolpackov @ 2021-10-28  5:16 UTC (permalink / raw)
  To: Masahiro Yamada; +Cc: linux-kbuild, linux-kernel

Masahiro Yamada <masahiroy@kernel.org> writes:

> +static void __print_symbol(FILE *fp, struct symbol *sym, enum output_n output_n,

Identifier that start with double underscore are reserved. The same
goes for __conf_write_autoconf() in another patch.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 03/10] kconfig: refactor conf_write_symbol()
  2021-10-28  5:16   ` Boris Kolpackov
@ 2021-11-05  8:46     ` Masahiro Yamada
  2021-11-05 11:40       ` Boris Kolpackov
  0 siblings, 1 reply; 16+ messages in thread
From: Masahiro Yamada @ 2021-11-05  8:46 UTC (permalink / raw)
  To: Boris Kolpackov; +Cc: Linux Kbuild mailing list, Linux Kernel Mailing List

On Thu, Oct 28, 2021 at 2:16 PM Boris Kolpackov <boris@codesynthesis.com> wrote:
>
> Masahiro Yamada <masahiroy@kernel.org> writes:
>
> > +static void __print_symbol(FILE *fp, struct symbol *sym, enum output_n output_n,
>
> Identifier that start with double underscore are reserved. The same
> goes for __conf_write_autoconf() in another patch.


Without this patch, there are some functions that start with double underscores.

For example,

  __expr_eliminate_eq() in scripts/kconfig/expr.c
  __expand_string()  in scripts/kconfig/preprocess.c

Are they problematic as well?


-- 
Best Regards
Masahiro Yamada

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 03/10] kconfig: refactor conf_write_symbol()
  2021-11-05  8:46     ` Masahiro Yamada
@ 2021-11-05 11:40       ` Boris Kolpackov
  0 siblings, 0 replies; 16+ messages in thread
From: Boris Kolpackov @ 2021-11-05 11:40 UTC (permalink / raw)
  To: Masahiro Yamada; +Cc: Linux Kbuild mailing list, Linux Kernel Mailing List

Masahiro Yamada <masahiroy@kernel.org> writes:

> Without this patch, there are some functions that start with double
> underscores.
> 
> For example,
> 
>   __expr_eliminate_eq() in scripts/kconfig/expr.c
>   __expand_string()  in scripts/kconfig/preprocess.c
> 
> Are they problematic as well?

Yes, they could be potentially problematic. Identifiers that start
with double underscores or with a single underscore followed by an
uppercase letter are reserved for use by the C implementation (for
example, as a pre-defined macro).

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2021-11-05 11:41 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-01  5:32 [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value() Masahiro Yamada
2021-10-01  5:32 ` [PATCH 02/10] kconfig: refactor conf_write_heading() Masahiro Yamada
2021-10-01  5:32 ` [PATCH 03/10] kconfig: refactor conf_write_symbol() Masahiro Yamada
2021-10-28  5:16   ` Boris Kolpackov
2021-11-05  8:46     ` Masahiro Yamada
2021-11-05 11:40       ` Boris Kolpackov
2021-10-01  5:32 ` [PATCH 04/10] kconfig: refactor listnewconfig code Masahiro Yamada
2021-10-01  5:32 ` [PATCH 05/10] kconfig: move sym_escape_string_value() to confdata.c Masahiro Yamada
2021-10-01  5:32 ` [PATCH 06/10] kconfig: add conf_get_autoheader_name() Masahiro Yamada
2021-10-01  5:32 ` [PATCH 07/10] kconfig: refactor conf_write_autoconf() Masahiro Yamada
2021-10-01  5:32 ` [PATCH 08/10] kconfig: refactor conf_write_dep() Masahiro Yamada
2021-10-01  5:32 ` [PATCH 09/10] kconfig: refactor conf_touch_dep() Masahiro Yamada
2021-10-01  5:32 ` [PATCH 10/10] [for next only] kconfig: generate include/generated/rustc_cfg Masahiro Yamada
2021-10-01 11:28   ` n.schier
2021-10-02  8:59     ` Masahiro Yamada
2021-10-05 15:37 ` [PATCH 01/10] kconfig: remove 'const' from the return type of sym_escape_string_value() Masahiro Yamada

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).