otransit_msg() fixes

Fixes #156

githib issue #156 complains that "The Excalibur falls down the stairs,"
is using poor grammar despite the fact that the usual drop message is
"You drop the +0 Excalibur."  I agree.  Change it to be "Excalibur
falls down the stairs."  (Drop message remains unchanged.)

While looking at that, I noticed that when knocking other items down
stairs, text was being appended to the formatted object name.  It was
probably safe due to the space reserved for inserting a prefix while
formatting an object's name, which becomes available for a suffix
after that name has been copied into otransit_msg()'s local buffer,
but using a separate buffer is safer.
This commit is contained in:
PatR
2018-11-10 01:37:23 -08:00
parent 8551df2a7a
commit e8a8f142ae
2 changed files with 20 additions and 12 deletions
+3
View File
@@ -189,6 +189,9 @@ fix odd wording "The boulder triggers and fills a pit"
^X status feedback: don't report "not wearing any armor" when wearing a shield ^X status feedback: don't report "not wearing any armor" when wearing a shield
attempting to #ride a long worm's tail could trigger impossible "worm_cross attempting to #ride a long worm's tail could trigger impossible "worm_cross
checking for non-adjacent location?" checking for non-adjacent location?"
avoid "The " in "The <known-artifact-but-not-The-artifact> falls down stairs."
avoid potential buffer overflow if object with very long name knocks other
objects down stairs when dropped, thrown, or kicked there
Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository
+17 -12
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 dokick.c $NHDT-Date: 1517128663 2018/01/28 08:37:43 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.113 $ */ /* NetHack 3.6 dokick.c $NHDT-Date: 1541842623 2018/11/10 09:37:03 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.122 $ */
/* Copyright (c) Izchak Miller, Mike Stephenson, Steve Linhart, 1989. */ /* Copyright (c) Izchak Miller, Mike Stephenson, Steve Linhart, 1989. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -1722,22 +1722,27 @@ register struct obj *otmp;
register boolean nodrop; register boolean nodrop;
long num; long num;
{ {
char obuf[BUFSZ]; char *optr = 0, obuf[BUFSZ], xbuf[BUFSZ];
Sprintf(obuf, "%s%s", if (otmp->otyp == CORPSE) {
(otmp->otyp == CORPSE && type_is_pname(&mons[otmp->corpsenm])) /* Tobjnam() calls xname() and would yield "The corpse";
? "" we want more specific "The newt corpse" or "Medusa's corpse" */
: "The ", optr = upstart(corpse_xname(otmp, (char *) 0, CXN_PFX_THE));
cxname(otmp)); } else {
optr = Tobjnam(otmp, (char *) 0);
}
Strcpy(obuf, optr);
if (num) { /* means: other objects are impacted */ if (num) { /* means: other objects are impacted */
Sprintf(eos(obuf), " %s %s object%s", otense(otmp, "hit"), /* 3.6.2: use a separate buffer for the suffix to avoid risk of
num == 1L ? "another" : "other", num > 1L ? "s" : ""); overrunning obuf[] (let pline() handle truncation if necessary) */
Sprintf(xbuf, " %s %s object%s", otense(otmp, "hit"),
(num == 1L) ? "another" : "other", (num > 1L) ? "s" : "");
if (nodrop) if (nodrop)
Sprintf(eos(obuf), "."); Sprintf(eos(xbuf), ".");
else else
Sprintf(eos(obuf), " and %s %s.", otense(otmp, "fall"), gate_str); Sprintf(eos(xbuf), " and %s %s.", otense(otmp, "fall"), gate_str);
pline1(obuf); pline("%s%s", obuf, xbuf);
} else if (!nodrop) } else if (!nodrop)
pline("%s %s %s.", obuf, otense(otmp, "fall"), gate_str); pline("%s %s %s.", obuf, otense(otmp, "fall"), gate_str);
} }