Package: ocaml Version: 3.11.2-1 Severity: normal While testing how the Dbm can be used I got 2 errors with a corrupt dbm file. The test program DOES have the entire ML code wrapped in a try block, which works: $ ocaml dbm.cma foo.ml OK Exception: Not found
Now copy the (intentionally) corrupted dbm file attached to this bugreport: $ cp corrupt.pag data.db.pag 1. If the DB is corrupt I get a gdbm fatal error that kills the ML program $ ocaml dbm.cma foo.ml gdbm fatal: lseek error I think gdbm has a way to set a fatal error hook, which OCaml apparently isn't using. 2. And under some circumstances OCaml even segfaults with a corrupt dbm file (although it might be a bug in gdbm, I don't know): $ ocamlc dbm.cma foo.ml $ ocaml Objective Caml version 3.11.2 # #load "dbm.cma";; # #load "foo.ml";; File foo.ml is not a bytecode object file. # #load "foo.cmo";; Segmentation fault This doesn't immediately segfault, but gives valgrind warning: valgrind /usr/bin/ocamlrun /usr/bin/ocaml ==12557== Memcheck, a memory error detector ==12557== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al. ==12557== Using Valgrind-3.5.0-Debian and LibVEX; rerun with -h for copyright info ==12557== Command: /usr/bin/ocamlrun /usr/bin/ocaml ==12557== Objective Caml version 3.11.2 # #load "dbm.cma";; # #load "foo.cmo";; ==12557== Invalid read of size 8 ==12557== at 0x3CEAA03488: _gdbm_get_bucket (in /usr/lib/libgdbm.so.3.0.0) ==12557== by 0x3CEAA04048: _gdbm_findkey (in /usr/lib/libgdbm.so.3.0.0) ==12557== by 0x3CEAA02156: gdbm_fetch (in /usr/lib/libgdbm.so.3.0.0) ==12557== by 0x5494434: dbm_fetch (in /usr/lib/libgdbm_compat.so.3.0.0) ==12557== by 0x5291ED2: caml_dbm_fetch (in /usr/lib/ocaml/stublibs/dllmldbm.so) ==12557== by 0x41AFDE: caml_interprete (in /usr/bin/ocamlrun) ==12557== by 0x41C8B9: caml_main (in /usr/bin/ocamlrun) ==12557== by 0x419C0F: main (in /usr/bin/ocamlrun) ==12557== Address 0x5127838 is not stack'd, malloc'd or (recently) free'd ==12557== OK Here is foo.ml: Printexc.record_backtrace true; try let db = Dbm.opendbm "data.db" [Dbm.Dbm_rdwr; Dbm.Dbm_create] 0o666 in print_string "OK\n"; print_string (Dbm.find db "data"); Dbm.close db with e -> Printf.eprintf "Exception: %s\n" (Printexc.to_string e); Printexc.print_backtrace stderr; -- System Information: Debian Release: squeeze/sid APT prefers unstable APT policy: (990, 'unstable'), (500, 'testing'), (1, 'experimental') Architecture: amd64 (x86_64) Kernel: Linux 2.6.34-rc5-00118-gf259493 (SMP w/4 CPU cores; PREEMPT) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages ocaml depends on: ii libx11-dev 2:1.3.3-3 X11 client-side library (developme ii ocaml-base [ocaml-base-3.11.2 3.11.2-1 Runtime system for OCaml bytecode ii ocaml-nox [ocaml-nox-3.11.2] 3.11.2-1 ML implementation with a class-bas ocaml recommends no packages. Versions of packages ocaml suggests: pn tcl8.5-dev <none> (no description available) pn tk8.5-dev <none> (no description available) -- no debconf information
corrupt.db.pag
Description: application/gdbm