[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Re: (ITS#4627) back-ldif issues
h.b.furuseth@usit.uio.no wrote:
> Pierangelo Masarati writes:
>>> Error handling:
>>>
>>> ldif_tool_entry_first() cannot return NOID.
>> Dunno (untouched)
>
> Howard fixed. One remaining issue: ldif_tool_entry_next() increments
> li->li_tool_current even when it returns NOID. Should it do that?
Harmless, but stupid. Fixed now.
>
>> (...)
>>> back-ldif overwrites files instead writing to a temp file and
>>> renaming when complete. The current way corrupts entries if a
>>> write fails halfway through, e.g. due to a full disk. Also the
>>> file can be left truncated if internal slapd operations fail.
>>> If the OS supports it, back-ldif should make a new file in the
>>> same directory and rename to the old filename when complete.
>> Fixed; now mkstemp(3) is used, and rename(2) only in case of success.
>
> Not there yet... you create it in the current directory instead
> of in the ldif directory.
>
> Possibly it's best to create it in the top directory of the ldif
> database. That way, if a temp file is somehow created and not
> cleaned away, it's (a) in the easiest place to see and (b) won't
> prevent rmdir() if one tries to delete that database or whatever.
I would use "rm -rf" to delete the DB, in which case (b) is a moot point.
> I don't know if there are non-Unix OSes which need special system calls
> to move file between directories though. Or for that matter, if they
> allow rename() to replace an existing file, maybe unlink is needed
> first. The code looks very Unixy already, so I assume a Unix emulation
> is needed to run it anyway. I don't know how those work.
Yes, we require POSIX semantics here. rename() unlinks the target atomically;
it would be a mistake to code this in a different manner.
> Also there were some spew_entry() coding errors, rev 1.70 fixes them.
>
>> (...)
>>> .inum should be signed, or should be read with strtoul instead of
>>> strtol.
>> strtoul(3) used
I think strtoul() here is a mistake, and we've fixed/refixed this point a
couple times already. Remember that frontendDB has an index of {-1} in the
config tree.
>>> I suppose it and cmp in the function should be ber_int_t,
>>> since LDAP integers are typically 32-bit.
>> Not sure what you mean.
>
> I don't remember. Maybe the number can end up being sent over the
> protocol, and it's possible to create a filename with a long > max
> ber_int_t so the wrong number will be sent?
>
--
-- Howard Chu
Chief Architect, Symas Corp. http://www.symas.com
Director, Highland Sun http://highlandsun.com/hyc/
Chief Architect, OpenLDAP http://www.openldap.org/project/