open
https://gitlab.synchro.net/main/sbbs/-/work_items/1285
## Problem
A SAUCE record appended to an ANSI art file ends up in the body of a message posted from that file, and the built-in message reader displays it as garbage at the end of the message.
Example: DOVE-Net Ads (`DOVE-ADS`) "[ANSI] FuNToPiA BBS" from Mindsurfer, 2026-10-16, imported via QWK from FUNTOPIA (3.22a-Win32). The end of the body:
```
...ESC[0m CRLF CRLF
-- 20261016_113201
1A "SAUCE00" + spaces (blank Title/Author/Group) + "20260609" + 2A 61
CRLF ^An CRLF
--- CRLF * Synchronet * FuNToPiA BBS -
telnet://funtopia...
```
The reader shows a CP437 right-arrow glyph (the Ctrl-Z), `SAUCE00`, a run of spaces, the SAUCE date and `*a`, then the tagline.
### Why
1. Nothing removes the SAUCE trailer (Ctrl-Z EOF + optional `COMNT` block +
128-byte `SAUCE00` record) when a file becomes a message body.
2. The record gets truncated at its first NUL byte. SAUCE FileSize is a
little-endian 32-bit value (here `2A 61 00 00` = 24,874), and message
bodies are C strings: `smb_addmsg()` takes the body length with `strlen()`
(`smbadd.c`), and `postmsg.cpp`, `postmsg.js`/`save_msg()` and smbutil
import all end up there. So DataType, FileType, TInfo, TFlags etc. are lost,
while the printable leading fields survive.
3. The message reader does not stop at Ctrl-Z. Display *files* do:
`prntfile.cpp` detects SAUCE with `sauce_fread_charinfo()` and sets
`P_CPM_EOF`, which `putmsg()` honors. Message bodies never take that path,
and setting `P_C