[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 |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/modules/lib/stdlibc/file.c b/src/modules/lib/stdlibc/file.c
index 34b8171..5bb60cd 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,10 @@ 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 {
@@ -583,7 +584,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