From eb80b37c619769496f3fca58d54c4a4b8d8fac4a Mon Sep 17 00:00:00 2001 From: John Hodge Date: Wed, 30 Sep 2009 22:29:48 +0800 Subject: [PATCH] Fixed Segfault if execve fails, fixed errors in LibC pertaining to stdin,... not being set --- Kernel/binary.c | 3 ++- Kernel/threads.c | 13 +++++++++++++ Usermode/Libraries/libc.so_src/fileIO.c | 19 ++++++++++++++----- Usermode/Libraries/libc.so_src/heap.c | 10 +++++----- Usermode/Libraries/libc.so_src/stub.c | 12 +++++++++--- 5 files changed, 43 insertions(+), 14 deletions(-) diff --git a/Kernel/binary.c b/Kernel/binary.c index 04dfed26..1884af8a 100644 --- a/Kernel/binary.c +++ b/Kernel/binary.c @@ -24,6 +24,7 @@ typedef struct sKernelBin { // === IMPORTS === extern int Proc_Clone(Uint *Err, Uint Flags); extern void Threads_SetName(char *Name); +extern char *Threads_GetName(int ID); extern Uint MM_ClearUser(); extern void Threads_Exit(); extern void Proc_StartUser(Uint Entrypoint, Uint *Bases, int ArgC, char **ArgV, char **EnvP, int DataSize); @@ -145,7 +146,7 @@ int Proc_Execve(char *File, char **ArgV, char **EnvP) free(savedFile); if(bases[0] == 0) { - Warning("Proc_Execve - Unable to load '%s'", File); + Warning("Proc_Execve - Unable to load '%s'", Threads_GetName(-1)); Threads_Exit(); for(;;); } diff --git a/Kernel/threads.c b/Kernel/threads.c index d55bd2d7..54438c32 100644 --- a/Kernel/threads.c +++ b/Kernel/threads.c @@ -20,6 +20,7 @@ extern int Proc_Clone(Uint *Err, Uint Flags); // === PROTOTYPES === void Threads_Init(); void Threads_SetName(char *NewName); +char *Threads_GetName(int ID); void Threads_SetTickets(int Num); int Threads_WaitTID(int TID, int *status); tThread *Threads_GetThread(Uint TID); @@ -117,6 +118,18 @@ void Threads_SetName(char *NewName) strcpy(cur->ThreadName, NewName); } +/** + * \fn char *Threads_GetName(int ID) + * \brief Gets a thread's name + */ +char *Threads_GetName(int ID) +{ + if(ID == -1) { + return Proc_GetCurThread()->ThreadName; + } + return NULL; +} + /** * \fn void Threads_SetTickets(int Num) * \brief Sets the 'priority' of a task diff --git a/Usermode/Libraries/libc.so_src/fileIO.c b/Usermode/Libraries/libc.so_src/fileIO.c index c1a47fff..b8cdb116 100644 --- a/Usermode/Libraries/libc.so_src/fileIO.c +++ b/Usermode/Libraries/libc.so_src/fileIO.c @@ -21,9 +21,10 @@ struct sFILE *get_file_struct(); // === GLOBALS === struct sFILE _iob[STDIO_MAX_STREAMS]; // IO Buffer -struct sFILE *stdin = &_iob[0]; // Standard Input -struct sFILE *stdout = &_iob[1]; // Standard Output -struct sFILE *stderr = &_iob[2]; // Standard Error +struct sFILE *stdin; // Standard Input +struct sFILE *stdout; // Standard Output +struct sFILE *stderr; // Standard Error +///\note Initialised in SoMain // === CODE === /** @@ -303,6 +304,10 @@ EXPORT void sprintfv(char *buf, const char *format, va_list args) itoa(tmp, arg, 10, minSize, pad); goto sprintf_puts; // break; + case 'p': // Pointer + buf[pos++] = '*'; + buf[pos++] = '0'; + buf[pos++] = 'x'; case 'x': itoa(tmp, arg, 16, minSize, pad); goto sprintf_puts; @@ -396,6 +401,8 @@ EXPORT int ssprintfv(char *format, va_list args) case 'u': itoa(tmp, arg, 10, minSize, pad); goto sprintf_puts; + case 'p': // Pointer + len += 3; case 'x': itoa(tmp, arg, 16, minSize, pad); goto sprintf_puts; @@ -458,7 +465,7 @@ EXPORT void itoa(char *buf, unsigned long num, int base, int minLength, char pad */ EXPORT int printf(const char *format, ...) { - #if 0 + #if 1 int size; char *buf; va_list args; @@ -479,7 +486,8 @@ EXPORT int printf(const char *format, ...) free(buf); return size; - #endif + + #else int ret; va_list args; @@ -487,6 +495,7 @@ EXPORT int printf(const char *format, ...) ret = fprintfv(stdout, (char*)format, args); va_end(args); return ret; + #endif } /** diff --git a/Usermode/Libraries/libc.so_src/heap.c b/Usermode/Libraries/libc.so_src/heap.c index 6832738c..10cdb24a 100644 --- a/Usermode/Libraries/libc.so_src/heap.c +++ b/Usermode/Libraries/libc.so_src/heap.c @@ -53,7 +53,7 @@ EXPORT void *malloc(size_t bytes) // Initialise Heap if(_heap_start == NULL) - {LOCAL void *sbrk(int delta); + { _heap_start = sbrk(0); _heap_end = _heap_start; extendHeap(HEAP_INIT_SIZE); @@ -208,10 +208,10 @@ EXPORT void *realloc(void *oldPos, size_t bytes) } /** - \fn LOCAL void *extendHeap(int bytes) - \brief Create a new block at the end of the heap area - \param bytes Integer - Size reqired - \return Pointer to last free block + * \fn LOCAL void *extendHeap(int bytes) + * \brief Create a new block at the end of the heap area + * \param bytes Integer - Size reqired + * \return Pointer to last free block */ LOCAL void *extendHeap(int bytes) diff --git a/Usermode/Libraries/libc.so_src/stub.c b/Usermode/Libraries/libc.so_src/stub.c index acb36539..a10d9d11 100644 --- a/Usermode/Libraries/libc.so_src/stub.c +++ b/Usermode/Libraries/libc.so_src/stub.c @@ -5,6 +5,9 @@ extern char **_envp; extern struct sFILE _iob[]; +extern struct sFILE *stdin; +extern struct sFILE *stdout; +extern struct sFILE *stderr; /** * \fn int SoMain() @@ -20,9 +23,12 @@ int SoMain(unsigned int BaseAddress, int argc, char **argv, char **envp) _envp = envp; // Init FileIO Pointers - _iob[0].FD = 0; _iob[0].Flags = FILE_FLAG_MODE_READ; - _iob[1].FD = 1; _iob[1].Flags = FILE_FLAG_MODE_WRITE; - _iob[2].FD = 2; _iob[2].Flags = FILE_FLAG_MODE_WRITE; + stdin = &_iob[0]; + stdin->FD = 0; stdin->Flags = FILE_FLAG_MODE_READ; + stdout = &_iob[1]; + stdout->FD = 1; stdout->Flags = FILE_FLAG_MODE_WRITE; + stderr = &_iob[2]; + stderr->FD = 2; stderr->Flags = FILE_FLAG_MODE_WRITE; return 1; } -- 2.20.1