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