From 01e14d418abee460e41c0782d68e56c42c689edf Mon Sep 17 00:00:00 2001 From: Kwarde Date: Wed, 25 Jun 2025 16:23:59 +0200 Subject: [PATCH] FIX: No longer allow exceeding printf buffer, instead print an error to stdout. Temporary fix Later, if buffer is full, print current buffer and reset buffer so that there is no limit. --- console.asm | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/console.asm b/console.asm index b1ef2f3..6990b3e 100644 --- a/console.asm +++ b/console.asm @@ -5,8 +5,11 @@ extern itoa section .rodata NL db 0xA + bufferLength equ 4096 + ERR_buffLen db " ERROR: Failed to complete printf(), reached buffer length!",0xA,0x0 + lERR_buffLen equ $-ERR_buffLen-1 section .bss - printfBuff resb 4096 + printfBuff resb bufferLength printfNBuff resb 32 section .text global print @@ -52,18 +55,25 @@ printf: push rbp mov rbp, rsp - push r12 - push r13 + push rbx ; used to check if error must be sent (reached buff len) + push r12 ; used for writing byted to printBuff + push r13 ; (also) used for writing bytes to printBuff (why again? gotta check that out - probably not needed, just lost count of register usage at some point) + push r14 ; count length of printBuff + xor rbx, rbx xor r10, r10 + xor r14, r14 lea r11, [rel printfBuff] .makeStr: cmp byte [rdi], 0x0 je .finish + cmp r14, bufferLength-1 + je .finish_L cmp byte [rdi], '%' je .replaceArg mov r12b, byte [rdi] mov byte [r11], r12b + inc r14 jmp .continue .replaceArg: cmp byte [rdi+1], 0x0 @@ -80,6 +90,7 @@ printf: ;--- invalid specifier ---; mov byte [r11], '%' + inc r14 inc r10 ;assuming args were passed for invalid specifiers ! jmp .continue @@ -172,8 +183,15 @@ printf: .charToStr: mov [printfNBuff], dil + inc r14 + cmp r14, bufferLength-1 + ; Print error to stdout + je .finish_L mov dil, 0 mov [printfNBuff+1], dil + inc r14 + cmp r14, bufferLength-1 + je .finish_L lea rsi, [rel printfNBuff] jmp .insertLoop @@ -208,10 +226,13 @@ printf: ;--- Move fetched data to buffer ---; .insertLoop: + cmp r14, bufferLength-1 + je .finish_L cmp byte [rsi], 0x0 je .s0f mov r13b, byte [rsi] mov byte [r11], r13b + inc r14 inc rsi inc r11 jmp .insertLoop @@ -224,15 +245,32 @@ printf: inc rdi inc r11 jmp .makeStr + + .finish_L: + mov rbx, 1 + .finish: mov byte [r11], 0x0 lea rdi, [rel printfBuff] call print lea rdi, [rel printfBuff] call strlen + test rbx, rbx + jz .final + push r11 + mov rax, NR_write + mov rdi, 2 + lea rsi, [rel ERR_buffLen] + mov rdx, lERR_buffLen + syscall + + .final: + pop r11 + pop r14 pop r13 pop r12 + pop rbx leave ret