stevens@hsi.UUCP (11/11/87)
Index: awk/lib.c
Description:
The new version of awk (available from the AT&T Toolchest -
supposedly its also shipped with System 5.3.1) dumps core.
If you don't pass enough arguments to awk's printf(), an error
message is printed, with a copy of your format string that
was in error. When this format string reaches awk's error()
function it is passed to fprintf(). However, since there are
probably per-cent signs in your format argument to awk's printf,
when awk's error() calls fprintf, it'll reference random memory
locations through the stack trying to find the non-existent arguments.
Repeat-By:
nawk '{printf("%s%s", "hi")}' (then enter a return)
This causes a core dump on a VAX running 4.3 BSD.
Since the problem is random memory references through
the stack, the symptoms will differ on other systems.
Fix:
*** /tmp/,RCSt1014068 Wed Nov 11 14:34:27 1987
--- /tmp/,RCSt2014068 Wed Nov 11 14:34:28 1987
***************
*** 442,452 ****
int f;
char *s;
{
extern Node *curnode;
extern uchar *cmdname;
fprintf(stderr, "%s: ", cmdname);
! fprintf(stderr, s);
fprintf(stderr, "\n");
if (NR && *NR > 0) {
fprintf(stderr, " input record number %g", *FNR);
--- 442,457 ----
int f;
char *s;
{
+ register int c;
extern Node *curnode;
extern uchar *cmdname;
fprintf(stderr, "%s: ", cmdname);
! #ifdef notdef
! fprintf(stderr, s); /* wont work if s contains any percents */
! #endif
! while (c = *s++)
! putc(c, stderr);
fprintf(stderr, "\n");
if (NR && *NR > 0) {
fprintf(stderr, " input record number %g", *FNR);guy@gorodish.Sun.COM (Guy Harris) (12/11/87)
> Repeat-By: > nawk '{printf("%s%s", "hi")}' (then enter a return) > > This causes a core dump on a VAX running 4.3 BSD. Fixed in the S5R3.1 version. The code there is different (I assume that the routine you fixed here is "error" in "lib.c"); "error" takes a potload of arguments and passes them, along with "s", to "fprintf". Guy Harris {ihnp4, decvax, seismo, decwrl, ...}!sun!guy guy@sun.com