Stage D batch 6: mama_forth_words.c group 4 -- identity/crypto words (FABRIC-3.md §XXXII.6)
MINT + mint_pop_string()/ZUSE-ELIGIBILITY-ADD/ZUSE-ELIGIBLE?/ ELEVATE-PUBKEY-UNPACK, 10 sites. mint_pop_string() gained a field_name parameter so its diagnostics name which of MINT's four string arguments failed (phone/email/username/full_name), rather than a generic message that would leave the operator guessing. Diagnostic placement matched each function's own sibling convention where one exists (ZUSE-ELIGIBILITY-ADD), log_message() default otherwise. Three-arch clean qemu acceptance passed. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BWpNjdwPtFLuVLaAq44L9K
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
8b5300fc4f
commit
90c86c6006
+15
@@ -4654,3 +4654,18 @@ own WIREBIND attach (every boot) drives `HERA-BLK-ATTACH-REQ`'s `MSG-SEND`, whic
|
|||||||
`SWITCH-MARK-WORK` -- so this fix's own most safety-critical path is exercised by the standard
|
`SWITCH-MARK-WORK` -- so this fix's own most safety-critical path is exercised by the standard
|
||||||
acceptance boot itself, not just compiled.
|
acceptance boot itself, not just compiled.
|
||||||
|
|
||||||
|
**Batch 6 -- DONE, 2026-09-15: group 4, identity/crypto (`MINT` + `mint_pop_string()`,
|
||||||
|
`ZUSE-ELIGIBILITY-ADD`, `ZUSE-ELIGIBLE?`, `ELEVATE-PUBKEY-UNPACK`) -- 10 sites.**
|
||||||
|
`mint_pop_string()` gained a `field_name` parameter (`"phone"`/`"email"`/`"username"`/
|
||||||
|
`"full_name"`, one per call site) so its three now-diagnosed guards name which of `MINT`'s four
|
||||||
|
string arguments actually failed, via `console_println()` -- a generic message would have left
|
||||||
|
the operator guessing which one, defeating the point of fixing a silent-minting failure.
|
||||||
|
`MINT`'s own `restrict?`-flag guard matches the same convention. `ZUSE-ELIGIBILITY-ADD` matched
|
||||||
|
its own existing `console_println()` sibling ("FAILED -- fence write error"). `ZUSE-ELIGIBLE?`
|
||||||
|
and `ELEVATE-PUBKEY-UNPACK` have no sibling guard in their own function bodies -- kept
|
||||||
|
`log_message()`, the file's established default.
|
||||||
|
|
||||||
|
**Verified:** three-architecture `clean qemu` acceptance (amd64/aarch64/riscv64) passed, standard
|
||||||
|
regression unaffected -- including the `mint_pop_string()` signature change compiling cleanly
|
||||||
|
across all four call sites.
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Capsule Block Manifest — Auto-generated
|
# Capsule Block Manifest — Auto-generated
|
||||||
<!-- Generated by mkcapsule --manifest 2026-09-15T23:13:32Z -->
|
<!-- Generated by mkcapsule --manifest 2026-09-15T23:44:09Z -->
|
||||||
<!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. -->
|
<!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. -->
|
||||||
<!-- Hand-written justifications and immutability notes live -->
|
<!-- Hand-written justifications and immutability notes live -->
|
||||||
<!-- in MANIFEST.md alongside this auto-generated index. -->
|
<!-- in MANIFEST.md alongside this auto-generated index. -->
|
||||||
|
|||||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1036,16 +1036,37 @@ static void mama_word_vm_heat(VM *vm)
|
|||||||
*/
|
*/
|
||||||
/* Pop one ( caddr u ) string pair and copy it, NUL-terminated, into
|
/* Pop one ( caddr u ) string pair and copy it, NUL-terminated, into
|
||||||
* dst (capacity dst_cap). Returns 0 on success, -1 on underflow/bounds/
|
* dst (capacity dst_cap). Returns 0 on success, -1 on underflow/bounds/
|
||||||
* unmapped-address failure (vm->error is set in that case). */
|
* unmapped-address failure (vm->error is set in that case). field_name
|
||||||
static int mint_pop_string(VM *vm, char *dst, size_t dst_cap)
|
* names which MINT argument this call is popping, for a precise
|
||||||
|
* diagnostic (FABRIC-3.md §XXXII.6) -- this helper is called four times
|
||||||
|
* with different fields, so a generic message would leave the operator
|
||||||
|
* guessing which one actually failed. */
|
||||||
|
static int mint_pop_string(VM *vm, char *dst, size_t dst_cap, const char *field_name)
|
||||||
{
|
{
|
||||||
if (vm->dsp < 1) { vm->error = 1; return -1; }
|
if (vm->dsp < 1) {
|
||||||
|
console_puts("MINT: expects S\" ");
|
||||||
|
console_puts(field_name);
|
||||||
|
console_println("\" -- nothing on the stack");
|
||||||
|
vm->error = 1;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
cell_t u = vm_pop(vm);
|
cell_t u = vm_pop(vm);
|
||||||
cell_t caddr = vm_pop(vm);
|
cell_t caddr = vm_pop(vm);
|
||||||
if (u < 0 || (size_t)u >= dst_cap) { vm->error = 1; return -1; }
|
if (u < 0 || (size_t)u >= dst_cap) {
|
||||||
|
console_puts("MINT: ");
|
||||||
|
console_puts(field_name);
|
||||||
|
console_println(" too long or negative length");
|
||||||
|
vm->error = 1;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if (u > 0) {
|
if (u > 0) {
|
||||||
const uint8_t *p = vm_ptr(vm, (vaddr_t)caddr);
|
const uint8_t *p = vm_ptr(vm, (vaddr_t)caddr);
|
||||||
if (!p) { vm->error = 1; return -1; }
|
if (!p) {
|
||||||
|
console_puts("MINT: invalid address on the stack for ");
|
||||||
|
console_println(field_name);
|
||||||
|
vm->error = 1;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
memcpy(dst, p, (size_t)u);
|
memcpy(dst, p, (size_t)u);
|
||||||
}
|
}
|
||||||
dst[u] = '\0';
|
dst[u] = '\0';
|
||||||
@@ -1072,12 +1093,16 @@ static void mama_word_mint(VM *vm)
|
|||||||
char full_name[USER_IDENTITY_FULL_NAME_MAX];
|
char full_name[USER_IDENTITY_FULL_NAME_MAX];
|
||||||
|
|
||||||
/* Stack order: fname pushed first, restrict? last -- pop in reverse. */
|
/* Stack order: fname pushed first, restrict? last -- pop in reverse. */
|
||||||
if (vm->dsp < 0) { vm->error = 1; return; }
|
if (vm->dsp < 0) {
|
||||||
|
console_println("MINT: expects a restrict? flag on top of the stack");
|
||||||
|
vm->error = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
cell_t restrict_flag = vm_pop(vm);
|
cell_t restrict_flag = vm_pop(vm);
|
||||||
if (mint_pop_string(vm, phone, sizeof(phone)) != 0) return;
|
if (mint_pop_string(vm, phone, sizeof(phone), "phone") != 0) return;
|
||||||
if (mint_pop_string(vm, email, sizeof(email)) != 0) return;
|
if (mint_pop_string(vm, email, sizeof(email), "email") != 0) return;
|
||||||
if (mint_pop_string(vm, username, sizeof(username)) != 0) return;
|
if (mint_pop_string(vm, username, sizeof(username), "username") != 0) return;
|
||||||
if (mint_pop_string(vm, full_name, sizeof(full_name)) != 0) return;
|
if (mint_pop_string(vm, full_name, sizeof(full_name), "full_name") != 0) return;
|
||||||
|
|
||||||
struct blkio_dev *dev = sk_repl_get_attached_blk_dev();
|
struct blkio_dev *dev = sk_repl_get_attached_blk_dev();
|
||||||
if (!dev) {
|
if (!dev) {
|
||||||
@@ -1139,6 +1164,7 @@ static void mama_word_mint(VM *vm)
|
|||||||
static void mama_word_zuse_eligibility_add(VM *vm)
|
static void mama_word_zuse_eligibility_add(VM *vm)
|
||||||
{
|
{
|
||||||
if (vm->dsp < 0) {
|
if (vm->dsp < 0) {
|
||||||
|
console_println("ZUSE-ELIGIBILITY-ADD: stack underflow");
|
||||||
vm->error = 1;
|
vm->error = 1;
|
||||||
vm_push(vm, 0);
|
vm_push(vm, 0);
|
||||||
return;
|
return;
|
||||||
@@ -1146,6 +1172,7 @@ static void mama_word_zuse_eligibility_add(VM *vm)
|
|||||||
cell_t caddr = vm_pop(vm);
|
cell_t caddr = vm_pop(vm);
|
||||||
const uint8_t *pubkey = vm_ptr(vm, (vaddr_t)caddr);
|
const uint8_t *pubkey = vm_ptr(vm, (vaddr_t)caddr);
|
||||||
if (!pubkey) {
|
if (!pubkey) {
|
||||||
|
console_println("ZUSE-ELIGIBILITY-ADD: invalid address on the stack");
|
||||||
vm->error = 1;
|
vm->error = 1;
|
||||||
vm_push(vm, 0);
|
vm_push(vm, 0);
|
||||||
return;
|
return;
|
||||||
@@ -1170,6 +1197,7 @@ static void mama_word_zuse_eligibility_add(VM *vm)
|
|||||||
static void mama_word_zuse_eligible_query(VM *vm)
|
static void mama_word_zuse_eligible_query(VM *vm)
|
||||||
{
|
{
|
||||||
if (vm->dsp < 0) {
|
if (vm->dsp < 0) {
|
||||||
|
log_message(LOG_ERROR, "ZUSE-ELIGIBLE?: stack underflow");
|
||||||
vm->error = 1;
|
vm->error = 1;
|
||||||
vm_push(vm, 0);
|
vm_push(vm, 0);
|
||||||
return;
|
return;
|
||||||
@@ -1177,6 +1205,7 @@ static void mama_word_zuse_eligible_query(VM *vm)
|
|||||||
cell_t caddr = vm_pop(vm);
|
cell_t caddr = vm_pop(vm);
|
||||||
const uint8_t *pubkey = vm_ptr(vm, (vaddr_t)caddr);
|
const uint8_t *pubkey = vm_ptr(vm, (vaddr_t)caddr);
|
||||||
if (!pubkey) {
|
if (!pubkey) {
|
||||||
|
log_message(LOG_ERROR, "ZUSE-ELIGIBLE?: invalid address on the stack");
|
||||||
vm->error = 1;
|
vm->error = 1;
|
||||||
vm_push(vm, 0);
|
vm_push(vm, 0);
|
||||||
return;
|
return;
|
||||||
@@ -1229,6 +1258,7 @@ static void mama_word_name_to_xt(VM *vm)
|
|||||||
static void mama_word_elevate_pubkey_unpack(VM *vm)
|
static void mama_word_elevate_pubkey_unpack(VM *vm)
|
||||||
{
|
{
|
||||||
if (vm->dsp < 4) {
|
if (vm->dsp < 4) {
|
||||||
|
log_message(LOG_ERROR, "ELEVATE-PUBKEY-UNPACK: stack underflow");
|
||||||
vm->error = 1;
|
vm->error = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1238,6 +1268,7 @@ static void mama_word_elevate_pubkey_unpack(VM *vm)
|
|||||||
|
|
||||||
uint8_t *buf = vm_ptr(vm, (vaddr_t)buf_addr);
|
uint8_t *buf = vm_ptr(vm, (vaddr_t)buf_addr);
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
|
log_message(LOG_ERROR, "ELEVATE-PUBKEY-UNPACK: invalid address on the stack");
|
||||||
vm->error = 1;
|
vm->error = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user