[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH] libc: Fix fuer die Schreibpuffer in stdio



! libc: Fehler behoben, der verhindert, dass gepuffert wird, und zu
        einem Buffer overflow führen kann.
! libc: Puffer in fclose und fseek flushen
! libc: Fix fuers Befuellen der Blockpuffer, damit dabei nichts
        ueberschrieben wird.
---
 src/modules/lib/stdlibc/file.c |   12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/modules/lib/stdlibc/file.c b/src/modules/lib/stdlibc/file.c
index 34b8171..6441fcd 100644
--- a/src/modules/lib/stdlibc/file.c
+++ b/src/modules/lib/stdlibc/file.c
@@ -201,6 +201,7 @@ int fclose (FILE* io_res)
         return EOF;
     }
 
+    fflush(io_res);
     setvbuf(io_res, NULL, _IONBF, 0);
 
     result = rpc_get_dword(io_res->pid, "IO_CLOSE", sizeof(io_resource_id_t),
@@ -489,10 +490,11 @@ size_t fwrite(const void* data, size_t blocksize, size_t blockcount,
 			//Ueberpruefen, ob genug Platz im Buffer ist, dann werden die Daten
 			// in den Buffer kopiert, sonst wird der Buffer geleert, und die
 			// Daten werden direkt geschrieben.
-			if (io_res->buffer_size < (io_res->buffer_pos + data_size))
+			if (io_res->buffer_size >= (io_res->buffer_pos + data_size))
 			{
 				//Daten in den Buffer kopieren.
-				memcpy(io_res->buffer_ptr, data, data_size);
+				memcpy(io_res->buffer_ptr + io_res->buffer_pos, data,
+                    data_size);
 				io_res->buffer_pos += data_size;
                 return data_size;
 			} else {
@@ -508,7 +510,7 @@ size_t fwrite(const void* data, size_t blocksize, size_t blockcount,
 			// geleert, und die Daten werden auch direkt geschrieben. Auch wenn
 			// die Daten mindestens einen Zeilenumbruch enthalten, wird der
 			// Buffer geleert.
-			if ((io_res->buffer_size < (io_res->buffer_pos + data_size)) || 
+			if ((io_res->buffer_size >= (io_res->buffer_pos + data_size)) ||
 				(memchr(data, '\n', data_size) != NULL))
 			{
 			    if (fflush(io_res) == EOF) {
@@ -583,7 +585,9 @@ int fseek (FILE* io_res, long int offset, int origin)
     if ((io_res == NULL) || (io_res->pid == 0)) {
         return -1;
     }
-    
+
+    fflush(io_res);
+
     // ungetc-Buffer leeren
     if (io_res->ungetc_count != 0) {
         io_res->ungetc_count = 0;
-- 
1.6.0.6