Skip to content

Fix C343-415: Mail daemons can be created when populating special levels with demons#4

Closed
tung wants to merge 1 commit into
NetHack:NetHack-3.6.0from
tung:general-mail-daemon-fix
Closed

Fix C343-415: Mail daemons can be created when populating special levels with demons#4
tung wants to merge 1 commit into
NetHack:NetHack-3.6.0from
tung:general-mail-daemon-fix

Conversation

@tung

@tung tung commented Mar 11, 2016

Copy link
Copy Markdown
Contributor

The root cause of this was that special level creation was deliberately ignoring the G_NOGEN flag when making monsters by class, so a random & could create a mail daemon.

The mail daemon case had already been patched by commit 9e7df53 (spurious mail daemons (trunk only)), but further testing revealed that this bug also caused:

  • r monsters creating wererats (animal form) in the Healer quest
  • S monsters creating water moccasins in the Archaeologist quest and Medusa's Island levels
  • & monsters creating water demons

... all of which are flagged G_NOGEN and thus were not supposed to be generated randomly.

The only reason that the special level system was ignoring G_NOGEN was to allow creation of random ; (eel class) monsters which are all flagged G_NOGEN. This fix replaces both that approach and the previous mail-daemon-only work-around patch by auto-detecting this condition and only relaxing the G_NOGEN restriction if it applies to the whole class of monsters requested; currently, only S_EEL and S_KOP fulfill this condition.

Incidentally, this is the same fix that prevents random chromatic dragons from spawning when special levels request random 'D' monsters in DynaHack (chromatic dragons are regular monsters in that variant).

Based on DynaHack commit b1532ff (Fix C343-415: Mail daemons can be created when populating special levels with demons) by me.

…els with demons

The root cause of this was that special level creation was deliberately
ignoring the `G_NOGEN` flag when making monsters by class, so a random
`&` could create a mail daemon.

The mail daemon case had already been patched by commit 9e7df53
(spurious mail daemons (trunk only)), but further testing revealed that
this bug also caused:

 * `r` monsters creating wererats (animal form) in the Healer quest
 * `S` monsters creating water moccasins in the Archaeologist quest and
   Medusa's Island levels
 * `&` monsters creating water demons

... all of which are flagged `G_NOGEN` and thus were not supposed to be
generated randomly.

The only reason that the special level system was ignoring `G_NOGEN` was
to allow creation of random `;` (eel class) monsters which are all
flagged `G_NOGEN`.  This fix replaces both that approach and the
previous mail-daemon-only work-around patch by auto-detecting this
condition and only relaxing the `G_NOGEN` restriction if it applies to
the whole class of monsters requested; currently, only `S_EEL` and
`S_KOP` fulfill this condition.

Incidentally, this is the same fix that prevents random chromatic
dragons from spawning when special levels request random 'D' monsters in
DynaHack (chromatic dragons are regular monsters in that variant).

Based on DynaHack commit b1532ff (Fix C343-415: Mail daemons can be
created when populating special levels with demons) by me.
nhcopier pushed a commit that referenced this pull request Aug 6, 2019
For "They look at you but the don't see you", "the" should be a second
"they".  Simple transcription typo rather than a mistake in the book.
@nhmall nhmall closed this Jun 5, 2021
@nhmall nhmall deleted the branch NetHack:NetHack-3.6.0 June 5, 2021 16:28
nhcopier pushed a commit that referenced this pull request Jun 23, 2022
This checks for 'TTYINV' in the environment and if found, it uses that
as a number describing a bit mask for how to show the perm_invent.
 0 = current behavior, a-zA-Z in two columns (I've started referring
     to those as panels because "column" is already used a lot);
 1 = "show gold" => $a-zA-Z# in two columns; requires 1 more line;
 2 = "sparse" => list all letters a-z in the left panel and A-Z in
     the right whether there is an item in the slot or not, so that
     open slots will be obvious;
 3 = 1|2, "sparse" with $a-zA-Z$ instead of just letters;
 4 = "in use" => full lines instead of side-by-side panels, listing
     only items with non-zero obj->owornmask; currently requires 17
     lines instead of 28 (or 29 for show-gold):  room for top border,
     15 lines of worn/wielded items, and bottom border; normal usage
     would be capped at 3 weapon slots, 7 armor slots, and 4 accessory
     slots, but it is possible to have more items in use (simplest
     case is to pick up the iron ball while punished).
The #4 case isn't displaying its bottom border correctly and I haven't
figured out why.

If this turns out to be useful, perm_invent can become a compound or
some new option for perminv mode could be added.
nhcopier pushed a commit that referenced this pull request Dec 1, 2022
If you were on a level teleporter, the spoteffects() call after
the hero gets expelled could end up going to a new level and
freeing all the monst chains from the level you were originally
engulfed on.

    #0 0xba0507 in free
    #1 0x87feda in dealloc_monst src/mon.c:2369
    #2 0x880a02 in dmonsfree src/mon.c:2194
    #3 0x9a7aa2 in savelev_core src/save.c:507
    #4 0x9a7a21 in savelev src/save.c:466
    #5 0x71eb9d in goto_level src/do.c:1483
    #6 0x71833f in deferred_goto src/do.c:1903
    #7 0xa2533f in level_tele src/teleport.c:1117
    #8 0xa2567b in level_tele_trap src/teleport.c:1198
    #9 0xa5c007 in trapeffect_level_telep src/trap.c:1861
    #10 0xa5f856 in trapeffect_selector src/trap.c:2497
    #11 0xa47497 in dotrap src/trap.c:2586
    #12 0x7d669b in spoteffects src/hack.c:2859
    #13 0x89d495 in xkilled src/mon.c:3187

The latter parts of xkilled() after the spoteffects() call would
then attempt to dereference the free'd monst pointer.

Save a copy of the monst struct prior to spoteffects() if you were
expelled, then point at the reference copy afterwards.

Resolves #938
nhcopier pushed a commit that referenced this pull request Aug 28, 2023
On GitHub issue 1090, Rhialto wrote:
Hi! I am currently in the process of adapting the pkgsrc packaging of NetHack 3.6.7 to include the curses window option. A bit late perhaps...

While working on that, I ran into a case of a NULL pointer being used. Apparently when linking with ncurses, this doesn't cause problems, but NetBSD's own curses doesn't like it, and crashes the game.

Here is the stack trace. It happens when #quitting, I think just before the high scores are about to be shown (but I guess it should show in the stack trace if I'm totally correct with that):

(gdb) bt
 #0  redrawwin (win=0x0) at /usr/src/lib/libcurses/touchwin.c:149
 #1  0x0000000017e104b4 in curses_refresh_nethack_windows () at ../win/curses/curswins.c:176
 #2  0x0000000017e1054a in curses_destroy_win (win=win@entry=0x7ad219520540) at ../win/curses/curswins.c:155
 #3  0x0000000017e1512c in curses_display_nhmenu (wid=<optimized out>, how=<optimized out>, _selected=0x7f7fff65d850) at ../win/curses/cursdial.c:771
 #4  0x0000000017e0ff81 in curses_select_menu (wid=wid@entry=21, how=how@entry=0, selected=selected@entry=0x7f7fff65d850) at ../win/curses/cursmain.c:607
 #5  0x0000000017e10257 in curses_display_nhwindow (wid=21, block=1) at ../win/curses/cursmain.c:385
 #6  0x0000000017ca8075 in really_done (how=<optimized out>, how@entry=13) at end.c:1609
 #7  0x0000000017ca993f in done (how=how@entry=13) at end.c:1201
 #8  0x0000000017ca9c85 in done2 () at end.c:381
 #9  done2 () at end.c:337
 #10 0x0000000017c489da in doextcmd () at cmd.c:363
 #11 0x0000000017c57e94 in rhack (cmd=<optimized out>, cmd@entry=0x0) at cmd.c:4909
 #12 0x0000000017c265da in moveloop (resuming=<optimized out>) at allmain.c:435
 #13 0x0000000017e1b862 in main (argc=<optimized out>, argv=<optimized out>) at ../sys/unix/unixmain.c:351
status_window is NULL here. Simply checking for NULL avoids the problem. I added checks for the other windows as well, while I was there.
nhcopier pushed a commit that referenced this pull request Dec 23, 2024
If freedynamicdata() gets called twice, for whatever reason, a "double free" can occur.

warning: 44     ./nptl/pthread_kill.c: No such file or directory
(gdb) bt
#0  __pthread_kill_implementation (no_tid=0, signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:44
#1  __pthread_kill_internal (signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:78
#2  __GI___pthread_kill (threadid=<optimized out>, signo=signo@entry=6) at ./nptl/pthread_kill.c:89
#3  0x00007ffff7c8b26e in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#4  0x00007ffff7c6e8ff in __GI_abort () at ./stdlib/abort.c:79
#5  0x00007ffff7c6f7b6 in __libc_message_impl (fmt=fmt@entry=0x7ffff7e148d7 "%s\n")
    at ../sysdeps/posix/libc_fatal.c:132
#6  0x00007ffff7ceefe5 in malloc_printerr (str=str@entry=0x7ffff7e17bf0 "free(): double free detected in tcache 2")
    at ./malloc/malloc.c:5772
#7  0x00007ffff7cf154f in _int_free (av=0x7ffff7e49ac0 <main_arena>, p=<optimized out>, have_lock=0)
    at ./malloc/malloc.c:4541
#8  0x00007ffff7cf3d9e in __GI___libc_free (mem=0x555555ad82a0) at ./malloc/malloc.c:3398
#9  0x00005555557c12e9 in free_rect () at rect.c:48
#10 0x00005555557d77a2 in freedynamicdata () at save.c:1240
#11 0x0000555555682754 in nh_terminate (status=0) at end.c:1671
#12 0x000055555589af15 in opt_terminate () at ../sys/unix/unixmain.c:768
#13 0x000055555589af7a in after_opt_showpaths (dir=0x0) at ../sys/unix/unixmain.c:796
#14 0x0000555555693dd9 in do_deferred_showpaths (code=0) at files.c:4491
#15 0x0000555555778405 in initoptions () at options.c:6948
#16 0x0000555555899cd9 in main (argc=2, argv=0x7fffffffdad8) at ../sys/unix/unixmain.c:151
nhcopier pushed a commit that referenced this pull request Apr 29, 2025
The two options are very similar but probably mutually exclusive
except when using look-here and look-into-container (both via ':')
with the default setting for 'sortloot', or with inventory when
'sortpack' has been toggled off.

This removes 'use_menu_glyphs' and changes 'menu_objsyms' from a
boolean to a compound taking six possible values:
| 0: no object symbols in menus,
| 1: append object class symbol to object header lines (same as old
|menu_objsyms boolean),
| 2: include object symbol in menu entry lines for objects (same as
|recently added use_menu_glyphs),
| 3: both 1 and 2,
| 4: display as #2 but only if the menu lacks class header lines,
| 5: if header lines are present, display as #1; if headers are not
|present, then display as #4 (which will implicitly be #2).
Default is #4.

Effectively replaces the options portion of pull request #1406 and
retains the functionality, but not as default for normal menus.

Guidebook.tex is only partially updated.  Someone else will need to
finish that.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants