tdbsam serious problem when migrating from 3.0.32 to 3.3.2

Jeremy Allison jra at samba.org
Tue Mar 17 22:44:16 GMT 2009


On Tue, Mar 17, 2009 at 03:58:16PM +0300, Alexander Zagrebin wrote:
> I have tried to migrate from samba version 3.0.32 to 3.3.2 and found
> the serious problem: samba can't convert my passdb.tdb from version 3 to
> version 4.
> 
> For example, when running "pdbedit -L" I receive:
> 
> # pdbedit -L
> tdbsam_open: Converting version 3 database to version 4.
> Could not store the new record: NT_STATUS_UNSUCCESSFUL
> Converting records failed
> tdbsam_open: Error when trying to convert tdbsam
> [/usr/local/etc/samba/passdb.tdb]
> tdbsam_getsampwnam: failed to open /usr/local/etc/samba/passdb.tdb!
> Could not start searching users
> Segmentation fault (core dumped)
> 
> With debugging (-d5) the output contains:
> ...
> Finding user ????
> Trying _Get_Pwnam(), username as lowercase is ????
> Get_Pwnam_internals did find user [????]!
> Could not store the new record: NT_STATUS_UNSUCCESSFUL
> Converting records failed
> ...
> 
> This problem exists only for user names, containing characters with codes
> from
> range 128...255 (with high bit set).
> After doing some debugging, I have found that:
> 
> 1. Possible the "break" is missed at source/passdb/pdb_tdb.c:

I've committed this change (under your name) to all relevent
git trees.

> --- source/passdb/pdb_tdb.c.orig        2009-02-24 10:38:16.000000000 +0300
> +++ source/passdb/pdb_tdb.c             2009-03-14 23:47:41.000000000 +0300
> @@ -102,6 +102,7 @@
>                 ret = init_samu_from_buffer(user, SAMU_BUFFER_V3,
>                                             (uint8 *)rec->value.dptr,
>                                             rec->value.dsize);
> +               break;
>         case 4:
>                 ret = init_samu_from_buffer(user, SAMU_BUFFER_V4,
>                                             (uint8 *)rec->value.dptr,
> 
> 2. The reason of the above described problem is in default_tdb_hash
> (source/lib/tdb/common/open.c)
> This function returns different results on 3.0.* and 3.3.* for same data,
> containing non-ascii
> characters. The code is the same, but definition of TDB_DATA
> (source/lib/tdb/include/tdb.h)
> was changed. Early the TDB_DATA.dptr was signed, but now it is unsigned. So
> the hash calculation
> makes a different result now and pdbedit can't store the new (upgraded)
> record.

Have you reproduced this problem with your additional "break" fix ?
Is the tdb_modify failing with record not found here ?

Jeremy.


More information about the samba-technical mailing list