Subject: Re: tgetstr bug
To: Valeriy E.Ushakov <uwe@ptc.spbu.ru>
From: Klaus Klein <kleink@reziprozitaet.de>
List: tech-userlevel
Date: 12/17/2006 16:45:33
Valeriy E. Ushakov wrote:

> Christos Zoulas <christos@astron.com> wrote:
>
>> In article <200612141505.51129.bruno@clisp.org>,
>> Bruno Haible  <bruno@clisp.org> wrote:
>>> tgetstr ("md", NULL) crashes on NetBSD. It's here:
>>>
>>> src/lib/libterm/termcap.c:
>>>
>>> char *
>>> t_getstr(struct tinfo *info, const char *id, char **area, size_t  
>>> *limit)
>>> {
>>> ...
>>>                _DIAGASSERT(limit != NULL);
>>>                *limit = i;                    <=====
>>>                free(s);
>>>                return NULL;
>>> ...
>>> }
>>>
>>> Other systems support tgetstr ("md", NULL) without problems, and
>>> return the string in a statically allocated buffer.
>>
>> The code that passes NULL is non-portable. According to the TOG:
>>
>>    The tgetstr() function gets the string entry for id. If area is
>>    not a null pointer and does not point to a null pointer, tgetstr()
>>    copies the string entry into the buffer pointed to by *area and
>>    advances the variable pointed to by area to the first byte after
>>    the copy of the string entry.
>>
>> By making tgetstr(id, NULL) work, we are encouraging non-portable
>> behavior.
>
> Hmm, why is that non-portable?  I read TOG text as that tgetstr
> returns the capability *and*, if area is not null, also copies the
> capability string into the area.

I concur with this reading.


- Klaus