| diff -ur bash-4.3.30.dist/builtins/echo.def bash-4.3.30/builtins/echo.def |
| --- bash-4.3.30.dist/builtins/echo.def 2011-06-29 09:55:58.000000000 -0400 |
| +++ bash-4.3.30/builtins/echo.def 2016-06-03 17:40:57.834915855 -0400 |
| @@ -108,8 +108,10 @@ |
| echo_builtin (list) |
| WORD_LIST *list; |
| { |
| - int display_return, do_v9, i, len; |
| - char *temp, *s; |
| + int display_return, do_v9, i, j, len, malloc_len; |
| + char *temp, *s, *m; |
| + WORD_LIST *save_list; |
| + ssize_t ret; |
| |
| do_v9 = xpg_echo; |
| display_return = 1; |
| @@ -162,6 +164,30 @@ |
| clearerr (stdout); /* clear error before writing and testing success */ |
| |
| terminate_immediately++; |
| + malloc_len = 0; |
| + m = NULL; |
| + save_list = list; |
| + while (list) |
| + { |
| + i = len = 0; |
| + temp = do_v9 ? ansicstr (list->word->word, STRLEN (list->word->word), 1, &i, &len) |
| + : list->word->word; |
| + if (!temp) |
| + continue; |
| + malloc_len += do_v9 ? len : strlen(temp); |
| + if (do_v9) |
| + free (temp); |
| + list = list->next; |
| + if (list) |
| + malloc_len++; |
| + } |
| + if (display_return) |
| + malloc_len++; |
| + m = malloc(malloc_len); |
| + if (m == NULL) |
| + fatal_error ("echo: could not allocate %lu bytes", (unsigned long)malloc_len); |
| + list = save_list; |
| + j = 0; |
| while (list) |
| { |
| i = len = 0; |
| @@ -169,19 +195,13 @@ |
| : list->word->word; |
| if (temp) |
| { |
| - if (do_v9) |
| - { |
| - for (s = temp; len > 0; len--) |
| - putchar (*s++); |
| - } |
| - else |
| - printf ("%s", temp); |
| -#if defined (SunOS5) |
| - fflush (stdout); /* Fix for bug in SunOS 5.5 printf(3) */ |
| -#endif |
| + if (!do_v9) |
| + len = strlen(temp); |
| + memmove(m + j, temp, len); |
| + j += len; |
| + if (do_v9) |
| + free (temp); |
| } |
| - if (do_v9 && temp) |
| - free (temp); |
| list = list->next; |
| if (i) |
| { |
| @@ -189,11 +209,17 @@ |
| break; |
| } |
| if (list) |
| - putchar(' '); |
| + m[j++] = ' '; |
| } |
| - |
| if (display_return) |
| - putchar ('\n'); |
| + m[j++] = '\n'; |
| + ret = write(STDOUT_FILENO, m, j); |
| + if (ret < j) |
| + sh_wrerror(); |
| + free(m); |
| +#if defined (SunOS5) |
| + fflush (stdout); /* Fix for bug in SunOS 5.5 printf(3) */ |
| +#endif |
| |
| terminate_immediately--; |
| return (sh_chkwrite (EXECUTION_SUCCESS)); |