BlobFix
=======

The basic method is as follows:

    First, it checks that the file actually has at least one blob/memo
    field.  If not, there is nothing to do.

    Second, it creates a new blob file ("__blob__.tmp") which will hold
    the recovered data.

    Next, it goes through every record, in record number order, and for
    each blob/memo field, it reads it into memory using a special build
    of the blob I/O routines.  (These routines verify the integrity of
    everything that they read, and will attempt to read as much as
    possible from the blob.  Illegal pointers and the like will be
    caught and will not cause a crash.)

    Each object that is read gets written to the new blob file, and the
    pointers in the record are updated appropriately.

    Once done, the old blob file is deleted and the temp file is moved
    into place.


Checked-build blob I/O routines
===============================

At each step of the way, the block type is verified upon being read.

All offsets and lengths are checked to make sure that they contain sane
values.  (ie: the resulting object resides within the block of data.)

Any errors will be logged, and the object truncated to whatever was able
to be read before the corruption made it impossible to continue.


Note
====

In order for the errors to be logged, you must set PFBLOBFIXLOG=filename
in the environment/config file.  All log entries will be appended to this
file.
