Skip to content

Commit

Permalink
Shell: NEW COMMAND PARSER!!!
Browse files Browse the repository at this point in the history
StdIO: Copy file name to prevent hijacking (memory overwriting)
  • Loading branch information
NDRAEY committed Jul 29, 2024
1 parent c8059e2 commit d298154
Show file tree
Hide file tree
Showing 17 changed files with 138 additions and 43 deletions.
1 change: 1 addition & 0 deletions common.mk
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ SOURCES=\
kernel/src/sys/lapic.c \
kernel/src/drv/ps2.c \
kernel/src/drv/video/intel.c \
kernel/src/extra/command_parser.c \
kernel/src/kernel.c \
# kernel/src/lib/duktape.c \
kernel/src/toys/piano.c \
Expand Down
13 changes: 13 additions & 0 deletions kernel/include/lib/command_parser.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#pragma once

#include "common.h"

typedef struct {
char* original_string;
int argc;
char** argv;
} command_parser_t;

void command_parser_new(command_parser_t* parser, const char* _s);
void command_parser_destroy(command_parser_t* parser);

2 changes: 1 addition & 1 deletion kernel/include/sys/file_descriptors.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,4 @@ size_t file_descriptor_read(int descriptor_number, size_t count, void* buffer);
size_t file_descriptor_write(int descriptor_number, size_t count, const void* buffer);
size_t file_descriptor_close(int descriptor_number);
size_t file_descriptor_seek(int descriptor_number, ssize_t value, size_t whence);
void file_descriptor_tell(int descriptor_number, int* out);
size_t file_descriptor_tell(int descriptor_number, int* out);
59 changes: 31 additions & 28 deletions kernel/src/extra/cli.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include "../../include/lib/fileio.h"
#include "sys/system.h"
#include "debug/hexview.h"
#include "lib/command_parser.h"

int G_CLI_CURINXA = 0;
int G_CLI_CURINXB = 0;
Expand Down Expand Up @@ -287,7 +288,7 @@ uint32_t CLI_CMD_SET(uint32_t c, char* v[]){
}

uint32_t CLI_CMD_DIR(uint32_t c, char* v[]) {
const char* path = (c <= 1 ? G_CLI_PATH : v[1]);
const char* path = (c <= 2 ? G_CLI_PATH : v[1]);

FSM_DIR* Dir = nvfs_dir(path);
if (Dir->Ready != 1){
Expand Down Expand Up @@ -318,7 +319,7 @@ uint32_t CLI_CMD_DIR(uint32_t c, char* v[]) {
}

uint32_t CLI_CMD_RUN(uint32_t c, char* v[]) {
if (c == 0){
if (c <= 2){
//tty_setcolor(COLOR_ERROR);
tty_printf("Файл не указан.\n");
return 1;
Expand All @@ -342,7 +343,7 @@ uint32_t CLI_CMD_RUN(uint32_t c, char* v[]) {

fclose(elf_exec);

run_elf_file(path, c - 1, v);
run_elf_file(path, c, v);

return 0;
}
Expand Down Expand Up @@ -647,35 +648,37 @@ CLI_CMD_ELEM G_CLI_CMD[] = {
void cli_handler(const char* ncmd){
set_cursor_enabled(0);

uint32_t argc = str_cdsp(ncmd," ") + 1;
char* argv[128] = {0};
command_parser_t parser = {};

str_split(ncmd, argv, " ");
command_parser_new(&parser, ncmd);

for(size_t i = 0; i < argc; i++){
qemu_log("[CLI] '%s' => argc: %d => argv: %s", ncmd, i, argv[i]);
}
for(size_t i = 0; i < parser.argc; i++){
qemu_log("[CLI] '%s' => argc: %d => argv: %s", ncmd, i, parser.argv[i]);
}

bool found = false;

for(size_t i = 0; G_CLI_CMD[i].name != nullptr; i++) {
if(strcmpn(G_CLI_CMD[i].name, argv[0]) || strcmpn(G_CLI_CMD[i].alias, argv[0])) {
G_CLI_CMD[i].funcv(argc, argv);
if(strcmpn(G_CLI_CMD[i].name, parser.argv[0]) || strcmpn(G_CLI_CMD[i].alias, parser.argv[0])) {
G_CLI_CMD[i].funcv(parser.argc, parser.argv);
found = true;
break;
}
}

if(!found) {
CLI_CMD_RUN(argc + 1, argv);
CLI_CMD_RUN(parser.argc, parser.argv);
}

command_parser_destroy(&parser);

set_cursor_enabled(1);
}

void cli(){
qemu_log("[CLI] Started...");
tty_set_bgcolor(0xFF000000);
tty_setcolor(0xFFFFFF);
tty_setcolor(0xFFFFFF);

variable_write("HOSTNAME", "SAYORISOUL");
variable_write("SYSTEMROOT", "R:\\Sayori\\");
Expand All @@ -690,28 +693,28 @@ void cli(){

punch();

char* input_buffer = kcalloc(1, 256);
char* input_buffer = kcalloc(1, 512);
while(1) {
size_t memory_cur = system_heap.used_memory;
size_t memory_cnt_cur = system_heap.allocated_count;
size_t memory_cnt_cur = system_heap.allocated_count;

tty_setcolor(0xFFFFFF);
tty_setcolor(0xFFFFFF);
tty_printf("%s>", G_CLI_PATH);
memset(input_buffer, 0, 256);
memset(input_buffer, 0, 512);

int result = gets_max(input_buffer, 255);
int result = gets_max(input_buffer, 512);

if(result == 1) {
tty_alert("\nMaximum 255 characters!\n");
continue;
}
if(result == 1) {
tty_alert("\nMaximum 512 characters!\n");
continue;
}

size_t len_cmd = strlen(input_buffer);
if (len_cmd == 0) {
continue;
}
size_t len_cmd = strlen(input_buffer);
if (len_cmd == 0) {
continue;
}

size_t current_time = timestamp();
size_t current_time = timestamp();
qemu_log("cmd: %s", input_buffer);

cli_handler(input_buffer);
Expand All @@ -729,7 +732,7 @@ void cli(){
qemu_ok("All right! No memory leaks! Keep it up, buddy!");
}

qemu_note("Time elapsed: %d milliseconds", timestamp() - current_time);
qemu_note("Time elapsed: %d milliseconds", timestamp() - current_time);
}

kfree(input_buffer);
Expand Down
70 changes: 70 additions & 0 deletions kernel/src/extra/command_parser.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#include "lib/command_parser.h"
#include "mem/vmm.h"

void command_parser_new(command_parser_t* parser, const char* _s) {
if(!parser) {
return;
}

parser->original_string = kcalloc(strlen(_s) + 1, 1);
memcpy(parser->original_string, _s, strlen(_s));

parser->argc = 0;


char* ptr = parser->original_string;
// Count arguments
while(*ptr++ == ' ')
;
while(*ptr++) {
if(*ptr == ' ' || *ptr == 0) {
if(parser->original_string != ptr - 1) {
parser->argc++;
}

while(*ptr++ == ' ')
;
}
}


parser->argv = kcalloc(parser->argc, sizeof(char*));

char* prev = parser->original_string;
ptr = prev;

size_t cur = 0;

// Parse
while(*ptr++ == ' ')
;

prev = ptr - 1;
while(*ptr++) {
if(*ptr == ' ' || *ptr == 0) {
size_t len = ptr - prev;

parser->argv[cur] = kcalloc(len + 1, 1);

memcpy(parser->argv[cur], prev, len);

cur++;

while(*ptr++ == ' ')
;

prev = --ptr;
}
}
}

void command_parser_destroy(command_parser_t* parser) {
kfree(parser->original_string);

for(int i = 0; i < parser->argc; i++) {
kfree(parser->argv[i]);
}

kfree(parser->argv);
}

7 changes: 5 additions & 2 deletions kernel/src/fs/nvfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@
#include "fs/fsm.h"
#include "lib/php/str_replace.h"

bool nvfs_debug = false;

bool nvfs_debug = true;

NVFS_DECINFO* nvfs_decode(const char* Name) {
NVFS_DECINFO* info = kcalloc(sizeof(NVFS_DECINFO), 1);
Expand Down Expand Up @@ -79,6 +78,10 @@ NVFS_DECINFO* nvfs_decode(const char* Name) {
}

size_t nvfs_read(const char* Name, size_t Offset, size_t Count, void* Buffer){
if(nvfs_debug) {
qemu_log("Name=%s", Name);
}

NVFS_DECINFO* vinfo = nvfs_decode(Name);
size_t res = 0;

Expand Down
8 changes: 6 additions & 2 deletions kernel/src/lib/stdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -194,10 +194,12 @@ FILE* fopen_binmode(const char* filename, size_t mode) {
file->open = 1; // Файл успешно открыт
file->fmode = mode; // Режим работы с файлом
file->size = finfo.Size; // Размер файла
file->path = (char*)filename; // Полный путь к файлу
file->path = kcalloc(strlen(filename) + 1, 1); // Полный путь к файлу
file->pos = 0; // Установка указателя в самое начало
file->err = 0; // Ошибок в работе нет

memcpy(file->path, filename, strlen(filename));

qemu_ok("File opened!");

return file;
Expand All @@ -209,8 +211,10 @@ FILE* fopen_binmode(const char* filename, size_t mode) {
* @param stream Поток (файл)
*/
void fclose(FILE* stream){
if(stream)
if(stream) {
kfree(stream->path);
kfree(stream);
}
}

/**
Expand Down
21 changes: 11 additions & 10 deletions kernel/src/sys/file_descriptors.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,17 +158,18 @@ size_t file_descriptor_seek(int descriptor_number, ssize_t value, size_t whence)

}

void file_descriptor_tell(int descriptor_number, int* out) {
if(descriptor_number < 0 || descriptor_number >= last_descriptor_number)
return;
size_t file_descriptor_tell(int descriptor_number, int* out) {
if(descriptor_number < 0 || descriptor_number >= last_descriptor_number) {
return 0;
}

for(int i = 0; i < descriptors->size; i++) {
struct fd_info *inf = (struct fd_info *) vector_get(descriptors, i).element;
if(!file_descriptor_get(descriptor_number)) {
return 0;
}

if (inf->fd == descriptor_number) {
*out = ftell(inf->file);
struct fd_info* inf = file_descriptor_get(descriptor_number);

return;
}
}
*out = ftell(inf->file);

return 0;
}
Binary file removed ramdisk/asmprog
Binary file not shown.
Binary file removed ramdisk/cccomp
Binary file not shown.
Binary file removed ramdisk/empty
Binary file not shown.
Binary file removed ramdisk/filetest
Binary file not shown.
Binary file removed ramdisk/keyboard
Binary file not shown.
Binary file removed ramdisk/mt
Binary file not shown.
Binary file removed ramdisk/prog
Binary file not shown.
Binary file removed ramdisk/test.bin
Binary file not shown.
Binary file removed ramdisk/zasm
Binary file not shown.

0 comments on commit d298154

Please sign in to comment.