From 3deb501f86fc47e175ef6a3eaba9b9846a80d444 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 4 Mar 2024 04:13:18 +0000 Subject: [PATCH] upstream: fix leak of CanonicalizePermittedCNAMEs on error path; spotted by Coverity (CID 438039) OpenBSD-Commit-ID: 208839699939721f452a4418afc028a9f9d3d8af --- readconf.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/readconf.c b/readconf.c index 804fcca2f..3a64a0441 100644 --- a/readconf.c +++ b/readconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: readconf.c,v 1.385 2024/03/04 02:16:11 djm Exp $ */ +/* $OpenBSD: readconf.c,v 1.386 2024/03/04 04:13:18 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -890,6 +890,20 @@ parse_token(const char *cp, const char *filename, int linenum, return oBadOption; } +static void +free_canon_cnames(struct allowed_cname *cnames, u_int n) +{ + u_int i; + + if (cnames == NULL || n == 0) + return; + for (i = 0; i < n; i++) { + free(cnames[i].source_list); + free(cnames[i].target_list); + } + free(cnames); +} + /* Multistate option parsing */ struct multistate { char *key; @@ -2160,13 +2174,10 @@ parse_pubkey_algos: if (found && *activep) { options->permitted_cnames = cnames; options->num_permitted_cnames = ncnames; - } else { - for (i = 0; i < ncnames; i++) { - free(cnames[i].source_list); - free(cnames[i].target_list); - } - free(cnames); + cnames = NULL; /* transferred */ + ncnames = 0; } + /* un-transferred cnames is cleaned up before exit */ break; case oCanonicalizeHostname: @@ -2405,6 +2416,7 @@ parse_pubkey_algos: /* success */ ret = 0; out: + free_canon_cnames(cnames, ncnames); opt_array_free2(strs, NULL, nstrs); argv_free(oav, oac); return ret;