Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

RemoteFortressReader: GetCreatureRaws sends CP437 (not UTF-8) strings, which breaks protobuf decoding

未关闭
#6,019 3 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 3 天内回复

@dwmuller 已经在做这个了。

开始于 2026年10月20日。

  • #6021 来自 @dwmuller —— 未关闭

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
20/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
停滞
技术栈
cpp
领域
api, backend

调研方向

Read plugins/remotefortressreader/remotefortressreader.cpp and check the creature-raw string fields, starting with the caste description assignment identified in the issue. Convert game-sourced strings to UTF-8 consistently, then validate GetCreatureRaws replies with strict UTF-8 decoding. A linked pull request is already open, so check its changes and status before taking this on.

由索引模型根据 Issue 内容生成。

描述

Disclaimer: this issue was drafted by GitHub Copilot (an AI assistant) under the direction of user @dwmuller. The test results below come from real runs against a live game, but the source-code analysis is AI-generated, so please verify it.

Summary

RemoteFortressReader.GetCreatureRaws returns some strings in the game's CP437 encoding instead of UTF-8. Protobuf string fields must be UTF-8, so strict clients (Rust prost, and likely others) reject the whole reply. A single bad string makes the 23 MB reply undecodable.

The 50.08-r2 changelog says "RemoteFortressReader: ensured names are transmitted in UTF-8 instead of CP437", but DF2UTF is applied selectively and was not applied here.

Environment
  • Dwarf Fortress 53.16
  • DFHack 53.16-r3
  • Remote client: Rust dfhack-remote 0.12.0 (prost)
  • Fortress with many generated creatures (raw indices ~2026-2085 are affected)
Observed

Decoding fails with:

failed to decode Protobuf message: CasteRaw.description: CreatureRaw.caste:
CreatureRawList.creature_raws: invalid string value: data is not UTF-8 encoded.

I walked the raw reply bytes without UTF-8 validation and found 74 non-UTF-8 strings. They fall into three fields:

Field Count Example (raw bytes)
CreatureRaw.name (field 3) 19 Being of r\x86sh
CreatureRaw.caste[].caste_name (path 1.10.3) 31 Being of r\x86sh
CreatureRaw.caste[].description (path 1.10.15) 24 ...created by the dwarven goddess R\x86sh and is of a part with deformity...

0x86 is "å" in CP437, which fits these generated names ("Råsh").

Paging GetPartialCreatureRaws and bisecting shows that exactly 14 raws in the 2026-2085 range fail. Indices before 2026 decode fine.

Cause (from reading the source)

In plugins/remotefortressreader/remotefortressreader.cpp, the caste loop has:

send_caste->set_description(orig_caste->description);

There is no DF2UTF(...). The CreatureRaw/CasteRaw name fields (name, caste_name, baby/child names) show the same symptom in the data and should be checked as well. I only confirmed the unconverted set_description call in the source.

Not affected in this fortress
  • GetUnitList and GetUnitListInside (305 units) have no invalid UTF-8.
  • GetMaterialList, GetGrowthList, GetItemList and GetPlantRaws have no invalid UTF-8.

I looked at these specifically because they also carry caste strings. They're fine here, but it's worth auditing every string that reaches a protobuf message.

Suggested fix

Wrap all game-sourced strings in the creature-raw path with DF2UTF, and audit the other set_* string calls in the plugin for the same omission.

Reproduction

Any client works. Call GetCreatureRaws and validate the reply strictly as UTF-8. I wrote a small test harness that does this. It's in a project of mine, and everything is read-only:

https://github.com/dwmuller/DFCompanion/blob/experiment/dfhack-lua-http-spike/tests/live_game_tests.rs

Run it against a live game (DFHack remote on port 5000):

cargo test --test live_game_tests -- --ignored --nocapture --test-threads=1
  • creature_raws and creature_raws_paged use the typed client, and the paged one bisects to the failing indices.
  • raw_creature_raws_utf8 bypasses prost, reads the protobuf wire format directly, and lists every non-UTF-8 field by path with example bytes.
  • The other raw_* tests do the same for the unit and material/item lists.
主要语言
C++
星标
2.1k
派生
509
平均合并
2 天 19 小时
30 天内合并 PR
25

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

DFHack/dfhack 的其他 Issue

查看 DFHack/dfhack 的全部 Issue

相似的 Issue

更多 C++ Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。