[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