From 890cc6e615806170194b1c4bf304ac3e6aa484e7 Mon Sep 17 00:00:00 2001 From: Julian Barathieu Date: Sat, 18 May 2019 22:53:57 +0200 Subject: [PATCH] argv bug fix --- kaleid/extras/argv.c | 2 +- kaleid/kernel/sh/shell.c | 14 ++++++++------ kaleid/libbuf/bprint.c | 27 ++++++++++++++++----------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/kaleid/extras/argv.c b/kaleid/extras/argv.c index ae818bf..102e431 100644 --- a/kaleid/extras/argv.c +++ b/kaleid/extras/argv.c @@ -83,7 +83,7 @@ error_t KalCmdLineToArgVecEx(const char *cmdLine, assert(argv && cmdLine); // Another ARG_MAX-wide buffer - char *buffer = *argv + ARG_MAX; + char *buffer = bufptr + ARG_MAX; argv[0] = buffer; diff --git a/kaleid/kernel/sh/shell.c b/kaleid/kernel/sh/shell.c index dfaee76..f499fe1 100644 --- a/kaleid/kernel/sh/shell.c +++ b/kaleid/kernel/sh/shell.c @@ -27,7 +27,7 @@ int shcol = VGA_COLOR_LIGHT_GREY; int shargc = 0; -char *argv0 = 0; +char *argvbuf = 0; char **shargv = 0; void ExecuteCommand(char *cmdbuf) @@ -40,7 +40,7 @@ void ExecuteCommand(char *cmdbuf) return; memzero(*shargv, ARG_MAX); - rc = KalCmdLineToArgVec(cmdbuf, &shargc, argv0); + rc = KalCmdLineToArgVec(cmdbuf, &shargc, argvbuf); if (rc) KeStartPanic("Shell: Couldn't parse command line: %d", rc); for (cmd = cmdtable; cmd->name != NULL; cmd++) { @@ -51,8 +51,10 @@ void ExecuteCommand(char *cmdbuf) } } + assert(shargv[0] == argvbuf + ARG_MAX); + if (found == false) { - KernLog("err: command not found: '%s' (%ld)\n", + KernLog("err: command not found: '%.255s' (%ld)\n", shargv[0], strlen(shargv[0])); } } @@ -65,9 +67,9 @@ void KeStartShell(void) char *cmdbuf = malloc(CMDBUFSIZE); char *bufptr = cmdbuf; - argv0 = malloc(ARG_MAX * 2); - memzero(argv0, ARG_MAX * 2); - shargv = (char **)argv0; + argvbuf = malloc(ARG_MAX * 2); + memzero(argvbuf, ARG_MAX * 2); + shargv = (char **)argvbuf; KernLog("\n%Cshell> ", shcol); BFlushBuf(BStdOut); diff --git a/kaleid/libbuf/bprint.c b/kaleid/libbuf/bprint.c index 4d97295..9f5e7a8 100644 --- a/kaleid/libbuf/bprint.c +++ b/kaleid/libbuf/bprint.c @@ -110,7 +110,7 @@ error_t vbprintf(Buffer_t *buf, const char *fmt, va_list ap) { error_t rc = 0; - int width, prec, len; + ssize_t width, prec, len; char type; uchar uch; @@ -199,7 +199,7 @@ error_t vbprintf(Buffer_t *buf, const char *fmt, va_list ap) fmt++; \ name = va_arg(ap, int); \ } else { \ - while (isdigit(*fmt) && name < CONVBUFSIZE) { \ + while (isdigit(*fmt)) { \ name = 10 * name + (*fmt - '0'); \ fmt++; \ } \ @@ -221,12 +221,6 @@ error_t vbprintf(Buffer_t *buf, const char *fmt, va_list ap) bextractwp(prec); } - // Make sure they're not too big - if (width > CONVBUFSIZE || prec > CONVBUFSIZE) { - rc = EINVAL; - break; - } - // // Length field // @@ -270,12 +264,14 @@ error_t vbprintf(Buffer_t *buf, const char *fmt, va_list ap) if (!(base < 0 || base > VGA_COLOR_WHITE)) rc = bputc(buf, RtlColorToChar(base)); + + assert(!rc && 1); continue; } #endif // Strings - else if (type == 's') { + if (type == 's') { s = va_arg(ap, char *); if (s == NULL) s = "(null)"; @@ -291,9 +287,17 @@ error_t vbprintf(Buffer_t *buf, const char *fmt, va_list ap) continue; } + + + // Make sure width and prec aren't too big + // (We didn't do that earlier because %s uses width) + if (width > CONVBUFSIZE || prec > CONVBUFSIZE) { + rc = EINVAL; + break; + } // Decimal, unsigned decimal, hexadecimal, octal and binary numbers - else if (type == 'd' || type == 'i') { base = 10; sgn = 1; } + if (type == 'd' || type == 'i') { base = 10; sgn = 1; } else if (type == 'X') { base = 16; cap = 1; } else if (type == 'x') { base = 16; } else if (type == 'u') { base = 10; } @@ -406,7 +410,8 @@ error_t vbprintf(Buffer_t *buf, const char *fmt, va_list ap) } // For debugging purposes - assert(!rc); + if(rc)KeStartPanic("%s",strerror(rc)); + assert(!rc && "vbprintf() error"); return rc; }