VFS readFile often returns Uint8Array; SFTP DATA and CHANNEL_DATA assumed

Buffer.isBuffer or treated payloads as UTF-8, corrupting packets and risking
native aborts (bad_optional_access). Normalize ArrayBuffer views in
SFTP.prototype.data and Protocol channelData/channelExtData; align READ shim.

Also includes earlier SFTP hardening: REQUEST.READ/WRITE/FSETSTAT guards,
enqueueSftpReply(reqid) + FAILURE on handler error, CHANGELOG.
This commit is contained in:
Raven Scott
2026-04-21 18:06:22 -04:00
parent 0359129a72
commit baae7b3482
13 changed files with 432 additions and 416 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"generatedAt": "2026-04-21T21:59:30.828Z", "generatedAt": "2026-04-21T22:05:46.195Z",
"normativeManifest": "packages/bare-os-booter/lib/bare-module-manifest.json", "normativeManifest": "packages/bare-os-booter/lib/bare-module-manifest.json",
"buildTool": "packages/bare-os-bare-libs/build.mjs", "buildTool": "packages/bare-os-bare-libs/build.mjs",
"bundles": [ "bundles": [
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"schema": 2, "schema": 2,
"profileId": "bare-os-posix-like", "profileId": "bare-os-posix-like",
"generatedAt": "2026-04-21T21:59:29.663Z", "generatedAt": "2026-04-21T22:05:44.363Z",
"note": "Sparse POSIX Issue 7 coverage hints for /bin utilities. Omitted command names are not yet profiled here.", "note": "Sparse POSIX Issue 7 coverage hints for /bin utilities. Omitted command names are not yet profiled here.",
"commandIndex": [ "commandIndex": [
{ {
+204 -204
View File
@@ -25,36 +25,36 @@
"compactEncoding" "compactEncoding"
] ]
}, },
{
"path": "/lib/bare/bundles/protomux.js",
"keys": [
"protomux"
]
},
{ {
"path": "/lib/bare/bundles/bareUrl.js", "path": "/lib/bare/bundles/bareUrl.js",
"keys": [ "keys": [
"bareUrl" "bareUrl"
] ]
}, },
{
"path": "/lib/bare/bundles/protomux.js",
"keys": [
"protomux"
]
},
{ {
"path": "/lib/bare/bundles/barePath.js", "path": "/lib/bare/bundles/barePath.js",
"keys": [ "keys": [
"barePath" "barePath"
] ]
}, },
{
"path": "/lib/bare/bundles/bareEncoding.js",
"keys": [
"bareEncoding"
]
},
{ {
"path": "/lib/bare/bundles/bareEvents.js", "path": "/lib/bare/bundles/bareEvents.js",
"keys": [ "keys": [
"bareEvents" "bareEvents"
] ]
}, },
{
"path": "/lib/bare/bundles/bareEncoding.js",
"keys": [
"bareEncoding"
]
},
{ {
"path": "/lib/bare/bundles/bareAbort.js", "path": "/lib/bare/bundles/bareAbort.js",
"keys": [ "keys": [
@@ -79,12 +79,6 @@
"bareAddonResolve" "bareAddonResolve"
] ]
}, },
{
"path": "/lib/bare/bundles/bareAssert.js",
"keys": [
"bareAssert"
]
},
{ {
"path": "/lib/bare/bundles/bareReadline.js", "path": "/lib/bare/bundles/bareReadline.js",
"keys": [ "keys": [
@@ -104,9 +98,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/fetch.js", "path": "/lib/bare/bundles/bareAssert.js",
"keys": [ "keys": [
"fetch" "bareAssert"
] ]
}, },
{ {
@@ -122,9 +116,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareApk.js", "path": "/lib/bare/bundles/fetch.js",
"keys": [ "keys": [
"bareApk" "fetch"
] ]
}, },
{ {
@@ -133,6 +127,12 @@
"bareBmp" "bareBmp"
] ]
}, },
{
"path": "/lib/bare/bundles/bareBuffer.js",
"keys": [
"bareBuffer"
]
},
{ {
"path": "/lib/bare/bundles/bareBundleCompile.js", "path": "/lib/bare/bundles/bareBundleCompile.js",
"keys": [ "keys": [
@@ -146,9 +146,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareBuffer.js", "path": "/lib/bare/bundles/bareApk.js",
"keys": [ "keys": [
"bareBuffer" "bareApk"
] ]
}, },
{ {
@@ -163,6 +163,12 @@
"bareConsole" "bareConsole"
] ]
}, },
{
"path": "/lib/bare/bundles/bareChannel.js",
"keys": [
"bareChannel"
]
},
{ {
"path": "/lib/bare/bundles/bareBundleEvaluate.js", "path": "/lib/bare/bundles/bareBundleEvaluate.js",
"keys": [ "keys": [
@@ -170,9 +176,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareChannel.js", "path": "/lib/bare/bundles/bareBoot.js",
"keys": [ "keys": [
"bareChannel" "bareBoot"
] ]
}, },
{ {
@@ -188,9 +194,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareBoot.js", "path": "/lib/bare/bundles/bareDiagnosticsChannel.js",
"keys": [ "keys": [
"bareBoot" "bareDiagnosticsChannel"
] ]
}, },
{ {
@@ -205,36 +211,36 @@
"bareCov" "bareCov"
] ]
}, },
{
"path": "/lib/bare/bundles/bareDiagnosticsChannel.js",
"keys": [
"bareDiagnosticsChannel"
]
},
{ {
"path": "/lib/bare/bundles/bareDns.js", "path": "/lib/bare/bundles/bareDns.js",
"keys": [ "keys": [
"bareDns" "bareDns"
] ]
}, },
{
"path": "/lib/bare/bundles/bareDaemon.js",
"keys": [
"bareDaemon"
]
},
{ {
"path": "/lib/bare/bundles/bareEnv.js", "path": "/lib/bare/bundles/bareEnv.js",
"keys": [ "keys": [
"bareEnv" "bareEnv"
] ]
}, },
{
"path": "/lib/bare/bundles/bareDaemon.js",
"keys": [
"bareDaemon"
]
},
{ {
"path": "/lib/bare/bundles/bareExif.js", "path": "/lib/bare/bundles/bareExif.js",
"keys": [ "keys": [
"bareExif" "bareExif"
] ]
}, },
{
"path": "/lib/bare/bundles/bareDgram.js",
"keys": [
"bareDgram"
]
},
{ {
"path": "/lib/bare/bundles/bareFfmpeg.js", "path": "/lib/bare/bundles/bareFfmpeg.js",
"keys": [ "keys": [
@@ -248,9 +254,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareDgram.js", "path": "/lib/bare/bundles/bareFormat.js",
"keys": [ "keys": [
"bareDgram" "bareFormat"
] ]
}, },
{ {
@@ -259,36 +265,18 @@
"bareFormData" "bareFormData"
] ]
}, },
{
"path": "/lib/bare/bundles/bareFormat.js",
"keys": [
"bareFormat"
]
},
{ {
"path": "/lib/bare/bundles/bareGif.js", "path": "/lib/bare/bundles/bareGif.js",
"keys": [ "keys": [
"bareGif" "bareGif"
] ]
}, },
{
"path": "/lib/bare/bundles/bareHrtime.js",
"keys": [
"bareHrtime"
]
},
{ {
"path": "/lib/bare/bundles/bareFileLogger.js", "path": "/lib/bare/bundles/bareFileLogger.js",
"keys": [ "keys": [
"bareFileLogger" "bareFileLogger"
] ]
}, },
{
"path": "/lib/bare/bundles/bareHeif.js",
"keys": [
"bareHeif"
]
},
{ {
"path": "/lib/bare/bundles/bareGtk.js", "path": "/lib/bare/bundles/bareGtk.js",
"keys": [ "keys": [
@@ -296,9 +284,15 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareFs.js", "path": "/lib/bare/bundles/bareHrtime.js",
"keys": [ "keys": [
"bareFs" "bareHrtime"
]
},
{
"path": "/lib/bare/bundles/bareHeif.js",
"keys": [
"bareHeif"
] ]
}, },
{ {
@@ -307,6 +301,12 @@
"bareHttpParser" "bareHttpParser"
] ]
}, },
{
"path": "/lib/bare/bundles/bareFs.js",
"keys": [
"bareFs"
]
},
{ {
"path": "/lib/bare/bundles/bareIco.js", "path": "/lib/bare/bundles/bareIco.js",
"keys": [ "keys": [
@@ -325,24 +325,30 @@
"bareHttp1" "bareHttp1"
] ]
}, },
{
"path": "/lib/bare/bundles/bareInspect.js",
"keys": [
"bareInspect"
]
},
{ {
"path": "/lib/bare/bundles/bareHttps.js", "path": "/lib/bare/bundles/bareHttps.js",
"keys": [ "keys": [
"bareHttps" "bareHttps"
] ]
}, },
{
"path": "/lib/bare/bundles/bareInspect.js",
"keys": [
"bareInspect"
]
},
{ {
"path": "/lib/bare/bundles/bareJpeg.js", "path": "/lib/bare/bundles/bareJpeg.js",
"keys": [ "keys": [
"bareJpeg" "bareJpeg"
] ]
}, },
{
"path": "/lib/bare/bundles/bareIntl.js",
"keys": [
"bareIntl"
]
},
{ {
"path": "/lib/bare/bundles/bareIpc.js", "path": "/lib/bare/bundles/bareIpc.js",
"keys": [ "keys": [
@@ -350,9 +356,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareIntl.js", "path": "/lib/bare/bundles/bareInspector.js",
"keys": [ "keys": [
"bareIntl" "bareInspector"
] ]
}, },
{ {
@@ -367,30 +373,24 @@
"bareLief" "bareLief"
] ]
}, },
{
"path": "/lib/bare/bundles/bareInspector.js",
"keys": [
"bareInspector"
]
},
{ {
"path": "/lib/bare/bundles/bareMake.js", "path": "/lib/bare/bundles/bareMake.js",
"keys": [ "keys": [
"bareMake" "bareMake"
] ]
}, },
{
"path": "/lib/bare/bundles/bareModuleResolve.js",
"keys": [
"bareModuleResolve"
]
},
{ {
"path": "/lib/bare/bundles/bareLink.js", "path": "/lib/bare/bundles/bareLink.js",
"keys": [ "keys": [
"bareLink" "bareLink"
] ]
}, },
{
"path": "/lib/bare/bundles/bareModuleResolve.js",
"keys": [
"bareModuleResolve"
]
},
{ {
"path": "/lib/bare/bundles/bareModuleLexer.js", "path": "/lib/bare/bundles/bareModuleLexer.js",
"keys": [ "keys": [
@@ -409,42 +409,36 @@
"bareMedia" "bareMedia"
] ]
}, },
{
"path": "/lib/bare/bundles/bareNdk.js",
"keys": [
"bareNdk"
]
},
{
"path": "/lib/bare/bundles/bareNodeFetch.js",
"keys": [
"bareNodeFetch"
]
},
{ {
"path": "/lib/bare/bundles/bareNative.js", "path": "/lib/bare/bundles/bareNative.js",
"keys": [ "keys": [
"bareNative" "bareNative"
] ]
}, },
{
"path": "/lib/bare/bundles/bareNet.js",
"keys": [
"bareNet"
]
},
{
"path": "/lib/bare/bundles/bareOpen.js",
"keys": [
"bareOpen"
]
},
{ {
"path": "/lib/bare/bundles/bareModuleTraverse.js", "path": "/lib/bare/bundles/bareModuleTraverse.js",
"keys": [ "keys": [
"bareModuleTraverse" "bareModuleTraverse"
] ]
}, },
{
"path": "/lib/bare/bundles/bareNdk.js",
"keys": [
"bareNdk"
]
},
{
"path": "/lib/bare/bundles/bareNet.js",
"keys": [
"bareNet"
]
},
{
"path": "/lib/bare/bundles/bareNodeFetch.js",
"keys": [
"bareNodeFetch"
]
},
{ {
"path": "/lib/bare/bundles/bareOs.js", "path": "/lib/bare/bundles/bareOs.js",
"keys": [ "keys": [
@@ -452,9 +446,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/barePerformance.js", "path": "/lib/bare/bundles/bareOpen.js",
"keys": [ "keys": [
"barePerformance" "bareOpen"
] ]
}, },
{ {
@@ -464,9 +458,15 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/barePng.js", "path": "/lib/bare/bundles/barePerformance.js",
"keys": [ "keys": [
"barePng" "barePerformance"
]
},
{
"path": "/lib/bare/bundles/bareDev.js",
"keys": [
"bareDev"
] ]
}, },
{ {
@@ -476,9 +476,15 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareDev.js", "path": "/lib/bare/bundles/barePng.js",
"keys": [ "keys": [
"bareDev" "barePng"
]
},
{
"path": "/lib/bare/bundles/barePunycode.js",
"keys": [
"barePunycode"
] ]
}, },
{ {
@@ -499,12 +505,6 @@
"bareQuerystring" "bareQuerystring"
] ]
}, },
{
"path": "/lib/bare/bundles/barePunycode.js",
"keys": [
"barePunycode"
]
},
{ {
"path": "/lib/bare/bundles/bareQueueMicrotask.js", "path": "/lib/bare/bundles/bareQueueMicrotask.js",
"keys": [ "keys": [
@@ -517,12 +517,6 @@
"barePrebuild" "barePrebuild"
] ]
}, },
{
"path": "/lib/bare/bundles/bareRealm.js",
"keys": [
"bareRealm"
]
},
{ {
"path": "/lib/bare/bundles/bareProcess.js", "path": "/lib/bare/bundles/bareProcess.js",
"keys": [ "keys": [
@@ -530,27 +524,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareRuntime.js", "path": "/lib/bare/bundles/bareRealm.js",
"keys": [ "keys": [
"bareRuntime" "bareRealm"
]
},
{
"path": "/lib/bare/bundles/bareSdl.js",
"keys": [
"bareSdl"
]
},
{
"path": "/lib/bare/bundles/bareRepl.js",
"keys": [
"bareRepl"
]
},
{
"path": "/lib/bare/bundles/barePromClient.js",
"keys": [
"barePromClient"
] ]
}, },
{ {
@@ -559,6 +535,24 @@
"bareRpc" "bareRpc"
] ]
}, },
{
"path": "/lib/bare/bundles/barePromClient.js",
"keys": [
"barePromClient"
]
},
{
"path": "/lib/bare/bundles/bareRepl.js",
"keys": [
"bareRepl"
]
},
{
"path": "/lib/bare/bundles/bareRuntime.js",
"keys": [
"bareRuntime"
]
},
{ {
"path": "/lib/bare/bundles/bareSemver.js", "path": "/lib/bare/bundles/bareSemver.js",
"keys": [ "keys": [
@@ -566,9 +560,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareSignals.js", "path": "/lib/bare/bundles/bareSdl.js",
"keys": [ "keys": [
"bareSignals" "bareSdl"
] ]
}, },
{ {
@@ -578,9 +572,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareStream.js", "path": "/lib/bare/bundles/bareSignals.js",
"keys": [ "keys": [
"bareStream" "bareSignals"
] ]
}, },
{ {
@@ -589,12 +583,6 @@
"bareStdio" "bareStdio"
] ]
}, },
{
"path": "/lib/bare/bundles/bareSidecar.js",
"keys": [
"bareSidecar"
]
},
{ {
"path": "/lib/bare/bundles/bareStringDecoder.js", "path": "/lib/bare/bundles/bareStringDecoder.js",
"keys": [ "keys": [
@@ -608,15 +596,15 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareSvg.js", "path": "/lib/bare/bundles/bareStream.js",
"keys": [ "keys": [
"bareSvg" "bareStream"
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareSystemLogger.js", "path": "/lib/bare/bundles/bareSidecar.js",
"keys": [ "keys": [
"bareSystemLogger" "bareSidecar"
] ]
}, },
{ {
@@ -625,6 +613,12 @@
"bareStructuredClone" "bareStructuredClone"
] ]
}, },
{
"path": "/lib/bare/bundles/bareSvg.js",
"keys": [
"bareSvg"
]
},
{ {
"path": "/lib/bare/bundles/bareTap.js", "path": "/lib/bare/bundles/bareTap.js",
"keys": [ "keys": [
@@ -637,6 +631,12 @@
"bareSubprocess" "bareSubprocess"
] ]
}, },
{
"path": "/lib/bare/bundles/bareSystemLogger.js",
"keys": [
"bareSystemLogger"
]
},
{ {
"path": "/lib/bare/bundles/bareTiff.js", "path": "/lib/bare/bundles/bareTiff.js",
"keys": [ "keys": [
@@ -655,6 +655,12 @@
"bareTimers" "bareTimers"
] ]
}, },
{
"path": "/lib/bare/bundles/bareThread.js",
"keys": [
"bareThread"
]
},
{ {
"path": "/lib/bare/bundles/bareTpl.js", "path": "/lib/bare/bundles/bareTpl.js",
"keys": [ "keys": [
@@ -667,6 +673,12 @@
"bareType" "bareType"
] ]
}, },
{
"path": "/lib/bare/bundles/bareTls.js",
"keys": [
"bareTls"
]
},
{ {
"path": "/lib/bare/bundles/bareUiKit.js", "path": "/lib/bare/bundles/bareUiKit.js",
"keys": [ "keys": [
@@ -680,9 +692,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareTls.js", "path": "/lib/bare/bundles/bareV8.js",
"keys": [ "keys": [
"bareTls" "bareV8"
] ]
}, },
{ {
@@ -691,18 +703,6 @@
"bareUnpack" "bareUnpack"
] ]
}, },
{
"path": "/lib/bare/bundles/bareThread.js",
"keys": [
"bareThread"
]
},
{
"path": "/lib/bare/bundles/bareV8.js",
"keys": [
"bareV8"
]
},
{ {
"path": "/lib/bare/bundles/bareVm.js", "path": "/lib/bare/bundles/bareVm.js",
"keys": [ "keys": [
@@ -721,48 +721,48 @@
"bareWebKit" "bareWebKit"
] ]
}, },
{
"path": "/lib/bare/bundles/bareWebp.js",
"keys": [
"bareWebp"
]
},
{ {
"path": "/lib/bare/bundles/bareUnionBundle.js", "path": "/lib/bare/bundles/bareUnionBundle.js",
"keys": [ "keys": [
"bareUnionBundle" "bareUnionBundle"
] ]
}, },
{
"path": "/lib/bare/bundles/bareWebKitGtk.js",
"keys": [
"bareWebKitGtk"
]
},
{
"path": "/lib/bare/bundles/bareWinUi.js",
"keys": [
"bareWinUi"
]
},
{
"path": "/lib/bare/bundles/bareV8ToIstanbul.js",
"keys": [
"bareV8ToIstanbul"
]
},
{ {
"path": "/lib/bare/bundles/bareUtils.js", "path": "/lib/bare/bundles/bareUtils.js",
"keys": [ "keys": [
"bareUtils" "bareUtils"
] ]
}, },
{
"path": "/lib/bare/bundles/bareWebp.js",
"keys": [
"bareWebp"
]
},
{
"path": "/lib/bare/bundles/bareWebKitGtk.js",
"keys": [
"bareWebKitGtk"
]
},
{
"path": "/lib/bare/bundles/bareV8ToIstanbul.js",
"keys": [
"bareV8ToIstanbul"
]
},
{ {
"path": "/lib/bare/bundles/bareWhich.js", "path": "/lib/bare/bundles/bareWhich.js",
"keys": [ "keys": [
"bareWhich" "bareWhich"
] ]
}, },
{
"path": "/lib/bare/bundles/bareWinUi.js",
"keys": [
"bareWinUi"
]
},
{ {
"path": "/lib/bare/bundles/bareXdiff.js", "path": "/lib/bare/bundles/bareXdiff.js",
"keys": [ "keys": [
@@ -770,15 +770,15 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareWs.js", "path": "/lib/bare/bundles/bareZlib.js",
"keys": [ "keys": [
"bareWs" "bareZlib"
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareWorker.js", "path": "/lib/bare/bundles/bareWs.js",
"keys": [ "keys": [
"bareWorker" "bareWs"
] ]
}, },
{ {
@@ -788,9 +788,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareZlib.js", "path": "/lib/bare/bundles/bareWorker.js",
"keys": [ "keys": [
"bareZlib" "bareWorker"
] ]
}, },
{ {
@@ -1607,8 +1607,8 @@
], ],
"bundleProvenance": { "bundleProvenance": {
"schemaVersion": 1, "schemaVersion": 1,
"generatedAt": "2026-04-21T21:59:30.817Z", "generatedAt": "2026-04-21T22:05:46.163Z",
"gitCommit": "98dd91020ea8898768e864267a2e72429be1cbce", "gitCommit": "0359129a729d59ceafe77eb71347a43a4a67ccbf",
"nodeVersion": "v20.20.2", "nodeVersion": "v20.20.2",
"bundleTier": "all", "bundleTier": "all",
"normativeManifest": "packages/bare-os-booter/lib/bare-module-manifest.json", "normativeManifest": "packages/bare-os-booter/lib/bare-module-manifest.json",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"schema": 1, "schema": 1,
"atMs": 1776808769662, "atMs": 1776809144362,
"commands": [ "commands": [
"arch", "arch",
"awk", "awk",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"generatedAt": "2026-04-21T21:59:29.821Z", "generatedAt": "2026-04-21T22:05:44.530Z",
"pages": [ "pages": [
{ {
"name": "arch", "name": "arch",
@@ -411,7 +411,10 @@ export function attachBareOsSftp(
} }
const end = Math.min(off + len, f.buf.length) const end = Math.min(off + len, f.buf.length)
if (off >= f.buf.length) return sftp.status(reqid, STATUS_CODE.EOF) if (off >= f.buf.length) return sftp.status(reqid, STATUS_CODE.EOF)
const slice = f.buf.subarray(off, end) let slice = f.buf.subarray(off, end)
if (!Buffer.isBuffer(slice)) {
slice = Buffer.from(slice.buffer, slice.byteOffset, slice.byteLength)
}
sftp.data(reqid, slice) sftp.data(reqid, slice)
} catch { } catch {
sftp.status(reqid, STATUS_CODE.FAILURE) sftp.status(reqid, STATUS_CODE.FAILURE)
+1
View File
@@ -4,3 +4,4 @@
- **SFTP stability:** Harden `REQUEST.READ` parsing in vendored `bare-ssh2` (`handle` / `offset` / `len` must be defined before emit). Align `WRITE` and `FSETSTAT` guards with other handle-based handlers. - **SFTP stability:** Harden `REQUEST.READ` parsing in vendored `bare-ssh2` (`handle` / `offset` / `len` must be defined before emit). Align `WRITE` and `FSETSTAT` guards with other handle-based handlers.
- **Bare OS SFTP shim:** `enqueueSftpReply` now takes `reqid` and sends `SSH_FX_FAILURE` if the queued handler throws or rejects, avoiding stalled clients and reducing risk of uncaught SFTP-path errors surfacing as native aborts (`bad_optional_access` under `-fno-exceptions`) after the serialized-reply ordering change. - **Bare OS SFTP shim:** `enqueueSftpReply` now takes `reqid` and sends `SSH_FX_FAILURE` if the queued handler throws or rejects, avoiding stalled clients and reducing risk of uncaught SFTP-path errors surfacing as native aborts (`bad_optional_access` under `-fno-exceptions`) after the serialized-reply ordering change.
- **SFTP DATA / channel binary:** Coerce `Uint8Array` (and other typed views) to `Buffer` in `SFTP.prototype.data` and `Protocol.channelData` / `channelExtData`. VFS-backed file buffers are often typed arrays; treating them as UTF-8 strings when `Buffer.isBuffer` is false corrupted SSH channel packets and could abort the runtime with `bad_optional_access`.
@@ -456,6 +456,9 @@ class Protocol {
sendPacket(this, this._packetRW.write.finalize(packet)) sendPacket(this, this._packetRW.write.finalize(packet))
} }
channelData(chan, data) { channelData(chan, data) {
if (ArrayBuffer.isView(data) && !Buffer.isBuffer(data)) {
data = Buffer.from(data.buffer, data.byteOffset, data.byteLength)
}
const isBuffer = Buffer.isBuffer(data) const isBuffer = Buffer.isBuffer(data)
const dataLen = isBuffer ? data.length : Buffer.byteLength(data) const dataLen = isBuffer ? data.length : Buffer.byteLength(data)
let p = this._packetRW.write.allocStart let p = this._packetRW.write.allocStart
@@ -474,6 +477,9 @@ class Protocol {
sendPacket(this, this._packetRW.write.finalize(packet)) sendPacket(this, this._packetRW.write.finalize(packet))
} }
channelExtData(chan, data, type) { channelExtData(chan, data, type) {
if (ArrayBuffer.isView(data) && !Buffer.isBuffer(data)) {
data = Buffer.from(data.buffer, data.byteOffset, data.byteLength)
}
const isBuffer = Buffer.isBuffer(data) const isBuffer = Buffer.isBuffer(data)
const dataLen = isBuffer ? data.length : Buffer.byteLength(data) const dataLen = isBuffer ? data.length : Buffer.byteLength(data)
let p = this._packetRW.write.allocStart let p = this._packetRW.write.allocStart
@@ -1723,6 +1723,12 @@ class SFTP extends EventEmitter {
data(reqid, data, encoding) { data(reqid, data, encoding) {
if (!this.server) throw new Error('Server-only method called in client mode') if (!this.server) throw new Error('Server-only method called in client mode')
// VFS readFile often returns Uint8Array; subarray() stays a typed view. Without this,
// !Buffer.isBuffer leads to utf8Write/binary confusion or throw — SFTP DATA must be raw bytes.
if (ArrayBuffer.isView(data) && !Buffer.isBuffer(data)) {
data = Buffer.from(data.buffer, data.byteOffset, data.byteLength)
}
const isBuffer = Buffer.isBuffer(data) const isBuffer = Buffer.isBuffer(data)
if (!isBuffer && typeof data !== 'string') throw new Error('data is not a Buffer or string') if (!isBuffer && typeof data !== 'string') throw new Error('data is not a Buffer or string')
@@ -1,7 +1,7 @@
{ {
"schema": 2, "schema": 2,
"profileId": "bare-os-posix-like", "profileId": "bare-os-posix-like",
"generatedAt": "2026-04-21T21:59:29.663Z", "generatedAt": "2026-04-21T22:05:44.363Z",
"note": "Sparse POSIX Issue 7 coverage hints for /bin utilities. Omitted command names are not yet profiled here.", "note": "Sparse POSIX Issue 7 coverage hints for /bin utilities. Omitted command names are not yet profiled here.",
"commandIndex": [ "commandIndex": [
{ {
@@ -25,36 +25,36 @@
"compactEncoding" "compactEncoding"
] ]
}, },
{
"path": "/lib/bare/bundles/protomux.js",
"keys": [
"protomux"
]
},
{ {
"path": "/lib/bare/bundles/bareUrl.js", "path": "/lib/bare/bundles/bareUrl.js",
"keys": [ "keys": [
"bareUrl" "bareUrl"
] ]
}, },
{
"path": "/lib/bare/bundles/protomux.js",
"keys": [
"protomux"
]
},
{ {
"path": "/lib/bare/bundles/barePath.js", "path": "/lib/bare/bundles/barePath.js",
"keys": [ "keys": [
"barePath" "barePath"
] ]
}, },
{
"path": "/lib/bare/bundles/bareEncoding.js",
"keys": [
"bareEncoding"
]
},
{ {
"path": "/lib/bare/bundles/bareEvents.js", "path": "/lib/bare/bundles/bareEvents.js",
"keys": [ "keys": [
"bareEvents" "bareEvents"
] ]
}, },
{
"path": "/lib/bare/bundles/bareEncoding.js",
"keys": [
"bareEncoding"
]
},
{ {
"path": "/lib/bare/bundles/bareAbort.js", "path": "/lib/bare/bundles/bareAbort.js",
"keys": [ "keys": [
@@ -79,12 +79,6 @@
"bareAddonResolve" "bareAddonResolve"
] ]
}, },
{
"path": "/lib/bare/bundles/bareAssert.js",
"keys": [
"bareAssert"
]
},
{ {
"path": "/lib/bare/bundles/bareReadline.js", "path": "/lib/bare/bundles/bareReadline.js",
"keys": [ "keys": [
@@ -104,9 +98,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/fetch.js", "path": "/lib/bare/bundles/bareAssert.js",
"keys": [ "keys": [
"fetch" "bareAssert"
] ]
}, },
{ {
@@ -122,9 +116,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareApk.js", "path": "/lib/bare/bundles/fetch.js",
"keys": [ "keys": [
"bareApk" "fetch"
] ]
}, },
{ {
@@ -133,6 +127,12 @@
"bareBmp" "bareBmp"
] ]
}, },
{
"path": "/lib/bare/bundles/bareBuffer.js",
"keys": [
"bareBuffer"
]
},
{ {
"path": "/lib/bare/bundles/bareBundleCompile.js", "path": "/lib/bare/bundles/bareBundleCompile.js",
"keys": [ "keys": [
@@ -146,9 +146,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareBuffer.js", "path": "/lib/bare/bundles/bareApk.js",
"keys": [ "keys": [
"bareBuffer" "bareApk"
] ]
}, },
{ {
@@ -163,6 +163,12 @@
"bareConsole" "bareConsole"
] ]
}, },
{
"path": "/lib/bare/bundles/bareChannel.js",
"keys": [
"bareChannel"
]
},
{ {
"path": "/lib/bare/bundles/bareBundleEvaluate.js", "path": "/lib/bare/bundles/bareBundleEvaluate.js",
"keys": [ "keys": [
@@ -170,9 +176,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareChannel.js", "path": "/lib/bare/bundles/bareBoot.js",
"keys": [ "keys": [
"bareChannel" "bareBoot"
] ]
}, },
{ {
@@ -188,9 +194,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareBoot.js", "path": "/lib/bare/bundles/bareDiagnosticsChannel.js",
"keys": [ "keys": [
"bareBoot" "bareDiagnosticsChannel"
] ]
}, },
{ {
@@ -205,36 +211,36 @@
"bareCov" "bareCov"
] ]
}, },
{
"path": "/lib/bare/bundles/bareDiagnosticsChannel.js",
"keys": [
"bareDiagnosticsChannel"
]
},
{ {
"path": "/lib/bare/bundles/bareDns.js", "path": "/lib/bare/bundles/bareDns.js",
"keys": [ "keys": [
"bareDns" "bareDns"
] ]
}, },
{
"path": "/lib/bare/bundles/bareDaemon.js",
"keys": [
"bareDaemon"
]
},
{ {
"path": "/lib/bare/bundles/bareEnv.js", "path": "/lib/bare/bundles/bareEnv.js",
"keys": [ "keys": [
"bareEnv" "bareEnv"
] ]
}, },
{
"path": "/lib/bare/bundles/bareDaemon.js",
"keys": [
"bareDaemon"
]
},
{ {
"path": "/lib/bare/bundles/bareExif.js", "path": "/lib/bare/bundles/bareExif.js",
"keys": [ "keys": [
"bareExif" "bareExif"
] ]
}, },
{
"path": "/lib/bare/bundles/bareDgram.js",
"keys": [
"bareDgram"
]
},
{ {
"path": "/lib/bare/bundles/bareFfmpeg.js", "path": "/lib/bare/bundles/bareFfmpeg.js",
"keys": [ "keys": [
@@ -248,9 +254,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareDgram.js", "path": "/lib/bare/bundles/bareFormat.js",
"keys": [ "keys": [
"bareDgram" "bareFormat"
] ]
}, },
{ {
@@ -259,36 +265,18 @@
"bareFormData" "bareFormData"
] ]
}, },
{
"path": "/lib/bare/bundles/bareFormat.js",
"keys": [
"bareFormat"
]
},
{ {
"path": "/lib/bare/bundles/bareGif.js", "path": "/lib/bare/bundles/bareGif.js",
"keys": [ "keys": [
"bareGif" "bareGif"
] ]
}, },
{
"path": "/lib/bare/bundles/bareHrtime.js",
"keys": [
"bareHrtime"
]
},
{ {
"path": "/lib/bare/bundles/bareFileLogger.js", "path": "/lib/bare/bundles/bareFileLogger.js",
"keys": [ "keys": [
"bareFileLogger" "bareFileLogger"
] ]
}, },
{
"path": "/lib/bare/bundles/bareHeif.js",
"keys": [
"bareHeif"
]
},
{ {
"path": "/lib/bare/bundles/bareGtk.js", "path": "/lib/bare/bundles/bareGtk.js",
"keys": [ "keys": [
@@ -296,9 +284,15 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareFs.js", "path": "/lib/bare/bundles/bareHrtime.js",
"keys": [ "keys": [
"bareFs" "bareHrtime"
]
},
{
"path": "/lib/bare/bundles/bareHeif.js",
"keys": [
"bareHeif"
] ]
}, },
{ {
@@ -307,6 +301,12 @@
"bareHttpParser" "bareHttpParser"
] ]
}, },
{
"path": "/lib/bare/bundles/bareFs.js",
"keys": [
"bareFs"
]
},
{ {
"path": "/lib/bare/bundles/bareIco.js", "path": "/lib/bare/bundles/bareIco.js",
"keys": [ "keys": [
@@ -325,24 +325,30 @@
"bareHttp1" "bareHttp1"
] ]
}, },
{
"path": "/lib/bare/bundles/bareInspect.js",
"keys": [
"bareInspect"
]
},
{ {
"path": "/lib/bare/bundles/bareHttps.js", "path": "/lib/bare/bundles/bareHttps.js",
"keys": [ "keys": [
"bareHttps" "bareHttps"
] ]
}, },
{
"path": "/lib/bare/bundles/bareInspect.js",
"keys": [
"bareInspect"
]
},
{ {
"path": "/lib/bare/bundles/bareJpeg.js", "path": "/lib/bare/bundles/bareJpeg.js",
"keys": [ "keys": [
"bareJpeg" "bareJpeg"
] ]
}, },
{
"path": "/lib/bare/bundles/bareIntl.js",
"keys": [
"bareIntl"
]
},
{ {
"path": "/lib/bare/bundles/bareIpc.js", "path": "/lib/bare/bundles/bareIpc.js",
"keys": [ "keys": [
@@ -350,9 +356,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareIntl.js", "path": "/lib/bare/bundles/bareInspector.js",
"keys": [ "keys": [
"bareIntl" "bareInspector"
] ]
}, },
{ {
@@ -367,30 +373,24 @@
"bareLief" "bareLief"
] ]
}, },
{
"path": "/lib/bare/bundles/bareInspector.js",
"keys": [
"bareInspector"
]
},
{ {
"path": "/lib/bare/bundles/bareMake.js", "path": "/lib/bare/bundles/bareMake.js",
"keys": [ "keys": [
"bareMake" "bareMake"
] ]
}, },
{
"path": "/lib/bare/bundles/bareModuleResolve.js",
"keys": [
"bareModuleResolve"
]
},
{ {
"path": "/lib/bare/bundles/bareLink.js", "path": "/lib/bare/bundles/bareLink.js",
"keys": [ "keys": [
"bareLink" "bareLink"
] ]
}, },
{
"path": "/lib/bare/bundles/bareModuleResolve.js",
"keys": [
"bareModuleResolve"
]
},
{ {
"path": "/lib/bare/bundles/bareModuleLexer.js", "path": "/lib/bare/bundles/bareModuleLexer.js",
"keys": [ "keys": [
@@ -409,42 +409,36 @@
"bareMedia" "bareMedia"
] ]
}, },
{
"path": "/lib/bare/bundles/bareNdk.js",
"keys": [
"bareNdk"
]
},
{
"path": "/lib/bare/bundles/bareNodeFetch.js",
"keys": [
"bareNodeFetch"
]
},
{ {
"path": "/lib/bare/bundles/bareNative.js", "path": "/lib/bare/bundles/bareNative.js",
"keys": [ "keys": [
"bareNative" "bareNative"
] ]
}, },
{
"path": "/lib/bare/bundles/bareNet.js",
"keys": [
"bareNet"
]
},
{
"path": "/lib/bare/bundles/bareOpen.js",
"keys": [
"bareOpen"
]
},
{ {
"path": "/lib/bare/bundles/bareModuleTraverse.js", "path": "/lib/bare/bundles/bareModuleTraverse.js",
"keys": [ "keys": [
"bareModuleTraverse" "bareModuleTraverse"
] ]
}, },
{
"path": "/lib/bare/bundles/bareNdk.js",
"keys": [
"bareNdk"
]
},
{
"path": "/lib/bare/bundles/bareNet.js",
"keys": [
"bareNet"
]
},
{
"path": "/lib/bare/bundles/bareNodeFetch.js",
"keys": [
"bareNodeFetch"
]
},
{ {
"path": "/lib/bare/bundles/bareOs.js", "path": "/lib/bare/bundles/bareOs.js",
"keys": [ "keys": [
@@ -452,9 +446,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/barePerformance.js", "path": "/lib/bare/bundles/bareOpen.js",
"keys": [ "keys": [
"barePerformance" "bareOpen"
] ]
}, },
{ {
@@ -464,9 +458,15 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/barePng.js", "path": "/lib/bare/bundles/barePerformance.js",
"keys": [ "keys": [
"barePng" "barePerformance"
]
},
{
"path": "/lib/bare/bundles/bareDev.js",
"keys": [
"bareDev"
] ]
}, },
{ {
@@ -476,9 +476,15 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareDev.js", "path": "/lib/bare/bundles/barePng.js",
"keys": [ "keys": [
"bareDev" "barePng"
]
},
{
"path": "/lib/bare/bundles/barePunycode.js",
"keys": [
"barePunycode"
] ]
}, },
{ {
@@ -499,12 +505,6 @@
"bareQuerystring" "bareQuerystring"
] ]
}, },
{
"path": "/lib/bare/bundles/barePunycode.js",
"keys": [
"barePunycode"
]
},
{ {
"path": "/lib/bare/bundles/bareQueueMicrotask.js", "path": "/lib/bare/bundles/bareQueueMicrotask.js",
"keys": [ "keys": [
@@ -517,12 +517,6 @@
"barePrebuild" "barePrebuild"
] ]
}, },
{
"path": "/lib/bare/bundles/bareRealm.js",
"keys": [
"bareRealm"
]
},
{ {
"path": "/lib/bare/bundles/bareProcess.js", "path": "/lib/bare/bundles/bareProcess.js",
"keys": [ "keys": [
@@ -530,27 +524,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareRuntime.js", "path": "/lib/bare/bundles/bareRealm.js",
"keys": [ "keys": [
"bareRuntime" "bareRealm"
]
},
{
"path": "/lib/bare/bundles/bareSdl.js",
"keys": [
"bareSdl"
]
},
{
"path": "/lib/bare/bundles/bareRepl.js",
"keys": [
"bareRepl"
]
},
{
"path": "/lib/bare/bundles/barePromClient.js",
"keys": [
"barePromClient"
] ]
}, },
{ {
@@ -559,6 +535,24 @@
"bareRpc" "bareRpc"
] ]
}, },
{
"path": "/lib/bare/bundles/barePromClient.js",
"keys": [
"barePromClient"
]
},
{
"path": "/lib/bare/bundles/bareRepl.js",
"keys": [
"bareRepl"
]
},
{
"path": "/lib/bare/bundles/bareRuntime.js",
"keys": [
"bareRuntime"
]
},
{ {
"path": "/lib/bare/bundles/bareSemver.js", "path": "/lib/bare/bundles/bareSemver.js",
"keys": [ "keys": [
@@ -566,9 +560,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareSignals.js", "path": "/lib/bare/bundles/bareSdl.js",
"keys": [ "keys": [
"bareSignals" "bareSdl"
] ]
}, },
{ {
@@ -578,9 +572,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareStream.js", "path": "/lib/bare/bundles/bareSignals.js",
"keys": [ "keys": [
"bareStream" "bareSignals"
] ]
}, },
{ {
@@ -589,12 +583,6 @@
"bareStdio" "bareStdio"
] ]
}, },
{
"path": "/lib/bare/bundles/bareSidecar.js",
"keys": [
"bareSidecar"
]
},
{ {
"path": "/lib/bare/bundles/bareStringDecoder.js", "path": "/lib/bare/bundles/bareStringDecoder.js",
"keys": [ "keys": [
@@ -608,15 +596,15 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareSvg.js", "path": "/lib/bare/bundles/bareStream.js",
"keys": [ "keys": [
"bareSvg" "bareStream"
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareSystemLogger.js", "path": "/lib/bare/bundles/bareSidecar.js",
"keys": [ "keys": [
"bareSystemLogger" "bareSidecar"
] ]
}, },
{ {
@@ -625,6 +613,12 @@
"bareStructuredClone" "bareStructuredClone"
] ]
}, },
{
"path": "/lib/bare/bundles/bareSvg.js",
"keys": [
"bareSvg"
]
},
{ {
"path": "/lib/bare/bundles/bareTap.js", "path": "/lib/bare/bundles/bareTap.js",
"keys": [ "keys": [
@@ -637,6 +631,12 @@
"bareSubprocess" "bareSubprocess"
] ]
}, },
{
"path": "/lib/bare/bundles/bareSystemLogger.js",
"keys": [
"bareSystemLogger"
]
},
{ {
"path": "/lib/bare/bundles/bareTiff.js", "path": "/lib/bare/bundles/bareTiff.js",
"keys": [ "keys": [
@@ -655,6 +655,12 @@
"bareTimers" "bareTimers"
] ]
}, },
{
"path": "/lib/bare/bundles/bareThread.js",
"keys": [
"bareThread"
]
},
{ {
"path": "/lib/bare/bundles/bareTpl.js", "path": "/lib/bare/bundles/bareTpl.js",
"keys": [ "keys": [
@@ -667,6 +673,12 @@
"bareType" "bareType"
] ]
}, },
{
"path": "/lib/bare/bundles/bareTls.js",
"keys": [
"bareTls"
]
},
{ {
"path": "/lib/bare/bundles/bareUiKit.js", "path": "/lib/bare/bundles/bareUiKit.js",
"keys": [ "keys": [
@@ -680,9 +692,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareTls.js", "path": "/lib/bare/bundles/bareV8.js",
"keys": [ "keys": [
"bareTls" "bareV8"
] ]
}, },
{ {
@@ -691,18 +703,6 @@
"bareUnpack" "bareUnpack"
] ]
}, },
{
"path": "/lib/bare/bundles/bareThread.js",
"keys": [
"bareThread"
]
},
{
"path": "/lib/bare/bundles/bareV8.js",
"keys": [
"bareV8"
]
},
{ {
"path": "/lib/bare/bundles/bareVm.js", "path": "/lib/bare/bundles/bareVm.js",
"keys": [ "keys": [
@@ -721,48 +721,48 @@
"bareWebKit" "bareWebKit"
] ]
}, },
{
"path": "/lib/bare/bundles/bareWebp.js",
"keys": [
"bareWebp"
]
},
{ {
"path": "/lib/bare/bundles/bareUnionBundle.js", "path": "/lib/bare/bundles/bareUnionBundle.js",
"keys": [ "keys": [
"bareUnionBundle" "bareUnionBundle"
] ]
}, },
{
"path": "/lib/bare/bundles/bareWebKitGtk.js",
"keys": [
"bareWebKitGtk"
]
},
{
"path": "/lib/bare/bundles/bareWinUi.js",
"keys": [
"bareWinUi"
]
},
{
"path": "/lib/bare/bundles/bareV8ToIstanbul.js",
"keys": [
"bareV8ToIstanbul"
]
},
{ {
"path": "/lib/bare/bundles/bareUtils.js", "path": "/lib/bare/bundles/bareUtils.js",
"keys": [ "keys": [
"bareUtils" "bareUtils"
] ]
}, },
{
"path": "/lib/bare/bundles/bareWebp.js",
"keys": [
"bareWebp"
]
},
{
"path": "/lib/bare/bundles/bareWebKitGtk.js",
"keys": [
"bareWebKitGtk"
]
},
{
"path": "/lib/bare/bundles/bareV8ToIstanbul.js",
"keys": [
"bareV8ToIstanbul"
]
},
{ {
"path": "/lib/bare/bundles/bareWhich.js", "path": "/lib/bare/bundles/bareWhich.js",
"keys": [ "keys": [
"bareWhich" "bareWhich"
] ]
}, },
{
"path": "/lib/bare/bundles/bareWinUi.js",
"keys": [
"bareWinUi"
]
},
{ {
"path": "/lib/bare/bundles/bareXdiff.js", "path": "/lib/bare/bundles/bareXdiff.js",
"keys": [ "keys": [
@@ -770,15 +770,15 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareWs.js", "path": "/lib/bare/bundles/bareZlib.js",
"keys": [ "keys": [
"bareWs" "bareZlib"
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareWorker.js", "path": "/lib/bare/bundles/bareWs.js",
"keys": [ "keys": [
"bareWorker" "bareWs"
] ]
}, },
{ {
@@ -788,9 +788,9 @@
] ]
}, },
{ {
"path": "/lib/bare/bundles/bareZlib.js", "path": "/lib/bare/bundles/bareWorker.js",
"keys": [ "keys": [
"bareZlib" "bareWorker"
] ]
}, },
{ {
@@ -1607,8 +1607,8 @@
], ],
"bundleProvenance": { "bundleProvenance": {
"schemaVersion": 1, "schemaVersion": 1,
"generatedAt": "2026-04-21T21:59:30.817Z", "generatedAt": "2026-04-21T22:05:46.163Z",
"gitCommit": "98dd91020ea8898768e864267a2e72429be1cbce", "gitCommit": "0359129a729d59ceafe77eb71347a43a4a67ccbf",
"nodeVersion": "v20.20.2", "nodeVersion": "v20.20.2",
"bundleTier": "all", "bundleTier": "all",
"normativeManifest": "packages/bare-os-booter/lib/bare-module-manifest.json", "normativeManifest": "packages/bare-os-booter/lib/bare-module-manifest.json",
@@ -1,6 +1,6 @@
{ {
"schema": 1, "schema": 1,
"atMs": 1776808769662, "atMs": 1776809144362,
"commands": [ "commands": [
"arch", "arch",
"awk", "awk",
@@ -1,6 +1,6 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"generatedAt": "2026-04-21T21:59:29.821Z", "generatedAt": "2026-04-21T22:05:44.530Z",
"pages": [ "pages": [
{ {
"name": "arch", "name": "arch",