From: Jim Meyering Date: Thu, 10 Mar 2005 08:51:49 +0000 (+0000) Subject: Don't segfault for a long header date string, e.g., X-Git-Tag: CPPI-1_12~1331 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=82477b8efb984a578f93351c0618e793b2a017dc;p=thirdparty%2Fcoreutils.git Don't segfault for a long header date string, e.g., echo a|pr -D +%9999999A (init_header): Use x2nrealloc, rather than alloca. Don't bother with fixed-sized initial buffer; always use x*alloc. --- diff --git a/src/pr.c b/src/pr.c index dc71155331..00fcf18659 100644 --- a/src/pr.c +++ b/src/pr.c @@ -1657,8 +1657,7 @@ print_files (int number_of_files, char **av) static void init_header (char *filename, int desc) { - char *buf; - char initbuf[MAX (256, INT_BUFSIZE_BOUND (long int))]; + char *buf = NULL; struct stat st; struct tm *tm; @@ -1668,25 +1667,27 @@ init_header (char *filename, int desc) if (desc < 0 || fstat (desc, &st) != 0) st.st_mtime = time (NULL); - buf = initbuf; tm = localtime (&st.st_mtime); - if (! tm) - sprintf (buf, "%ld", (long int) st.st_mtime); + if (tm == NULL) + { + buf = xmalloc (INT_BUFSIZE_BOUND (long int)); + sprintf (buf, "%ld", (long int) st.st_mtime); + } else { - size_t bufsize = sizeof initbuf; + size_t bufsize = 0; for (;;) { + buf = x2nrealloc (buf, &bufsize, sizeof *buf); *buf = '\1'; - if (strftime (buf, bufsize, date_format, tm) || ! *buf) + if (strftime (buf, bufsize, date_format, tm) || *buf == '\0') break; - buf = alloca (bufsize *= 2); } } if (date_text) free (date_text); - date_text = xstrdup (buf); + date_text = buf; file_text = custom_header ? custom_header : desc < 0 ? "" : filename; header_width_available = (chars_per_line - mbswidth (date_text, 0)