X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Flibc.c;h=2e08a17c807993f3609089d65c83d22f4115fc2d;hb=91cb22a5f21eeca8f84456c1febf79f84a65d30d;hp=2950782453180f8ec63d564a7ac88e69793e0434;hpb=776d802dde3d6361d7c700e0c788d64d302bd537;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/libc.c b/KernelLand/Kernel/libc.c index 29507824..2e08a17c 100644 --- a/KernelLand/Kernel/libc.c +++ b/KernelLand/Kernel/libc.c @@ -156,19 +156,20 @@ void itoa(char *buf, Uint64 num, int base, int minLength, char pad) int pos=0, i; Uint64 rem; + buf[0] = 0; + ASSERTR(base >= 2, ); + ASSERTR(base <= 16, ); + // Sanity check if(!buf) return; - // Sanity Check - if(base > 16 || base < 2) { - buf[0] = 0; - return; - } - // Convert while(num > base-1) { num = DivMod64U(num, base, &rem); // Shift `num` and get remainder ASSERT(rem >= 0); + if( rem >= base && base != 16 ) { + Debug("rem(%llx) >= base(%x), num=%llx", rem, base, num); + } ASSERT(rem < base); tmpBuf[pos] = cUCDIGITS[ rem ]; pos++; @@ -316,11 +317,14 @@ int vsnprintf(char *__s, const size_t __maxlen, const char *__format, va_list ar GETVAL(); if( isLongLong && val >> 63 ) { PUTCH('-'); - val = -val; + if( val == LLONG_MIN ) + val = LLONG_MAX; + else + val = -val; } - else if( !isLongLong && val >> 31 ) { + else if( !isLongLong && (val >> 31) ) { PUTCH('-'); - val = -(Sint32)val; + val = (~val & 0xFFFFFFFF)+1; } itoa(tmpBuf, val, 10, minSize, pad); goto printString; @@ -387,10 +391,23 @@ int vsnprintf(char *__s, const size_t __maxlen, const char *__format, va_list ar case 'C': // Non-Null Terminated Character Array p = va_arg(args, char*); - if( !CheckMem(p, minSize) ) continue; // No #PFs please + if( !CheckMem(p, minSize) ) { + p = "(inval)"; + goto printString; + } if(!p) goto printString; while(minSize--) { - PUTCH(*p); + if(*p == '\0') { + PUTCH('\\'); + PUTCH('0'); + } + else if(*p == '\\') { + PUTCH('\\'); + PUTCH('\\'); + } + else { + PUTCH(*p); + } p ++; } break;