svn commit: r268945 - in head: lib/libc/stdlib sys/sys
Pedro Giffuni
pfg at freebsd.org
Wed Jul 23 19:42:04 UTC 2014
Il giorno 23/lug/2014, alle ore 12:54, Pedro Giffuni <pfg at FreeBSD.org> ha scritto:
>
> Il giorno 23/lug/2014, alle ore 12:22, Konstantin Belousov <kostikbel at gmail.com> ha scritto:
>
>> On Mon, Jul 21, 2014 at 03:44:59PM +0000, Pedro F. Giffuni wrote:
>>> Author: pfg
>>> Date: Mon Jul 21 15:44:59 2014
>>> New Revision: 268945
>>> URL: http://svnweb.freebsd.org/changeset/base/268945
>>>
>>> Log:
>>> Fix hdestroy() compliance issue.
>>>
>>> The hcreate(3) implementation and related functions we inherited
>>> from NetBSD used to free() the key value, something that is not
>>> supported by the standard implementation.
>>>
>>> This would cause a segmentation fault when attempting to run
>>> the examples from the opengroup and linux manpages. NetBSD
>>> has added non-standard calls to provide the previous
>>> behaviour but hdestroy is not very commonly used so at this
>>> time it seems excessive to bring those to FreeBSD.
>>>
>>> Bump the __FreeBSD_version as this is an ABI change.
>>>
>>> Reference:
>>> http://bugs.dragonflybsd.org/issues/1398
>>>
>>> MFC after: 2 weeks
>>>
>>> Modified:
>>> head/lib/libc/stdlib/hcreate.c
>>> head/sys/sys/param.h
>>>
>>> Modified: head/lib/libc/stdlib/hcreate.c
>>> ==============================================================================
>>> --- head/lib/libc/stdlib/hcreate.c Mon Jul 21 15:26:52 2014 (r268944)
>>> +++ head/lib/libc/stdlib/hcreate.c Mon Jul 21 15:44:59 2014 (r268945)
>>> @@ -159,7 +159,6 @@ hdestroy_r(struct hsearch_data *head)
>>> while (!SLIST_EMPTY(&table[idx])) {
>>> ie = SLIST_FIRST(&table[idx]);
>>> SLIST_REMOVE_HEAD(&table[idx], link);
>>> - free(ie->ent.key);
>>> free(ie);
>>> }
>>> }
>>>
>>> Modified: head/sys/sys/param.h
>>> ==============================================================================
>>> --- head/sys/sys/param.h Mon Jul 21 15:26:52 2014 (r268944)
>>> +++ head/sys/sys/param.h Mon Jul 21 15:44:59 2014 (r268945)
>>> @@ -58,7 +58,7 @@
>>> * in the range 5 to 9.
>>> */
>>> #undef __FreeBSD_version
>>> -#define __FreeBSD_version 1100027 /* Master, propagated to newvers */
>>> +#define __FreeBSD_version 1100028 /* Master, propagated to newvers */
>>>
>>> /*
>>> * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
>> You broke the ABI. This is absolute stopper for the symversioned
>> fundamental library.
>>
>
> I thought about it for a while.
> Actually .. I didn’t. The interface remains unchanged, I only fixed an undocumented bug.
>
As clarification .. I meant I didn’t actually break the ABI ...
It’s just a bug fix and we shouldn’t provide compatibility shims for bugs.
> I say undocumented because while he NetBSD man page did document the bug, our man page has always claimed compliance .
>
>> The right thing to do is to introduce a new version of hcreate() for FBSD_1.4,
>> and provide compat shims with the old behaviour for FBSD_1.0.
>
> hcreate() is not used in the base: all consumers (ports tree) are likely to expect the standard behavior so this change saves them from a segmentation fault. In the rare case of someone having developed their code for the broken function, the worst they will see is a memory leak.
>
> A compat shim would be really ugly :(.
>
FWIW, NetBSD provides new functions with the old behavior but hdestroy() now conforms to standards. Things there got really ugly because they also had that issue for the re-entrant versions.
I am thinking of MFCing the fix, but not the re-entrant versions.
Pedro.
More information about the svn-src-head
mailing list