Re: [PATCH 3/5] scripts/kconfig/nconf: dynamically alloc dialog_input_result

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Hi,

On Tue, Aug 30, 2011 at 12:14 AM, Arnaud Lacombe <lacombar@xxxxxxxxx> wrote:
> Hi,
>
> On Mon, Aug 29, 2011 at 7:56 PM, Cheng Renquan <crquan@xxxxxxxxx> wrote:
>>  int dialog_inputbox(WINDOW *main_window,
>>                const char *title, const char *prompt,
>> -               const char *init, char *result, int result_len)
>> +               const char *init, char *result, int *result_len)
>>  {
> This all logic will not work, you need to have the following prototype:
>
> int dialog_inputbox(WINDOW *main_window,
>                const char *title, const char *prompt,
>                const char *init, char **result, int *result_len)
>
> as realloc(3) will give you a new pointer.
>
Attached diff should do the job, this also avoid to have to deal with
`dialog_input_result' initialization.

 - Arnaud

>  - Arnaud
>
diff --git a/scripts/kconfig/nconf.c b/scripts/kconfig/nconf.c
index 18bfb34..53251f0 100644
--- a/scripts/kconfig/nconf.c
+++ b/scripts/kconfig/nconf.c
@@ -717,7 +717,7 @@ static void search_conf(void)
 			_("Search Configuration Parameter"),
 			_("Enter " CONFIG_ " (sub)string to search for "
 				"(with or without \"" CONFIG_ "\")"),
-			"", dialog_input_result, &dialog_input_result_len);
+			"", &dialog_input_result, &dialog_input_result_len);
 	switch (dres) {
 	case 0:
 		break;
@@ -1384,7 +1384,7 @@ static void conf_string(struct menu *menu)
 				prompt ? _(prompt) : _("Main Menu"),
 				heading,
 				sym_get_string_value(menu->sym),
-				dialog_input_result,
+				&dialog_input_result,
 				&dialog_input_result_len);
 		switch (res) {
 		case 0:
@@ -1410,7 +1410,7 @@ static void conf_load(void)
 		res = dialog_inputbox(main_window,
 				NULL, load_config_text,
 				filename,
-				dialog_input_result,
+				&dialog_input_result,
 				&dialog_input_result_len);
 		switch (res) {
 		case 0:
@@ -1441,7 +1441,7 @@ static void conf_save(void)
 		res = dialog_inputbox(main_window,
 				NULL, save_config_text,
 				filename,
-				dialog_input_result,
+				&dialog_input_result,
 				&dialog_input_result_len);
 		switch (res) {
 		case 0:
@@ -1508,15 +1508,6 @@ int main(int ac, char **av)
 			single_menu_mode = 1;
 	}
 
-	/* initially alloc 2048 bytes for dialog_input_result */
-	dialog_input_result_len = 2048;
-	dialog_input_result = malloc(dialog_input_result_len);
-	if (!dialog_input_result) {
-		fprintf(stderr, "Not enough memory for dialog_input_result(%d)\n",
-			dialog_input_result_len);
-		exit(1);
-	}
-
 	/* Initialize curses */
 	initscr();
 	/* set color theme */
diff --git a/scripts/kconfig/nconf.gui.c b/scripts/kconfig/nconf.gui.c
index 909c85f..8ae8d62 100644
--- a/scripts/kconfig/nconf.gui.c
+++ b/scripts/kconfig/nconf.gui.c
@@ -356,7 +356,7 @@ int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...)
 
 int dialog_inputbox(WINDOW *main_window,
 		const char *title, const char *prompt,
-		const char *init, char *result, int *result_len)
+		const char *init, char **resultp, int *result_len)
 {
 	int prompt_lines = 0;
 	int prompt_width = 0;
@@ -368,16 +368,16 @@ int dialog_inputbox(WINDOW *main_window,
 	int res = -1;
 	int cursor_position = strlen(init);
 	int cursor_form_win;
+	char *result = *resultp;
 
-	if (strlen(init) > *result_len) {
-		do {
-			*result_len *= 2;
-		} while (strlen(init) > *result_len);
+	if (strlen(init) + 1 > *result_len) {
+		*result_len = strlen(init) + 1;
 		result = realloc(result, *result_len);
-		/* here didn't check result, if it's NULL,
-		   just let it silently fail (SegFault) */
+		*resultp = result;
 	}
 
@@ -480,11 +480,9 @@ int dialog_inputbox(WINDOW *main_window,
 			if ((isgraph(res) || isspace(res))) {
 				/* one for new char, one for '\0' */
 				if (len+2 > *result_len) {
-					do {
-						*result_len *= 2;
-					} while (len+2 > *result_len);
+					*result_len = len+2;
 					result = realloc(result, *result_len);
-					/* silently fail in the same way above */
+					*resultp = result;
 				}
 				/* insert the char at the proper position */
 				memmove(&result[cursor_position+1],
diff --git a/scripts/kconfig/nconf.h b/scripts/kconfig/nconf.h
index 98b2c23..0d52617 100644
--- a/scripts/kconfig/nconf.h
+++ b/scripts/kconfig/nconf.h
@@ -89,7 +89,7 @@ void fill_window(WINDOW *win, const char *text);
 int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...);
 int dialog_inputbox(WINDOW *main_window,
 		const char *title, const char *prompt,
-		const char *init, char *result, int *result_len);
+		const char *init, char **resultp, int *result_len);
 void refresh_all_windows(WINDOW *main_window);
 void show_scroll_win(WINDOW *main_window,
 		const char *title,

[Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]    [Yosemite Photos]    [Free Online Dating]     [Linux Kernel]     [Linux SCSI]     [XFree86]

Add to Google Powered by Linux