Buffers    Files    Tools    Mule
Date: Mon, 9 Jul 2001 16:46:18 +0200
From: Johannes Steingraeber
To: pvdevelop
Subject: [pvdevelop] LibReadFile buffer overflow
Message-ID: <20010709164618.C1437@brodlin.uni-kiel.de>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
X-Mailer: Mutt 1.0pre3i
Precedence: bulk
Content-Transfer-Encoding: 8bit
Status: RO
Content-Length: 1221
Lines: 33

Hallo,

wahrscheinlich wissen es längst alle außer mir. Die Funktion
LibFileRead() schreibt munter über das Ende des Buffers hinaus, wenn
z.B. in eine Variable vom Typ FILE_BUF binär 0x0C00 Bytes gelesen
werden sollen.

Der Überlauf entsteht immer dann, wenn die Größe der union fbuf kein
ganzes Vielfaches von FILE_BLOCK_SIZE (=64) ist, der Record aber so
groß wie bin_buf ist. Das PVOS liest nämlich (bei FILE_KIND_BIN) immer
ganze Blöcke direkt in den Zielbuffer ein. Dabei wird der erste Block
genau nach dummy_16by geschrieben. Die 24 Bytes vor bin_buf sorgen
dafür, dass beim Einlesen des letzten Blocks 64-24=40 Bytes über das
Ende von FILE_BUF hinausgeschrieben wird.

Es hat mich doch einige Nerven gekostet, bis ich darauf gekommen bin :-(

Workaround: nicht FILE_BUF benutzen, sondern eine eigene Struktur, die
mit FILE_BUF identisch ist bis auf

  byte bin_buf[3072+40];	/* Buffer to store real data (BINARY) 3KB */

Zwei "Nebeneffekte" der PVOS Routinen:

1. Für Records bis zur Länge von 3072-24=3048 kann der Original
   FILE_BUF verwenden.

2. LibFileReadEx() liest mit Blockanzahl = 1 auf jeden Fall den
   gültigen Wert für char_num ein, ermittelt also zuverlässig die
   Record-Länge.

Gruß,
	Johannes



--:%%  pvdevelop        (Text Fill)----ALL----------------
M-x view-file ../index.html