Hmbown/CodeWhale · error

loaded-image mapping for updater marker has no pathname

Error message

loaded-image mapping for updater marker has no pathname

What it means

parse_android_image_mapping extracts the trailing pathname field of a /proc/self/maps line; the remainder after fixed fields becomes the path (rejoined, since paths may contain spaces). It bails when this collected path is empty — the mapping has no backing pathname, so the updater cannot name the file backing its loaded image.

Solutions

  1. Skip to the next /proc/self/maps line with a non-empty pathname that covers the marker address.
  2. Run the binary from an on-disk path so its mapping reports a pathname.
  3. Fall back to /proc/self/exe or dladdr-based resolution for the executable identity.
  4. Use the platform's update channel instead of in-place self-update for anonymous-mapped execution.

Example fix

// before
if path.is_empty() {
    bail!("loaded-image mapping for updater marker has no pathname");
}
// after (scanner fix)
// continue to the next maps line; only a mapping with a non-empty
// pathname and matching address range counts as proof
Defensive patterns

Strategy: validation

Validate before calling

// a usable maps line has a path column
let has_path = line.split_whitespace().count() >= 6;

Type guard

fn maps_line_has_path(fields: &[&str]) -> bool { fields.len() >= 6 }

Try / catch

match parse_android_image_mapping(line) {
    Err(e) if e.to_string().contains("no pathname") => continue, // anonymous mapping; try next line
    other => other?,
}

Prevention

When it happens

Trigger: android_loaded_executable_proof_report on a maps line for the marker where all fixed columns parse but the trailing path column is absent/empty (anonymous mapping line with no path suffix).

Common situations: Anonymous executable mappings (heap/JIT or memfd) matched during the marker scan; minimal Android environments with unusual map entries; deleted files still typically show a path, so empty usually means truly anonymous.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@73e0f67d83 (2026-09-22). Data as JSON: /api/errors/fea6d22ebe48b5ab. Report an issue: GitHub.

Appendix: source

Thrown at crates/cli/src/update.rs:398

            .parse::<u64>()
            .context("loaded-image mapping has an invalid inode")?;
        let path = fields.collect::<Vec<_>>().join(" ");

        if permissions.as_bytes().get(2) != Some(&b'x') {
            bail!("loaded-image mapping for updater marker is not executable");
        }
        if inode == 0 {
            bail!("loaded-image mapping for updater marker has no file inode");
        }
        let (device_major, device_minor) = device
            .split_once(':')
            .context("loaded-image mapping has an invalid device")?;
        let device_major = u32::from_str_radix(device_major, 16)
            .context("loaded-image mapping has an invalid device major number")?;
        let device_minor = u32::from_str_radix(device_minor, 16)
            .context("loaded-image mapping has an invalid device minor number")?;
        if path.is_empty() {
            bail!("loaded-image mapping for updater marker has no pathname");
        }

        let mapping = AndroidImageMapping {
            start,
            end,
            device_major,
            device_minor,
            inode,
            path: PathBuf::from(path),
        };
        if matching.replace(mapping).is_some() {
            bail!("multiple /proc/self/maps rows contain the updater marker");
        }
    }

    matching.ok_or_else(|| anyhow!("no /proc/self/maps row contains the updater marker"))
}

View on GitHub (pinned to 73e0f67d83)