Stop the prompt writing off the front of its own buffer
The prompt is the working directory's path, worked out each time by walking the chain of parents up to the root. The names arrive deepest first, so they are written backwards from the end of a 127 byte buffer - and nothing bounded that walk. Nothing bounds the depth either. A path given to one operation is capped at 95 characters and a 22 character name, but "mkdir a" and "cd a" are each far inside that and can be repeated forever. Six directories of 22 characters is 132 characters of path, and at that point the walk wrote down past the front of CwdText and into what the assembler had laid out below it: the shell's own command names. ExitName sits five bytes under, so the word "exit" went first and the shell stopped recognising the command for leaving. Measured, not deduced: fine at five levels, gone at six. The walk now counts the room it has left, byte by byte, and stops. What is already written is the DEEP end of the path, which is the end worth showing, so it is cut at the front and three dots say so - out of three bytes held back from the count, so there is always somewhere to put them. Twenty levels deep the prompt shows the last five and every command still works. cosmosDeep records that, and records it by running help, cd and exit from down there rather than by looking at the prompt: a wrong prompt is cosmetic, and this was writing into other variables. It fails with the bound removed. The tree is built by SplitDisk because a path that long cannot be given to mkdir in one piece - which is the same fact that makes the depth unbounded. The three path limits are written down in the README now, including which one actually binds. The other two do not: the longest path on a full install is 21 characters.
This commit is contained in:
@@ -326,3 +326,19 @@ cp "$ROOT/Programs/Examples/hello.asm" hello.asm
|
||||
"$ROOT/Assembler" -I "$ROOT/Programs/CosmOS/Source" -I "$ROOT/Programs/CosmOS/Assembler" \
|
||||
"$ROOT/Programs/CosmOS/Assembler/tokenTest.asm" -o "$WORK/tokenTest.sbx" >/dev/null
|
||||
"$TOOL" put "$DISKS/asm.img" "$WORK/tokenTest.sbx" >/dev/null
|
||||
|
||||
# A tree deeper than the prompt can print, for the buffer that used to walk off the front
|
||||
# of itself. Eight directories of twenty two characters is 184 characters of path, and the
|
||||
# prompt is built backwards into 127 bytes - so before this was bounded, the walk wrote
|
||||
# down past the start of the buffer and over the shell's own command names. The word
|
||||
# "exit" was the first casualty, five bytes below.
|
||||
#
|
||||
# MADE HERE RATHER THAN BY THE TEST, because a path this long cannot be given to mkdir in
|
||||
# one piece: naming it is capped well below what walking into it a level at a time can
|
||||
# reach, which is exactly why the depth is unbounded in the first place.
|
||||
"$TOOL" format "$DISKS/deep.img" 512 8 >/dev/null
|
||||
DEEPPATH=""
|
||||
for i in 1 2 3 4 5 6 7 8; do
|
||||
DEEPPATH="$DEEPPATH/abcdefghijklmnopqrst0$i"
|
||||
"$TOOL" mkdir "$DISKS/deep.img" "$DEEPPATH" >/dev/null
|
||||
done
|
||||
|
||||
Reference in New Issue
Block a user