From e8a85694d2dfc768dcd68826b31f8711d257fb51 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Fri, 2 Oct 2009 23:22:01 +0800 Subject: [PATCH] Fixed bug with handling of . and .. that was trashing the heap. Fixed soname of libgcc to libgcc.so instead of libgcc.acess.so --- Kernel/heap.c | 2 +- Kernel/threads.c | 2 +- Kernel/vfs/open.c | 8 +- Usermode/Applications/CLIShell_src/main.c | 2 +- Usermode/Applications/ls_src/main.c | 140 ++++++++++++++++++++++ Usermode/Libraries/ld-acess.so_src/main.c | 6 +- Usermode/Libraries/libgcc.so_src/Makefile | 2 +- 7 files changed, 153 insertions(+), 9 deletions(-) diff --git a/Kernel/heap.c b/Kernel/heap.c index 79f5f404..0bffaec5 100644 --- a/Kernel/heap.c +++ b/Kernel/heap.c @@ -280,7 +280,7 @@ void free(void *Ptr) return; } if(foot->Magic != MAGIC_FOOT) { - Warning("free - Footer magic is invalid (%p, 0x%x)\n", head, foot->Magic); + Warning("free - Footer magic is invalid (%p, %p = 0x%x)\n", head, &foot->Magic, foot->Magic); return; } diff --git a/Kernel/threads.c b/Kernel/threads.c index 5f2e3d7f..e244139e 100644 --- a/Kernel/threads.c +++ b/Kernel/threads.c @@ -455,7 +455,7 @@ void Threads_Sleep() tThread *cur = Proc_GetCurThread(); tThread *thread; - Log("Proc_Sleep: %i going to sleep", cur->TID); + //Log("Proc_Sleep: %i going to sleep", cur->TID); // Acquire Spinlock LOCK( &giThreadListLock ); diff --git a/Kernel/vfs/open.c b/Kernel/vfs/open.c index 6f034170..2fc27d6d 100644 --- a/Kernel/vfs/open.c +++ b/Kernel/vfs/open.c @@ -89,17 +89,22 @@ char *VFS_GetAbsPath(char *Path) if(pos - read <= 2) { // Current Dir "." - if(strncmp(&ret[read], ".", pos-read) == 0) continue; + if(strncmp(&ret[read], ".", pos-read) == 0) { + ret[write] = '\0'; + continue; + } // Parent ".." if(strncmp(&ret[read], "..", pos-read) == 0) { // If there is no higher, silently ignore if(slashNum < 1) { write = 1; + ret[1] = '\0'; continue; } // Reverse write pointer write = slashOffsets[ --slashNum ]; + ret[write] = '\0'; continue; } } @@ -125,7 +130,6 @@ char *VFS_GetAbsPath(char *Path) write += (pos-read)+1; } - ret[write] = '\0'; // Cap string (to deal with . or .. being the last terms) // `ret` should now be the absolute path LEAVE('s', ret); //Log("VFS_GetAbsPath: RETURN '%s'", ret); diff --git a/Usermode/Applications/CLIShell_src/main.c b/Usermode/Applications/CLIShell_src/main.c index ec83ac96..a8db5ad6 100644 --- a/Usermode/Applications/CLIShell_src/main.c +++ b/Usermode/Applications/CLIShell_src/main.c @@ -48,7 +48,7 @@ char **gasCommandHistory; int main(int argc, char *argv[], char *envp[]) { char *sCommandStr; - char *saArgs[32]; + char *saArgs[32] = {0}; int length = 0; int i; int iArgCount = 0; diff --git a/Usermode/Applications/ls_src/main.c b/Usermode/Applications/ls_src/main.c index 82f9c2a6..fc99a405 100644 --- a/Usermode/Applications/ls_src/main.c +++ b/Usermode/Applications/ls_src/main.c @@ -8,11 +8,20 @@ #define BUF_SIZE 1024 +// === CONSTANTS === +enum eFileTypes { + FTYPE_NORMAL, + FTYPE_EXEC, + FTYPE_DIR, + FTYPE_SYMLINK +}; + // === PROTOTYPES === int main(int argc, char *argv[]); void ShowUsage(char *ProgName); void ParseArguments(int argc, char *argv[]); void SortFileList(); +void DisplayFile(char *Filename); // === GLOBALS === // --- Flags --- @@ -33,6 +42,7 @@ char **gFileList; int main(int argc, char *argv[]) { int fd, tmp; + int i; char buf[BUF_SIZE+1]; t_sysFInfo info; int space = 0; @@ -55,6 +65,15 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } + // Check if we should include the implicit . and .. + if(gbShowImplicit) + { + space = 16; + gFileList = malloc(space*sizeof(char*)); + gFileList[giNumFiles++] = "."; + gFileList[giNumFiles++] = ".."; + } + // Traverse Directory while( (tmp = readdir(fd, buf)) ) { @@ -80,6 +99,12 @@ int main(int argc, char *argv[]) // Sort File List according to rules passed SortFileList(); + // Show the file list + for( i = 0; i < giNumFiles; i ++ ) + { + DisplayFile( gFileList[i] ); + } + close(fd); printf("\n"); @@ -163,3 +188,118 @@ void SortFileList() { qsort(gFileList, giNumFiles, sizeof(char*), strcmpp); } + +/** + * \fn void DisplayFile(char *Filename) + * \brief Prints out the information for a file + */ +void DisplayFile(char *Filename) +{ + t_sysFInfo info; + t_sysACL acl; + char *path; + int fd; + int dirLen = strlen(gsDirectory); + int type = FTYPE_NORMAL, perms = 0; + uint64_t size = 0; + int owner = 0, group = 0; + + // Check if we should skip this file + if(!gbShowAll && Filename[0] == '.') return; + + // Allocate path + path = malloc(dirLen+1+strlen(Filename)+1); + if(!path) { + fprintf(stderr, "heap exhausted\n"); + exit(EXIT_FAILURE); + } + + // Create path + strcpy(path, gsDirectory); + path[dirLen] = '/'; + strcpy(&path[dirLen+1], Filename); + + // Get file type + fd = open(path, 0); + if(fd == -1) { + fprintf(stderr, "Unable to open '%s'\n", path); + } + else { + // Get Info + finfo(fd, &info, 0); + // Get Type + if(info.flags & FILEFLAG_DIRECTORY) { + type = FTYPE_DIR; + } + else if(info.flags & FILEFLAG_SYMLINK) { + type = FTYPE_SYMLINK; + } + else { + type = FTYPE_NORMAL; + } + // Get Size + size = info.size; + // Get Owner and Group + owner = info.uid; + group = info.gid; + + // Get Permissions + // - Owner + acl.group = 0; acl.id = info.uid; + _SysGetACL(fd, &acl); + if(acl.perms & 1) perms |= 0400; // R + if(acl.perms & 2) perms |= 0200; // W + if(acl.perms & 8) perms |= 0100; // X + // - Group + acl.group = 1; acl.id = info.gid; + _SysGetACL(fd, &acl); + if(acl.perms & 1) perms |= 0040; // R + if(acl.perms & 2) perms |= 0020; // W + if(acl.perms & 8) perms |= 0010; // X + // - World + acl.group = 1; acl.id = -1; + _SysGetACL(fd, &acl); + if(acl.perms & 1) perms |= 0004; // R + if(acl.perms & 2) perms |= 0002; // W + if(acl.perms & 8) perms |= 0001; // X + } + free(path); // We're finished with it + + // Extended view? + if(gbViewExtended) + { + char permStr[11] = " ---------"; + if(type == FTYPE_DIR) permStr[0] = 'd'; + if(perms & 0400) permStr[1] = 'r'; + if(perms & 0200) permStr[2] = 'w'; + if(perms & 0100) permStr[3] = 'x'; + if(perms & 0040) permStr[4] = 'r'; + if(perms & 0020) permStr[5] = 'w'; + if(perms & 0010) permStr[6] = 'x'; + if(perms & 0004) permStr[7] = 'r'; + if(perms & 0002) permStr[8] = 'w'; + if(perms & 0001) permStr[9] = 'x'; + printf("%s %4i %4i ", permStr, owner, group); + if(gbViewHumanReadable) { + if(size < 2048) { // < 2 KiB + printf("%8lli B ", size); + } + else if(size < 2048*1024) { // < 2 MiB + printf("%8lli KiB ", size>>10); + } + else if(size < (uint64_t)2048*1024*1024) { // < 2 GiB + printf("%8lli MiB ", size>>20); + } + else if(size < (uint64_t)2048*1024*1024*1024) { // < 2 TiB + printf("%8lli GiB ", size>>30); + } + else { // Greater than 2 TiB + printf("%8i TiB ", size>>40); + } + } else { + printf("%8i ", size); + } + } + + printf("%s\n", Filename); +} diff --git a/Usermode/Libraries/ld-acess.so_src/main.c b/Usermode/Libraries/ld-acess.so_src/main.c index a250afac..dc5d4d34 100644 --- a/Usermode/Libraries/ld-acess.so_src/main.c +++ b/Usermode/Libraries/ld-acess.so_src/main.c @@ -23,8 +23,8 @@ int SoMain(Uint base, int arg1) { int ret; - SysDebug("SoMain: base = 0x%x", base); - SysDebug("SoMain: arg1 = 0x%x", arg1); + //SysDebug("SoMain: base = 0x%x", base); + //SysDebug("SoMain: arg1 = 0x%x", arg1); // - Assume that the file pointer will be less than 4096 if(base < 0x1000) { @@ -79,7 +79,7 @@ int DoRelocate( Uint base, char **envp, char *Filename ) */ int CallUser(Uint entry, Uint sp) { - SysDebug("CallUser: (entry=0x%x, sp=0x%x)", entry, sp); + //SysDebug("CallUser: (entry=0x%x, sp=0x%x)", entry, sp); *(Uint*)(sp-4) = 0; // Clear return address __asm__ __volatile__ ( "mov %%eax, %%esp;\n\t" diff --git a/Usermode/Libraries/libgcc.so_src/Makefile b/Usermode/Libraries/libgcc.so_src/Makefile index ada47db9..e57f3a20 100644 --- a/Usermode/Libraries/libgcc.so_src/Makefile +++ b/Usermode/Libraries/libgcc.so_src/Makefile @@ -8,7 +8,7 @@ OBJS = libgcc.o BIN = ../libgcc.so CFLAGS += -Wall -Werror -LDFLAGS += -soname libgcc.acess.so +LDFLAGS += -soname libgcc.so .PHONY: all clean -- 2.20.1