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

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



Am Samstag, 25. April 2009 16:47 schrieb Antoine Kaufmann:
> ! 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);

Tab-Damage. Aber schon im Original. :-/

>  				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))

Ist die Logik hier nicht umgekehrt und die aktuelle Variante die richtige?

Wer auch immer diesen Code ursprünglich verbrochen hat, sollte sich 
schämen. ;-)