bash: Handle errors in echo
[akaros.git] / tools / sys-apps / bash / akaros-patches / 4.3.30 / 0002-echo.patch
1 diff -ur bash-4.3.30.dist/builtins/echo.def bash-4.3.30/builtins/echo.def
2 --- bash-4.3.30.dist/builtins/echo.def  2011-06-29 09:55:58.000000000 -0400
3 +++ bash-4.3.30/builtins/echo.def       2016-06-03 17:40:57.834915855 -0400
4 @@ -108,8 +108,10 @@
5  echo_builtin (list)
6       WORD_LIST *list;
7  {
8 -  int display_return, do_v9, i, len;
9 -  char *temp, *s;
10 +  int display_return, do_v9, i, j, len, malloc_len;
11 +  char *temp, *s, *m;
12 +  WORD_LIST *save_list;
13 +  ssize_t ret;
14  
15    do_v9 = xpg_echo;
16    display_return = 1;
17 @@ -162,6 +164,30 @@
18    clearerr (stdout);   /* clear error before writing and testing success */
19  
20    terminate_immediately++;
21 +  malloc_len = 0;
22 +  m = NULL;
23 +  save_list = list;
24 +  while (list)
25 +    {
26 +      i = len = 0;
27 +      temp = do_v9 ? ansicstr (list->word->word, STRLEN (list->word->word), 1, &i, &len)
28 +                  : list->word->word;
29 +      if (!temp)
30 +        continue;
31 +      malloc_len += do_v9 ? len : strlen(temp);
32 +      if (do_v9)
33 +       free (temp);
34 +      list = list->next;
35 +      if (list)
36 +        malloc_len++;
37 +    }
38 +  if (display_return)
39 +    malloc_len++;
40 +  m = malloc(malloc_len);
41 +  if (m == NULL)
42 +    fatal_error ("echo: could not allocate %lu bytes", (unsigned long)malloc_len);
43 +  list = save_list;
44 +  j = 0;
45    while (list)
46      {
47        i = len = 0;
48 @@ -169,19 +195,13 @@
49                    : list->word->word;
50        if (temp)
51         {
52 -         if (do_v9)
53 -           {
54 -             for (s = temp; len > 0; len--)
55 -               putchar (*s++);
56 -           }
57 -         else      
58 -           printf ("%s", temp);
59 -#if defined (SunOS5)
60 -         fflush (stdout);      /* Fix for bug in SunOS 5.5 printf(3) */
61 -#endif
62 +         if (!do_v9)
63 +              len = strlen(temp);
64 +          memmove(m + j, temp, len);
65 +          j += len;
66 +          if (do_v9)
67 +            free (temp);
68         }
69 -      if (do_v9 && temp)
70 -       free (temp);
71        list = list->next;
72        if (i)
73         {
74 @@ -189,11 +209,17 @@
75           break;
76         }
77        if (list)
78 -       putchar(' ');
79 +       m[j++] = ' ';
80      }
81 -
82    if (display_return)
83 -    putchar ('\n');
84 +    m[j++] = '\n';
85 +  ret = write(STDOUT_FILENO, m, j);
86 +  if (ret < j)
87 +    sh_wrerror();
88 +  free(m);
89 +#if defined (SunOS5)
90 +  fflush (stdout);     /* Fix for bug in SunOS 5.5 printf(3) */
91 +#endif
92  
93    terminate_immediately--;
94    return (sh_chkwrite (EXECUTION_SUCCESS));