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
128 changed files with 6479 additions and 69017 deletions

No files matched your search

+1 -8
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 -4
View File
@@ -11,8 +11,6 @@
/*.img /*.img
src/include/asuro.pas src/include/asuro.pas
localenv.json localenv.json
/lvgl/
dockerout.txt
AGENTS.md AGENTS.md
*.log build.log
/doc/*.md dockerout.txt
+1 -1
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"]
+1 -2
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
@@ -23,7 +23,6 @@ runOrFail() {
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_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!"
+1 -6
View File
@@ -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 -Tlinker.script -o bin/kernel.bin $objstring --start-group lib/liblvgl.a ${LIBGCC} --end-group
-118
View File
@@ -1,118 +0,0 @@
#!/usr/bin/env bash
# compile_lvgl.sh — Download LVGL v9.2 source and compile into lib/liblvgl.a
# Clone & compile in /tmp (fast container-local fs).
# Copy source + objects to /lvgl (host mount) for debugging.
set -e
LVGL_VERSION="v9.2.2"
LVGL_REPO="https://github.com/lvgl/lvgl.git"
LVGL_DIR="/tmp/lvgl"
OBJ_DIR="/tmp/lvgl_obj"
CONF_DIR="$(pwd)/lvglh"
OUT_DIR="$(pwd)/lib"
CC="gcc"
CFLAGS="-m32 -march=i686 -ffreestanding \
-fno-builtin -fno-stack-protector -fno-pic -fno-pie \
-O2 -Wall -Wno-unused-function -Wno-unused-variable \
-I${CONF_DIR} \
-I${LVGL_DIR} \
-I${LVGL_DIR}/.. \
-DLV_CONF_INCLUDE_SIMPLE"
echo " "
echo "======================="
echo " "
echo "Compiling LVGL..."
echo " "
# Clone LVGL into /tmp (container-local)
rm -rf "$LVGL_DIR"
echo "Downloading LVGL ${LVGL_VERSION}..."
git clone --depth 1 --branch "${LVGL_VERSION}" "${LVGL_REPO}" "${LVGL_DIR}" 2>&1
echo "Download complete."
# Gather all LVGL .c source files (core library only, no demos/examples)
SOURCES=$(find "${LVGL_DIR}/src" -name '*.c' -not -path '*/test/*')
TOTAL=$(echo "$SOURCES" | wc -l)
echo "Found ${TOTAL} LVGL source files."
# Compile each .c file to .o (container-local)
rm -rf "$OBJ_DIR"
mkdir -p "$OBJ_DIR"
COUNT=0
ERRORS=0
for src in $SOURCES; do
COUNT=$((COUNT + 1))
rel="${src#${LVGL_DIR}/src/}"
obj_path="${OBJ_DIR}/${rel%.c}.o"
mkdir -p "$(dirname "$obj_path")"
if ! $CC $CFLAGS -c "$src" -o "$obj_path" 2>&1; then
echo "FAILED: $rel"
ERRORS=$((ERRORS + 1))
fi
if [ $((COUNT % 50)) -eq 0 ]; then
echo " Compiled ${COUNT}/${TOTAL}..."
fi
done
echo "Compiled ${COUNT} files (${ERRORS} errors)."
if [ "$ERRORS" -ne 0 ]; then
echo "LVGL compilation FAILED with ${ERRORS} errors."
exit 1
fi
# Archive into static library
OBJECTS=$(find "$OBJ_DIR" -name '*.o')
ar rcs "${OUT_DIR}/liblvgl.a" $OBJECTS
echo "Created ${OUT_DIR}/liblvgl.a"
# Compile custom LVGL extension files from lvglh/
LVGLH_SOURCES=$(find "${CONF_DIR}" -name '*.c' 2>/dev/null || true)
if [ -n "$LVGLH_SOURCES" ]; then
echo " "
echo "Compiling custom LVGL files from lvglh/..."
LVGLH_OBJ_DIR="/tmp/lvglh_obj"
rm -rf "$LVGLH_OBJ_DIR"
mkdir -p "$LVGLH_OBJ_DIR"
HCOUNT=0
HERRORS=0
for src in $LVGLH_SOURCES; do
HCOUNT=$((HCOUNT + 1))
rel="${src#${CONF_DIR}/}"
obj_path="${LVGLH_OBJ_DIR}/${rel%.c}.o"
mkdir -p "$(dirname "$obj_path")"
echo " [lvglh] $rel"
if ! $CC $CFLAGS -c "$src" -o "$obj_path" 2>&1; then
echo " FAILED: $rel"
HERRORS=$((HERRORS + 1))
fi
done
echo "Compiled ${HCOUNT} custom files (${HERRORS} errors)."
if [ "$HERRORS" -ne 0 ]; then
echo "Custom LVGL compilation FAILED."
exit 1
fi
# Append custom objects into the existing archive
HOBJECTS=$(find "$LVGLH_OBJ_DIR" -name '*.o')
ar rcs "${OUT_DIR}/liblvgl.a" $HOBJECTS
echo "Updated ${OUT_DIR}/liblvgl.a with custom objects."
else
echo "No custom LVGL files in lvglh/."
fi
# Copy source + objects to /lvgl host mount for debugging
echo "Copying LVGL source and objects to host mount..."
mkdir /code/lvgl 2>/dev/null || true
rm -rf /code/lvgl/* /code/lvgl/.[!.]* /code/lvgl/..?* 2>/dev/null || true
cp -a "$LVGL_DIR/src" /code/lvgl/src
cp -a "$OBJ_DIR" /code/lvgl/obj
echo "Done."
echo " "
echo "LVGL compilation complete."
echo " "
+1 -1
View File
@@ -4,4 +4,4 @@ echo "======================="
echo " " echo " "
echo "Compiling FPC Sources..." echo "Compiling FPC Sources..."
echo " " echo " "
fpc -Aelf -gw -g -gl -n -v0ew -O3 -OpPENTIUM3 -Si -Sc -Sg -Xd -CX -XXs -CfSSE -CfSSE2 -Rintel -Pi386 -Tlinux -FElib/ -Fusrc/* -Fusrc/driver/* -Fusrc/driver/net/* -Fusrc/driver/bus/* -Fusrc/driver/bus/usb/* -Fusrc/driver/hid/* src/kernel.pas 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
View File
Whitespace-only changes.
-12886
View File
File diff suppressed because it is too large. Load diff
-374
View File
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+2709
View File
File diff suppressed because it is too large. Load diff
+69 -102
View File
File diff suppressed because it is too large. Load diff
+65
View File
@@ -0,0 +1,65 @@
// Copyright 2021 Kieron Morris
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
{
Driver->Bus->EHCI - Enhanced Host Controller Interface Driver.
@author(Kieron Morris <[email protected]>)
}
unit EHCI;
interface
uses
tracer,
Console,
PCI,
drivertypes,
pmemorymanager,
vmemorymanager,
util,
drivermanagement;
function load : boolean;
implementation
function load : boolean;
var
devices : TDeviceArray;
count : uint32;
i : uint32;
begin
tracer.push_trace('EHCI.load');
devices:= PCI.getDeviceInfo($0C, $03, $20, count);
console.output('USB-EHCI Driver', 'Found ');
console.writeint(count);
console.writestringln(' USB Controller(s).');
if count > 0 then begin
for i:=0 to count-1 do begin
console.output('USB-EHCI Driver', 'Controller[');
console.writeint(i);
console.writestring(']: ');
console.writehex(devices[i].device_id);
console.writestring(' ');
console.writehex(devices[i].vendor_id);
console.writestring(' ');
console.writehexln(devices[i].prog_if);
end;
end;
load:= true;
end;
end.
+96
View File
@@ -0,0 +1,96 @@
// Copyright 2021 Kieron Morris
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
{
Driver->Bus->OHCI - Open Host Controller Interface Driver.
@author(Kieron Morris <[email protected]>)
}
unit OHCI;
interface
uses
tracer,
Console,
PCI,
drivertypes,
pmemorymanager,
vmemorymanager,
util,
drivermanagement;
type
POHCI_MMR = ^TOHCI_MMR;
TOHCI_MMR = packed record
HcRevision : uint32;
HcControl : uint32;
HcCommandStatus : uint32;
HcIntStatus : uint32;
HcIntEnable : uint32;
HcIntDisable : uint32;
HcHCCA : uint32;
HcPeriodCurrentED : uint32;
HcControlHeadED : uint32;
HcControlCurrentED : uint32;
HcBulkHeadED : uint32;
HcBulkCurrentED : uint32;
HcDoneHead : uint32;
HcFmRemaining : uint32;
HcFmNumber : uint32;
HcPeriodicStart : uint32;
HcLSThreshold : uint32;
HcRhDescriptorA : uint32;
HcRhDescriptorB : uint32;
HcRhStatus : uint32;
end;
function load : boolean;
implementation
function load : boolean;
var
devices : TDeviceArray;
count : uint32;
i : uint32;
block : uint32;
MMR : POHCI_MMR;
begin
tracer.push_trace('OHCI.load');
devices:= PCI.getDeviceInfo($0C, $03, $10, count);
console.output('USB-OHCI Driver', 'Found ');
console.writeint(count);
console.writestringln(' USB Controller(s).');
if count > 0 then begin
for i:=0 to count-1 do begin
console.output('USB-OHCI Driver', 'Controller[');
console.writeint(i);
console.writestring(']: ');
console.writehex(devices[i].device_id);
console.writestring(' ');
console.writehex(devices[i].vendor_id);
console.writestring(' ');
console.writehexln(devices[i].prog_if);
block:= devices[i].address0 SHR 22;
force_alloc_block(block, 0);
map_page(block, block);
MMR:= POHCI_MMR(devices[i].address0);
end;
end;
load:= true;
end;
end.
+17 -17
View File
@@ -18,14 +18,14 @@
@author(Aaron Hance <[email protected]>) @author(Aaron Hance <[email protected]>)
@author(Kieron Morris <[email protected]>) @author(Kieron Morris <[email protected]>)
} }
unit pci; unit PCI;
interface interface
uses uses
tracer, tracer,
util, util,
syslog, console,
drivertypes, drivertypes,
lmemorymanager, lmemorymanager,
vmemorymanager, vmemorymanager,
@@ -100,14 +100,14 @@ var
begin begin
push_trace('PCI.load'); push_trace('PCI.load');
syslog.logln('PCI', 'Scanning Bus: 0'); console.outputln('PCI', 'Scanning Bus: 0');
scanBus(0); scanBus(0);
//while unscanned busses scan busses //while unscanned busses scan busses
current_bus := 1; current_bus := 1;
while true do begin while true do begin
if current_bus < bus_count then begin if current_bus < bus_count then begin
syslog.log('PCI', 'Scanning Bus: '); console.output('PCI', 'Scanning Bus: ');
syslog.writeintln(bus_count); console.writeintln(bus_count);
scanBus(current_bus); scanBus(current_bus);
current_bus := current_bus + 1; current_bus := current_bus + 1;
end else break; end else break;
@@ -122,7 +122,7 @@ var
begin begin
push_trace('PCI.init'); push_trace('PCI.init');
syslog.logln('PCI','INIT BEGIN.'); console.outputln('PCI','INIT BEGIN.');
DevID.Bus:= biUnknown; DevID.Bus:= biUnknown;
DevID.id0:= 0; DevID.id0:= 0;
DevID.id1:= 0; DevID.id1:= 0;
@@ -130,7 +130,7 @@ begin
DevID.id3:= 0; DevID.id3:= 0;
DevID.ex:= nil; DevID.ex:= nil;
drivermanagement.register_driver_ex('PCI Driver', @DevID, @load, true); drivermanagement.register_driver_ex('PCI Driver', @DevID, @load, true);
syslog.logln('PCI', 'INIT END.'); console.outputln('PCI', 'INIT END.');
pop_trace; pop_trace;
end; end;
@@ -388,16 +388,16 @@ begin
DevID^.id4:= device.vendor_id; DevID^.id4:= device.vendor_id;
DevID^.ex:= nil; DevID^.ex:= nil;
syslog.log('PCI', 'Found Device: '); console.output('PCI', 'Found Device: ');
syslog.writehex(device.header_type); console.writehex(device.header_type);
syslog.writestring(' '); console.writestring(' ');
syslog.writehex(device.device_id); console.writehex(device.device_id);
syslog.writestring(' '); console.writestring(' ');
syslog.writehex(device.class_code); console.writehex(device.class_code);
syslog.writestring(' '); console.writestring(' ');
syslog.writehex(device.subclass_class); console.writehex(device.subclass_class);
syslog.writestring(' '); console.writestring(' ');
syslog.writehexln(device.prog_if); console.writehexln(device.prog_if);
devices[device_count] := device; devices[device_count] := device;
device_count := device_count + 1; device_count := device_count + 1;
+65
View File
@@ -0,0 +1,65 @@
// Copyright 2021 Kieron Morris
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
{
Driver->Bus->UHCI - Universal Host Controller Interface Driver.
@author(Kieron Morris <[email protected]>)
}
unit UHCI;
interface
uses
tracer,
Console,
PCI,
drivertypes,
pmemorymanager,
vmemorymanager,
util,
drivermanagement;
function load : boolean;
implementation
function load : boolean;
var
devices : TDeviceArray;
count : uint32;
i : uint32;
begin
tracer.push_trace('UHCI.load');
devices:= PCI.getDeviceInfo($0C, $03, $00, count);
console.output('USB-UHCI Driver','Found ');
console.writeint(count);
console.writestringln(' USB Controller(s).');
if count > 0 then begin
for i:=0 to count-1 do begin
console.output('USB-UHCI Driver','Controller[');
console.writeint(i);
console.writestring(']: ');
console.writehex(devices[i].device_id);
console.writestring(' ');
console.writehex(devices[i].vendor_id);
console.writestring(' ');
console.writehexln(devices[i].prog_if);
end;
end;
load:= true;
end;
end.
@@ -17,25 +17,19 @@
@author(Kieron Morris <[email protected]>) @author(Kieron Morris <[email protected]>)
} }
unit usb; unit USB;
interface interface
uses uses
tracer, tracer,
syslog, Console,
PCI, PCI,
drivertypes, drivertypes,
pmemorymanager, pmemorymanager,
vmemorymanager, vmemorymanager,
util, util,
drivermanagement, drivermanagement,
usbtypes,
usbcore,
usbhub,
usb_keyboard,
usb_mouse,
usb_storage,
OHCI, UHCI, EHCI, XHCI; OHCI, UHCI, EHCI, XHCI;
procedure init; procedure init;
@@ -46,28 +40,24 @@ function loadXHCI(ptr : void) : boolean;
begin begin
push_trace('USB.loadXHCI'); push_trace('USB.loadXHCI');
loadXHCI:= XHCI.load; loadXHCI:= XHCI.load;
pop_trace;
end; end;
function loadEHCI(ptr : void) : boolean; function loadEHCI(ptr : void) : boolean;
begin begin
push_trace('USB.loadEHCI'); push_trace('USB.loadEHCI');
loadEHCI:= EHCI.load; loadEHCI:= EHCI.load;
pop_trace;
end; end;
function loadOHCI(ptr : void) : boolean; function loadOHCI(ptr : void) : boolean;
begin begin
push_trace('USB.loadOHCI'); push_trace('USB.loadOHCI');
loadOHCI:= OHCI.load; loadOHCI:= OHCI.load;
pop_trace;
end; end;
function loadUHCI(ptr : void) : boolean; function loadUHCI(ptr : void) : boolean;
begin begin
push_trace('USB.loadUHCI'); push_trace('USB.loadUHCI');
loadUHCI:= UHCI.load; loadUHCI:= UHCI.load;
pop_trace;
end; end;
procedure init; procedure init;
@@ -79,20 +69,7 @@ var
begin begin
push_trace('USB.init'); push_trace('USB.init');
syslog.logln('USB Driver', 'INIT BEGIN.'); console.outputln('USB Driver', 'INIT BEGIN.');
{ Initialize USB core (HC list, etc.) }
usbcore.init;
{ Initialize hub driver (registers class driver for $09) }
usbhub.init;
{ Initialize HID class drivers }
usb_keyboard.init;
usb_mouse.init;
{ Initialize storage class driver }
usb_storage.init;
UHCI_ID.Bus:= biPCI; UHCI_ID.Bus:= biPCI;
UHCI_ID.id0:= idANY; UHCI_ID.id0:= idANY;
@@ -131,7 +108,7 @@ begin
drivermanagement.register_driver('USB-EHCI Driver', @EHCI_ID, @loadEHCI); drivermanagement.register_driver('USB-EHCI Driver', @EHCI_ID, @loadEHCI);
drivermanagement.register_driver('USB-XHCI Driver', @XHCI_ID, @loadXHCI); drivermanagement.register_driver('USB-XHCI Driver', @XHCI_ID, @loadXHCI);
syslog.logln('USB Driver', 'INIT END.'); console.outputln('USB Driver', 'INIT END.');
pop_trace; pop_trace;
end; end;
+65
View File
@@ -0,0 +1,65 @@
// Copyright 2021 Kieron Morris
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
{
Driver->Bus->XHCI - eXtensible Host Controller Interface Driver.
@author(Kieron Morris <[email protected]>)
}
unit XHCI;
interface
uses
tracer,
Console,
PCI,
drivertypes,
pmemorymanager,
vmemorymanager,
util,
drivermanagement;
function load : boolean;
implementation
function load : boolean;
var
devices : TDeviceArray;
count : uint32;
i : uint32;
begin
tracer.push_trace('XHCI.load');
devices:= PCI.getDeviceInfo($0C, $03, $30, count);
console.output('USB-XHCI Driver', 'Found ');
console.writeint(count);
console.writestringln(' USB Controller(s).');
if count > 0 then begin
for i:=0 to count-1 do begin
console.output('USB-XHCI Driver', 'Controller[');
console.writeint(i);
console.writestring(']: ');
console.writehex(devices[i].device_id);
console.writestring(' ');
console.writehex(devices[i].vendor_id);
console.writestring(' ');
console.writehexln(devices[i].prog_if);
end;
end;
load:= true;
end;
end.
File diff suppressed because it is too large. Load diff
Loaded 20 of 128 files, more files were not shown because too many files have changed in this diff. Show more