X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibc.so_src%2FfileIO.c;h=4a6a779ddd8ae8ef50d9f47d39cc85f9d5a5f01c;hb=85eb17b306404571aa39596946c87ad9bb1d9d13;hp=5fdac4cc220950f56f8ea34e592ea0461bd9288c;hpb=e61cffb0ef7221e18df8e67cba37a3ec45232275;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libc.so_src/fileIO.c b/Usermode/Libraries/libc.so_src/fileIO.c index 5fdac4cc..4a6a779d 100644 --- a/Usermode/Libraries/libc.so_src/fileIO.c +++ b/Usermode/Libraries/libc.so_src/fileIO.c @@ -150,20 +150,28 @@ EXPORT int vfprintf(FILE *fp, const char *format, va_list args) { va_list tmpList = args; int size; - char *buf; + char sbuf[1024]; + char *buf = sbuf; if(!fp || !format) return -1; - size = vsprintf(NULL, (char*)format, tmpList); + size = vsnprintf(sbuf, 1024, (char*)format, tmpList); - buf = (char*)malloc(size+1); - buf[size] = '\0'; + if( size >= 1024 ) + { + buf = (char*)malloc(size+1); + if(!buf) { + write(_stdout, 31, "vfprintf ERROR: malloc() failed"); + return 0; + } + buf[size] = '\0'; - // Print - vsprintf(buf, (char*)format, args); + // Print + vsnprintf(buf, size+1, (char*)format, args); + } // Write to stream - write(fp->FD, size+1, buf); + write(fp->FD, size, buf); // Free buffer free(buf); @@ -271,15 +279,20 @@ EXPORT int puts(const char *str) return len; } +EXPORT int vsprintf(char * __s, const char *__format, va_list __args) +{ + return vsnprintf(__s, 0x7FFFFFFF, __format, __args); +} + //sprintfv /** - \fn EXPORT void vsprintf(char *buf, const char *format, va_list args) + \fn EXPORT void vsnprintf(char *buf, const char *format, va_list args) \brief Prints a formatted string to a buffer \param buf Pointer - Destination Buffer \param format String - Format String \param args VarArgs List - Arguments */ -EXPORT int vsprintf(char *buf, const char *format, va_list args) +EXPORT int vsnprintf(char *buf, size_t __maxlen, const char *format, va_list args) { char tmp[33]; int c, minSize; @@ -295,7 +308,7 @@ EXPORT int vsprintf(char *buf, const char *format, va_list args) { // Non-control character if (c != '%') { - if(buf) buf[pos] = c; + if(buf && pos < __maxlen) buf[pos] = c; pos ++; continue; } @@ -303,7 +316,7 @@ EXPORT int vsprintf(char *buf, const char *format, va_list args) // Control Character c = *format++; if(c == '%') { // Literal % - if(buf) buf[pos] = '%'; + if(buf && pos < __maxlen) buf[pos] = '%'; pos ++; continue; } @@ -358,7 +371,7 @@ EXPORT int vsprintf(char *buf, const char *format, va_list args) // Pointer case 'p': - if(buf) { + if(buf && pos+2 < __maxlen) { buf[pos] = '*'; buf[pos+1] = '0'; buf[pos+2] = 'x'; @@ -394,7 +407,8 @@ EXPORT int vsprintf(char *buf, const char *format, va_list args) if(!p) p = "(null)"; if(buf) { while(*p) { - buf[pos++] = *p++; + if(pos < __maxlen) buf[pos] = *p; + pos ++; p ++; } } else { @@ -407,12 +421,12 @@ EXPORT int vsprintf(char *buf, const char *format, va_list args) // Unknown, just treat it as a character default: arg = va_arg(args, uint32_t); - if(buf) buf[pos] = arg; + if(buf && pos < __maxlen) buf[pos] = arg; pos ++; break; } } - if(buf) buf[pos] = '\0'; + if(buf && pos < __maxlen) buf[pos] = '\0'; return pos; } @@ -463,22 +477,29 @@ EXPORT int printf(const char *format, ...) { #if 1 int size; - char *buf; + char sbuf[1024]; + char *buf = sbuf; va_list args; // Get final size va_start(args, format); - size = vsprintf(NULL, (char*)format, args); + size = vsnprintf(sbuf, 1024, (char*)format, args); va_end(args); - // Allocate buffer - buf = (char*)malloc(size+1); - buf[size] = '\0'; + if( size >= 1024 ) { + // Allocate buffer + buf = (char*)malloc(size+1); + if(buf) { + write(_stdout, 29, "PRINTF ERROR: malloc() failed"); + return 0; + } + buf[size] = '\0'; - // Fill Buffer - va_start(args, format); - vsprintf(buf, (char*)format, args); - va_end(args); + // Fill Buffer + va_start(args, format); + vsnprintf(buf, size+1, (char*)format, args); + va_end(args); + } // Send to stdout write(_stdout, size+1, buf);