Skip to content

Commit

Permalink
Clean up openconnect_protos handling
Browse files Browse the repository at this point in the history
Do it with a bit less pointer arithmetic and it won't need a sentinel
at the end of the array.

It's a little bit cleaner, and hopefully Coverity will shut up about
leaks from openconnect_get_supported_protocols() potentially returning
non-negative after allocating the returned pointer.

Signed-off-by: David Woodhouse <dwmw2@infradead.org>
  • Loading branch information
dwmw2 committed Oct 10, 2019
1 parent 8853c3e commit 7cb8996
Showing 1 changed file with 14 additions and 11 deletions.
25 changes: 14 additions & 11 deletions library.c
Expand Up @@ -110,7 +110,7 @@ struct openconnect_info *openconnect_vpninfo_new(const char *useragent,
return NULL;
}

const struct vpn_proto openconnect_protos[] = {
static const struct vpn_proto openconnect_protos[] = {
{
.name = "anyconnect",
.pretty_name = N_("Cisco AnyConnect or openconnect"),
Expand Down Expand Up @@ -186,25 +186,26 @@ const struct vpn_proto openconnect_protos[] = {
.udp_catch_probe = oncp_esp_catch_probe,
#endif
},
{ /* NULL */ }
};

#define NR_PROTOS (sizeof(openconnect_protos)/sizeof(*openconnect_protos))

int openconnect_get_supported_protocols(struct oc_vpn_proto **protos)
{
struct oc_vpn_proto *pr;
const struct vpn_proto *p;
int i;

*protos = pr = calloc(sizeof(openconnect_protos)/sizeof(*openconnect_protos), sizeof(*pr));
*protos = pr = calloc(NR_PROTOS, sizeof(*pr));
if (!pr)
return -ENOMEM;

for (p = openconnect_protos; p->name; p++, pr++) {
pr->name = p->name;
pr->pretty_name = _(p->pretty_name);
pr->description = _(p->description);
pr->flags = p->flags;
for (i = 0; i < NR_PROTOS; i++) {
pr[i].name = openconnect_protos[i].name;
pr[i].pretty_name = _(openconnect_protos[i].pretty_name);
pr[i].description = _(openconnect_protos[i].description);
pr[i].flags = openconnect_protos[i].flags;
}
return (p - openconnect_protos);
return i;
}

void openconnect_free_supported_protocols(struct oc_vpn_proto *protos)
Expand All @@ -220,8 +221,10 @@ const char *openconnect_get_protocol(struct openconnect_info *vpninfo)
int openconnect_set_protocol(struct openconnect_info *vpninfo, const char *protocol)
{
const struct vpn_proto *p;
int i;

for (p = openconnect_protos; p->name; p++) {
for (i = 0; i < NR_PROTOS; i++) {
p = &openconnect_protos[i];
if (strcasecmp(p->name, protocol))
continue;
vpninfo->proto = p;
Expand Down

0 comments on commit 7cb8996

Please sign in to comment.