Compare commits

..
Author SHA1 Message Date
t3hn3rd 465107e904 fix: guard against uint32 underflow in memset/memcpy and strings unit
continuous-integration/drone/push Build is passing
When size=0 was passed to memset() or memcpy(), the loop bound
`0 to size-1` underflowed to $FFFFFFFF, iterating ~4 billion times
and causing an immediate page fault.

Added `if size = 0 then exit` guards to both memset() and memcpy()
in util.pas.

Also guarded all `for i:=0 to X-1` loops in strings.pas where X
could be 0 on empty string inputs:
- stringToUpper: wrap loop in `if stringSize > 0`
- stringToLower: wrap loop in `if stringSize > 0`
- stringEquals: early exit when both sizes are 0
- stringToInt: early exit when string is empty

Additionally fixed all previously identified bugs in strings.pas:
- hexStringToInt: guard against empty string underflow
- stringConcat: cache stringSize calls to avoid redundant O(n) scans
- stringTrim: clamp length to source string size
- stringSub: bounds check start/size against source length
- stringReplace: complete rewrite - was using stringEquals() for
  substring matching (only matched at string end), dropped prefix
  chars, had dangling assignment overwriting valid result with
  uninitialized pointer, and had unused variable
- stringIndexOf: rewritten to use new stringMatchAt() helper for
  correct substring matching
- stringContains: simplified to delegate to fixed stringIndexOf(),
  also fixing uint32 underflow when sub was empty
- stringToInt: removed always-true `v >= 0` check on uint32
- intToString: implemented (was a stub returning ' ')
- Added stringMatchAt() helper for prefix comparison
- Added comprehensive UnitTest procedure with 77 assertions
  including adversarial empty/nil/boundary inputs
2026-02-28 15:08:02 +00:00
t3hn3rd 3198d31027 Gitignore 2026-02-28 14:04:47 +00:00
245 changed files with 12035 additions and 101246 deletions

No files matched your search

+2 -2
View File
@@ -22,8 +22,8 @@ steps:
commands: commands:
- git fetch --tags - git fetch --tags
- find . -type f -print0 | xargs -0 dos2unix - find . -type f -print0 | xargs -0 dos2unix
- chmod +x /drone/src/toolchain/*.sh - chmod +x /drone/src/*.sh
- /drone/src/toolchain/compile.sh - /drone/src/compile.sh
- name: upload-iso-artifact - name: upload-iso-artifact
image: alpine/git image: alpine/git
-7
View File
@@ -1,8 +1 @@
* text=auto eol=lf * text=auto eol=lf
lvglh/** linguist-vendored
lvgl/** linguist-vendored
.vscode/* linguist-vendored
lib/* linguist-generated
release/* linguist-generated
iso/* linguist-generated
*.asm linguist-detectable
+2 -7
View File
@@ -11,11 +11,6 @@
/*.img /*.img
src/include/asuro.pas src/include/asuro.pas
localenv.json localenv.json
/lvgl/
dockerout.txt
AGENTS.md AGENTS.md
lessons_learnt.md build.log
*.log dockerout.txt
/doc/*.md
wasuro
src/core/core.version.pas
+3 -2
View File
@@ -5,7 +5,7 @@ VOLUME ["/code"]
ENV DEBIAN_FRONTEND=noninteractive ENV DEBIAN_FRONTEND=noninteractive
RUN dpkg --add-architecture i386 RUN dpkg --add-architecture i386
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
curl dos2unix wget git make nasm binutils xorriso grub-pc-bin gcc gcc-multilib && \ curl dos2unix wget git make nasm binutils:i386 xorriso grub-pc-bin && \
apt-get clean my room apt-get clean my room
SHELL ["/bin/bash", "-c"] SHELL ["/bin/bash", "-c"]
@@ -14,9 +14,10 @@ RUN curl -sL https://sourceforge.net/projects/freepascal/files/Linux/$FPC_VERSIO
pushd fpc-$FPC_VERSION.i386-linux && ./install.sh && popd && \ pushd fpc-$FPC_VERSION.i386-linux && ./install.sh && popd && \
rm -rf fpc-$FPC_VERSION.i386-linux rm -rf fpc-$FPC_VERSION.i386-linux
COPY compile.sh /compile.sh
ADD https://raw.githubusercontent.com/fsaintjacques/semver-tool/master/src/semver /usr/bin/semver ADD https://raw.githubusercontent.com/fsaintjacques/semver-tool/master/src/semver /usr/bin/semver
RUN chmod +x /usr/bin/semver RUN chmod +x /usr/bin/semver
WORKDIR /code WORKDIR /code
RUN find . -type f -print0 | xargs -0 dos2unix RUN find . -type f -print0 | xargs -0 dos2unix
ENTRYPOINT ["/bin/bash", "-c"] ENTRYPOINT ["/bin/bash", "-c"]
CMD ["find toolchain -name '*.sh' -exec dos2unix {} + 2>/dev/null; find toolchain -name '*.sh' -exec chmod +x {} +; bash toolchain/compile.sh"] CMD ["/compile.sh"]
-75
View File
@@ -1,75 +0,0 @@
{ Compatibility shim: wasuro references the old unit name 'lmemorymanager'.
Since wasuro/ cannot be modified, this unit re-exports the public API of
memory.heap so that 'uses lmemorymanager' continues to compile. }
unit lmemorymanager;
interface
uses
memory.heap;
const
ALLOC_UNIT = memory.heap.ALLOC_UNIT;
DATA_OFFSET = memory.heap.DATA_OFFSET;
PAGE_SIZE_LMM = memory.heap.PAGE_SIZE_LMM;
TOTAL_UNITS = memory.heap.TOTAL_UNITS;
BITMAP_DWORDS = memory.heap.BITMAP_DWORDS;
SIZE_PREFIX = memory.heap.SIZE_PREFIX;
LARGE_ALLOC_MAGIC = memory.heap.LARGE_ALLOC_MAGIC;
type
PHeapPageHeader = memory.heap.PHeapPageHeader;
THeapPageHeader = memory.heap.THeapPageHeader;
procedure init;
function kalloc(size : uint32) : void;
function klalloc(size : uint32) : void;
procedure klfree(address : uint32);
function kpalloc(address : uint32) : void;
procedure kfree(area : void);
function lmm_total_free : uint32;
function lmm_page_count : uint32;
implementation
procedure init;
begin
memory.heap.init;
end;
function kalloc(size : uint32) : void; inline;
begin
kalloc := memory.heap.kalloc(size);
end;
function klalloc(size : uint32) : void; inline;
begin
klalloc := memory.heap.klalloc(size);
end;
procedure klfree(address : uint32); inline;
begin
memory.heap.klfree(address);
end;
function kpalloc(address : uint32) : void; inline;
begin
kpalloc := memory.heap.kpalloc(address);
end;
procedure kfree(area : void); inline;
begin
memory.heap.kfree(area);
end;
function lmm_total_free : uint32; inline;
begin
lmm_total_free := memory.heap.lmm_total_free;
end;
function lmm_page_count : uint32; inline;
begin
lmm_page_count := memory.heap.lmm_page_count;
end;
end.
-7
View File
@@ -1,7 +0,0 @@
unit types;
interface
implementation
end.
+4 -8
View File
@@ -7,7 +7,7 @@ echo "Asuro Compilation"
echo " " echo " "
#Compile Stub.asm #Compile Stub.asm
rm -f lib/* rm lib/*
runOrFail() { runOrFail() {
local binary=$1 local binary=$1
@@ -20,13 +20,9 @@ runOrFail() {
fi fi
} }
TOOLCHAIN_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
declare -a run_steps=( declare -a run_steps=(
"compile_stub.sh" "Failed to compile stub!" "compile_stub.sh" "Failed to compile stub!"
"compile_vergen.sh" "Versions failed to compile" "compile_vergen.sh" "Versions failed to compile"
"compile_lvgl.sh" "Failed to compile LVGL!"
"compile_wasuro.sh" "Failed to pull Wasuro!"
"compile_sources.sh" "Failed to compile FPC Sources!" "compile_sources.sh" "Failed to compile FPC Sources!"
"compile_link.sh" "Failed linking!" "compile_link.sh" "Failed linking!"
"compile_isogen.sh" "Failed to create ISO!" "compile_isogen.sh" "Failed to create ISO!"
@@ -36,7 +32,7 @@ for ((i=0; i<${#run_steps[@]}; i+=2))
do do
if [ "$ERRCOUNT" -eq "0" ] if [ "$ERRCOUNT" -eq "0" ]
then then
script="${TOOLCHAIN_DIR}/${run_steps[$i]}" script=$(pwd)/"${run_steps[$i]}"
message="${run_steps[$i+1]}" message="${run_steps[$i+1]}"
runOrFail "$script" "$message" runOrFail "$script" "$message"
fi fi
@@ -45,9 +41,9 @@ done
#Call generate final artifacts based on failure or success of the above. #Call generate final artifacts based on failure or success of the above.
if [ "$ERRCOUNT" -ne "0" ] if [ "$ERRCOUNT" -ne "0" ]
then then
. "${TOOLCHAIN_DIR}/compile_finish.sh" "failed" . ./compile_finish.sh "failed"
else else
. "${TOOLCHAIN_DIR}/compile_finish.sh" "success" . ./compile_finish.sh "success"
fi fi
cd .. cd ..
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -14,9 +14,4 @@ done;
objstring=lib/stub.o" "$objstring objstring=lib/stub.o" "$objstring
echo "Object Files: "$objstring echo "Object Files: "$objstring
echo " " echo " "
ld -m elf_i386 -s --gc-sections -Tlinker.script -o bin/kernel.bin $objstring
# Find libgcc for i386 (needed by LVGL compiled with gcc)
LIBGCC=$(gcc -m32 -print-libgcc-file-name)
echo "libgcc: ${LIBGCC}"
ld -m elf_i386 -s --gc-sections -Ttoolchain/linker.script -o bin/kernel.bin $objstring --start-group lib/liblvgl.a ${LIBGCC} --end-group
File renamed without changes.
+7
View File
@@ -0,0 +1,7 @@
#!/usr/bin/env bash
echo " "
echo "======================="
echo " "
echo "Compiling FPC Sources..."
echo " "
fpc -Aelf -gw -g -gl -n -vlewn -O3 -OpPENTIUM3 -Si -Sc -Sg -Xd -CX -XXs -CfSSE -CfSSE2 -Rintel -Pi386 -Tlinux -FElib/ -Fusrc/* -Fusrc/driver/* -Fusrc/driver/net/* src/kernel.pas
+7
View File
@@ -0,0 +1,7 @@
#!/usr/bin/env bash
echo " "
echo "======================="
echo " "
echo "Compiling Stub..."
echo " "
nasm -f elf src/stub/stub.asm -o lib/stub.o
File renamed without changes.
@@ -1,15 +1,14 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -e set -e
TOOLCHAIN_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
echo " " echo " "
echo "=======================" echo "======================="
echo " " echo " "
echo "Generating Versioning Info..." echo "Generating Versioning Info..."
echo " " echo " "
chmod +x "${TOOLCHAIN_DIR}/compile_checksum.sh" chmod +x ./compile_checksum.sh
"${TOOLCHAIN_DIR}/compile_checksum.sh" ./compile_checksum.sh
outfile="src/core/core.version.pas" outfile="src/include/asuro.pas"
file="toolchain/version" file="version"
{ {
# this script requires semver tool # this script requires semver tool
wget -q https://raw.githubusercontent.com/fsaintjacques/semver-tool/master/src/semver -O bin/semver && chmod +x bin/semver wget -q https://raw.githubusercontent.com/fsaintjacques/semver-tool/master/src/semver -O bin/semver && chmod +x bin/semver
@@ -23,7 +22,7 @@ sub=$(semver get patch $tagref)
version=$(semver get release $tagref) version=$(semver get release $tagref)
release=$(semver get prerel $tagref) release=$(semver get prerel $tagref)
build=$(semver get build $tagref) build=$(semver get build $tagref)
linecount=$("${TOOLCHAIN_DIR}/loc.sh" | awk '{print $1}') linecount=$(./loc.sh | awk '{print $1}')
sourcecount=$(find src -type f | wc -l) sourcecount=$(find src -type f | wc -l)
drivercount=$(find src/driver -type f | wc -l) drivercount=$(find src/driver -type f | wc -l)
fpcversion=$(fpc -h | grep -m 1 version | awk '{print $5}') fpcversion=$(fpc -h | grep -m 1 version | awk '{print $5}')
@@ -35,7 +34,7 @@ checksum=$(md5sum checksums.md5 | awk '{print $1}')
[[ -n "$release" ]] && version="$version-$release" [[ -n "$release" ]] && version="$version-$release"
cat > $outfile <<EOF cat > $outfile <<EOF
unit core.version; unit asuro;
interface interface
View File
Whitespace-only changes.
-32
View File
@@ -1,32 +0,0 @@
#Flat filesystem
A super simple filesystem for asuro. Folders are emulated in filenames.
Starts with disk info sector, sector 0 of volume
---
#### disk info
jmp2boot : ubit24;
OEMName : array[0..7] of char;
version : uint16 // numerical version of filesystem
sectorCount : uint16;
fileCount : uint16
signature : uint32 = 0x0B00B1E5
the Rest of the sector is reserved
---
Starting from sector 1 is the file table. Table size is determined by entry size (64) * fileCount
---
####File entry
name : array[0..59] of char //file name max 60 chars
fileStart : 16bit // start sector of data
fileSize : 16bit // data size in sectors
---
-648
View File
File diff suppressed because it is too large. Load diff
Loaded 20 of 245 files, more files were not shown because too many files have changed in this diff. Show more