On Wed, Mar 7, 2018 at 11:34 AM, David Woodhouse <dw...@infradead.org> wrote:
>
>
> On Wed, 2018-03-07 at 10:01 +0200, Daniel Lenski wrote:
>> What do you prefer? Refactoring the two versions of xmlnode_get_text()
>> down to a single function, renaming the gpst.c version, something
>> else…?
>
> Don't know... one option is to ditch it entirely. Some of those cases
> where you're just using atoi(s); free(s); after it might be better done
> with xmlnode_is_named() and atoi(xml_node->content) perhaps?
>
> ISTR you saying that referencing node->content doesn't work? I don't
> recall the details...

Right, it doesn't work.
https://stackoverflow.com/questions/10363380/libxml2-can%C2%B4t-get-content-from-node

>> > > +/* We behave like CSTP — create a linked list in vpninfo->cstp_options
>> > > + * with the strings containing the information we got from the server,
>> > > + * and oc_ip_info contains const copies of those pointers.
>> > > + *
>> > > + * (unlike version in oncp.c, val is stolen rather than strdup'ed) */
>> > Er...
>> >
>> > >
>> > > +
>> > > +static const char *add_option(struct openconnect_info *vpninfo, const 
>> > > char *opt, const char *val)
>> > .... make it 'char *val' then, if it's stolen...
>> >
>> > >
>> > > +{
>> > > +       struct oc_vpn_option *new = malloc(sizeof(*new));
>> > > +       if (!new)
>> > > +               return NULL;
>> > > +
>> > > +       new->option = strdup(opt);
>> > > +       if (!new->option) {
>> > > +               free(new);
>> > > +               return NULL;
>> > > +       }
>> > > +       new->value = strdup(val);
>> >
>> > ... but I still see a strdup(). And should it *free* 'val' in the error
>> > patch if it was going to take ownership of it?
>>
>> Comment is straight-up wrong and obsolete. We changed this in a
>> previous iteration of the patches. Good catch.
>
> But then you are *using* add_option as the comment describes it:
>
>         for (xml_node = xml_node->children; xml_node; 
> xml_node=xml_node->next) {
>                 if (!xmlnode_get_text(xml_node, "ip-address", &s))
>                         vpninfo->ip_info.addr = add_option(vpninfo, "ipaddr", 
> s);
>
> That add_option() call *is* assuming that the 's' value will be stolen, 
> surely?

Indeed you're right. Current version is leaking memory every time I do
this and then don't free(s) … :facepalm:

This botched add_option() is the source of the memory leaks in the GP
version, as I'm now clearly seeing with valgrind. Will resubmit the patch.

Thanks,
dan

_______________________________________________
openconnect-devel mailing list
openconnect-devel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/openconnect-devel

Reply via email to