Bug in csh (history, "!a%100s"). Report and Fix.
Michael Greim
greim at sbsvax.UUCP
Mon Jul 10 21:38:56 AEST 1989
In article <2218 at hp-sdd.hp.com>, allyn at hp-sdd.hp.com (Allyn Fratkin) writes:
> In article <769 at sbsvax.UUCP>, greim at sbsvax.UUCP (Michael Greim) writes:
> > This fix works like this:
> > - in error only a string ending in "@" is passed as format string
> > to printf.
> > - only internal error messages needing arguments need format specifiers,
> > so I add a trailing "@" to any such message
> > - any string not ending with "@" is passed to printf with "%s" as first
> > parameter.
>
> nothing personal, but what a disgusting hack. you use @ as the *last*
> character of the string to indicate the presence of a second parameter?
> wouldn't it have been much easier to use the first char?
I never denied that it was a disgusting hack. Most changes in csh will
result in such a thing.
When I decided on how to fix it, I had the following goals in mind:
- The fixes should be to as little files as possible. If people have
done changes to csh, they may have to do the new fixes by hand, and
will be really pissed off, if they have so much to do. (Our csh
contains a lot of changes, e.g. it has a version command, which prints
out csh's version, some special csh variables which change certain
(mis-)behaviours; the format of "time" is changed ...)
- there are a lot more invocations to error with one argument than
there are to error with two arguments.
- No new function unless necessary.
- No new global variables unless necessary.
- Didn't want to spend too much time on it.
- I did not use "@" as the first character, because the command
!@%10s would then still produce 10 spaces, as error would see "@%10s",
think: "aha, it starts with @, so it is a format string", call
printf ("%10s", ... which will produce 10 space, and maybe a core
dump.
I decided on "@" because no valid error message from inside csh
can end with a "@".
>
> but why didn't you just change the calls
> error(singlearg);
> to
> error("%s", singlearg);
>
> seems like it would have been much cleaner.
Maybe, but there are several error function, which package the messages
in several ways. If one uses "error(fmt, arg)", one must replace some
calls to seterr2 and seterrc, one must trace possible calls to "error(av)"
"Perror" or to "error" of the form "error(err)" to see,
where the "av" really comes from, and probably change some other calls too,
if the "av" can contain a "%".
I preferred the simple, though ugly way, as I did not want to spend a lot of
time on the investigation whether any alternative might yield a more
beautiful fix.
> From the virtual mind of Allyn Fratkin allyn at sdd.hp.com
> San Diego Division - or -
> Hewlett-Packard Company uunet!ucsd!hp-sdd!allyn
-mg
--
Michael Greim Email : greim at sbsvax.informatik.uni-saarland.dbp.de
or : ...!uunet!unido!sbsvax!greim
[.signature removed by the board of censors for electronic mail's main
executive computer because it contained a four letter word ("word")]
More information about the Comp.sources.bugs
mailing list