git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
| inline |
side by side
Many changes, bugfixes to user vsnprintf and to escape code handling
[tpg/acess2.git]
/
Usermode
/
Libraries
/
libc.so_src
/
fileIO.c
diff --git
a/Usermode/Libraries/libc.so_src/fileIO.c
b/Usermode/Libraries/libc.so_src/fileIO.c
index
5fdac4c
..
4a6a779
100644
(file)
--- 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)
{
\r
va_list tmpList = args;
\r
int size;
\r
- char *buf;
\r
+ char sbuf[1024];
\r
+ char *buf = sbuf;
\r
\r
if(!fp || !format) return -1;
\r
\r
- size = vs
printf(NULL
, (char*)format, tmpList);
\r
+ size = vs
nprintf(sbuf, 1024
, (char*)format, tmpList);
\r
\r
- buf = (char*)malloc(size+1);
\r
- buf[size] = '\0';
\r
+ if( size >= 1024 )
\r
+ {
\r
+ buf = (char*)malloc(size+1);
\r
+ if(!buf) {
\r
+ write(_stdout, 31, "vfprintf ERROR: malloc() failed");
\r
+ return 0;
\r
+ }
\r
+ buf[size] = '\0';
\r
\r
- // Print
\r
- vsprintf(buf, (char*)format, args);
\r
+ // Print
\r
+ vsnprintf(buf, size+1, (char*)format, args);
\r
+ }
\r
\r
// Write to stream
\r
- write(fp->FD, size
+1
, buf);
\r
+ write(fp->FD, size, buf);
\r
\r
// Free buffer
\r
free(buf);
\r
@@
-271,15
+279,20
@@
EXPORT int puts(const char *str)
return len;
\r
}
\r
\r
+EXPORT int vsprintf(char * __s, const char *__format, va_list __args)
\r
+{
\r
+ return vsnprintf(__s, 0x7FFFFFFF, __format, __args);
\r
+}
\r
+
\r
//sprintfv
\r
/**
\r
- \fn EXPORT void vsprintf(char *buf, const char *format, va_list args)
\r
+ \fn EXPORT void vs
n
printf(char *buf, const char *format, va_list args)
\r
\brief Prints a formatted string to a buffer
\r
\param buf Pointer - Destination Buffer
\r
\param format String - Format String
\r
\param args VarArgs List - Arguments
\r
*/
\r
-EXPORT int vs
printf(char *buf
, const char *format, va_list args)
\r
+EXPORT int vs
nprintf(char *buf, size_t __maxlen
, const char *format, va_list args)
\r
{
\r
char tmp[33];
\r
int c, minSize;
\r
@@
-295,7
+308,7
@@
EXPORT int vsprintf(char *buf, const char *format, va_list args)
{
\r
// Non-control character
\r
if (c != '%') {
\r
- if(buf
)
buf[pos] = c;
\r
+ if(buf
&& pos < __maxlen)
buf[pos] = c;
\r
pos ++;
\r
continue;
\r
}
\r
@@
-303,7
+316,7
@@
EXPORT int vsprintf(char *buf, const char *format, va_list args)
// Control Character
\r
c = *format++;
\r
if(c == '%') { // Literal %
\r
- if(buf
)
buf[pos] = '%';
\r
+ if(buf
&& pos < __maxlen)
buf[pos] = '%';
\r
pos ++;
\r
continue;
\r
}
\r
@@
-358,7
+371,7
@@
EXPORT int vsprintf(char *buf, const char *format, va_list args)
\r
// Pointer
\r
case 'p':
\r
- if(buf) {
\r
+ if(buf
&& pos+2 < __maxlen
) {
\r
buf[pos] = '*';
\r
buf[pos+1] = '0';
\r
buf[pos+2] = 'x';
\r
@@
-394,7
+407,8
@@
EXPORT int vsprintf(char *buf, const char *format, va_list args)
if(!p) p = "(null)";
\r
if(buf) {
\r
while(*p) {
\r
- buf[pos++] = *p++;
\r
+ if(pos < __maxlen) buf[pos] = *p;
\r
+ pos ++; p ++;
\r
}
\r
}
\r
else {
\r
@@
-407,12
+421,12
@@
EXPORT int vsprintf(char *buf, const char *format, va_list args)
// Unknown, just treat it as a character
\r
default:
\r
arg = va_arg(args, uint32_t);
\r
- if(buf
)
buf[pos] = arg;
\r
+ if(buf
&& pos < __maxlen)
buf[pos] = arg;
\r
pos ++;
\r
break;
\r
}
\r
}
\r
- if(buf
)
buf[pos] = '\0';
\r
+ if(buf
&& pos < __maxlen)
buf[pos] = '\0';
\r
\r
return pos;
\r
}
\r
@@
-463,22
+477,29
@@
EXPORT int printf(const char *format, ...)
{
\r
#if 1
\r
int size;
\r
- char *buf;
\r
+ char sbuf[1024];
\r
+ char *buf = sbuf;
\r
va_list args;
\r
\r
// Get final size
\r
va_start(args, format);
\r
- size = vs
printf(NULL
, (char*)format, args);
\r
+ size = vs
nprintf(sbuf, 1024
, (char*)format, args);
\r
va_end(args);
\r
\r
- // Allocate buffer
\r
- buf = (char*)malloc(size+1);
\r
- buf[size] = '\0';
\r
+ if( size >= 1024 ) {
\r
+ // Allocate buffer
\r
+ buf = (char*)malloc(size+1);
\r
+ if(buf) {
\r
+ write(_stdout, 29, "PRINTF ERROR: malloc() failed");
\r
+ return 0;
\r
+ }
\r
+ buf[size] = '\0';
\r
\r
- // Fill Buffer
\r
- va_start(args, format);
\r
- vsprintf(buf, (char*)format, args);
\r
- va_end(args);
\r
+ // Fill Buffer
\r
+ va_start(args, format);
\r
+ vsnprintf(buf, size+1, (char*)format, args);
\r
+ va_end(args);
\r
+ }
\r
\r
// Send to stdout
\r
write(_stdout, size+1, buf);
\r
UCC
git Repository :: git.ucc.asn.au