[PATCH 2/5] add PAN GlobalProtect protocol support (HTTPS tunnel only)

Daniel Lenski dlenski at gmail.com
Wed Mar 7 00:01:01 PST 2018


On Tue, Mar 6, 2018 at 11:40 AM, David Woodhouse <dwmw2 at infradead.org> wrote:
> Thanks for tidying this up. Pushed to my gpst branch with one fixup so
> far, still reading through...
>
> On Sun, 2018-03-04 at 11:31 +0200, Daniel Lenski wrote:
>>
>> +/* similar to auth.c's xmlnode_get_text, including that *var should be freed by the caller,
>> +   but without the hackish param / %s handling that Cisco needs. And without freeing up
>> +   the old contents of *var, which is likely to lead to bugs? */
>
> Yeah... the way you're using it in gpst.c does lend mean that it's
> slightly more convenient to *not* free the previous contents. Otherwise
> various call sites would have to explicitly set s=NULL after
> xmlnode_get_text();add_option().
>
> I'm slightly concerned about having different semantics for the same
> (or similar) function in different files though; that is *also* likely
> to lead to bugs.

What do you prefer? Refactoring the two versions of xmlnode_get_text()
down to a single function, renaming the gpst.c version, something
else…?

>
>> +static int xmlnode_get_text(xmlNode *xml_node, const char *name, char **var)
>> +{
>> +       char *str;
>> +
>> +       if (name && !xmlnode_is_named(xml_node, name))
>> +               return -EINVAL;
>> +
>> +       str = (char *)xmlNodeGetContent(xml_node);
>> +       if (!str)
>> +               return -ENOENT;
>> +
>> +       *var = str;
>> +       return 0;
>> +}
>> +
>> +/* 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.

> Also, in parse_javascript(), consider an input line which looks like:
>
>    var respMsg = ";
>
> When you set '*prompt = strndup(start, end-start-2);
>
> ... what is the value of 'end-start-2'?

0 in that case. I've already verified that end[-1] == ';' && end[-2]
== '"' before getting to this point, so it's not possible for it to be
negative.

-Dan



More information about the openconnect-devel mailing list