Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
plug resource leaks in case of errors
Baptiste Daroussin committed 10 years ago
commit e3780c399489d14d55545e287aecf837bfcace35
parent 596a372
12 files changed +64 -26
modified libpkg/fetch.c
@@ -579,8 +579,8 @@ pkg_fetch_file_to_fd(struct pkg_repo *repo, const char *url, int dest,
				sbuf_cat(fetchOpts, "6");
		}

-
        if (debug_level >= 4)
-
            sbuf_cat(fetchOpts, "v");
+
		if (debug_level >= 4)
+
			sbuf_cat(fetchOpts, "v");

		pkg_debug(1,"Fetch: fetching from: %s://%s%s%s%s with opts \"%s\"",
		    u->scheme,
@@ -595,6 +595,7 @@ pkg_fetch_file_to_fd(struct pkg_repo *repo, const char *url, int dest,
		if (offset > 0)
			u->offset = offset;
		remote = fetchXGet(u, &st, sbuf_data(fetchOpts));
+
		sbuf_delete(fetchOpts);
		if (remote == NULL) {
			if (fetchLastErrCode == FETCH_OK) {
				retcode = EPKG_UPTODATE;
@@ -682,9 +683,6 @@ cleanup:

	/* restore original doc */
	u->doc = doc;
-
	if (fetchOpts != NULL)
-
		sbuf_delete(fetchOpts);
-

	fetchFreeURL(u);

	return (retcode);
modified libpkg/pkg_config.c
@@ -945,8 +945,9 @@ pkg_ini(const char *path, const char *reposdir, pkg_init_flags flags)
	}

	ncfg = NULL;
+
	ukey = sbuf_new_auto();
	while (obj != NULL && (cur = ucl_iterate_object(obj, &it, true))) {
-
		sbuf_init(&ukey);
+
		sbuf_reset(ukey);
		key = ucl_object_key(cur);
		for (i = 0; key[i] != '\0'; i++)
			sbuf_putc(ukey, toupper(key[i]));
@@ -977,13 +978,12 @@ pkg_ini(const char *path, const char *reposdir, pkg_init_flags flags)
			ncfg = ucl_object_typed_new(UCL_OBJECT);
		ucl_object_insert_key(ncfg, ucl_object_copy(cur), sbuf_data(ukey), sbuf_len(ukey), true);
	}
+
	sbuf_delete(ukey);

	if (fatal_errors) {
		ucl_object_unref(ncfg);
		ucl_parser_free(p);
		free(rootedpath);
-
		if (ukey != NULL)
-
			sbuf_delete(ukey);
		return (EPKG_FATAL);
	}

modified libpkg/pkg_create.c
@@ -86,6 +86,7 @@ pkg_create_from_dir(struct pkg *pkg, const char *root,

		if (lstat(fpath, &st) == -1) {
			pkg_emit_error("file '%s' is missing", fpath);
+
			kh_destroy_hardlinks(hardlinks);
			return (EPKG_FATAL);
		}

modified libpkg/pkg_ports.c
@@ -890,7 +890,7 @@ apply_keyword_file(ucl_object_t *obj, struct plist *p, char *line, struct file_a
	char *buf, *tofree = NULL;
	struct file_attr *freeattr = NULL;
	int spaces, argc = 0;
-
	int ret = EPKG_OK;
+
	int ret = EPKG_FATAL;

	if ((o = ucl_object_find_key(obj,  "arguments")) && ucl_object_toboolean(o)) {
		spaces = pkg_utils_count_spaces(line);
@@ -915,7 +915,7 @@ apply_keyword_file(ucl_object_t *obj, struct plist *p, char *line, struct file_a
	if ((o = ucl_object_find_key(obj, "post-install"))) {
		if (format_exec_cmd(&cmd, ucl_object_tostring(o), p->prefix,
		    p->last_file, line, argc, args) != EPKG_OK)
-
			return (EPKG_FATAL);
+
			goto keywords_cleanup;
		sbuf_printf(p->post_install_buf, "%s\n", cmd);
		free(cmd);
	}
@@ -923,7 +923,7 @@ apply_keyword_file(ucl_object_t *obj, struct plist *p, char *line, struct file_a
	if ((o = ucl_object_find_key(obj, "pre-deinstall"))) {
		if (format_exec_cmd(&cmd, ucl_object_tostring(o), p->prefix,
		    p->last_file, line, argc, args) != EPKG_OK)
-
			return (EPKG_FATAL);
+
			goto keywords_cleanup;
		sbuf_printf(p->pre_deinstall_buf, "%s\n", cmd);
		free(cmd);
	}
@@ -931,7 +931,7 @@ apply_keyword_file(ucl_object_t *obj, struct plist *p, char *line, struct file_a
	if ((o = ucl_object_find_key(obj, "post-deinstall"))) {
		if (format_exec_cmd(&cmd, ucl_object_tostring(o), p->prefix,
		    p->last_file, line, argc, args) != EPKG_OK)
-
			return (EPKG_FATAL);
+
			goto keywords_cleanup;
		sbuf_printf(p->post_deinstall_buf, "%s\n", cmd);
		free(cmd);
	}
@@ -939,7 +939,7 @@ apply_keyword_file(ucl_object_t *obj, struct plist *p, char *line, struct file_a
	if ((o = ucl_object_find_key(obj, "pre-upgrade"))) {
		if (format_exec_cmd(&cmd, ucl_object_tostring(o), p->prefix,
		    p->last_file, line, argc, args) != EPKG_OK)
-
			return (EPKG_FATAL);
+
			goto keywords_cleanup;
		sbuf_printf(p->pre_deinstall_buf, "%s\n", cmd);
		free(cmd);
	}
@@ -947,7 +947,7 @@ apply_keyword_file(ucl_object_t *obj, struct plist *p, char *line, struct file_a
	if ((o = ucl_object_find_key(obj, "post-upgrade"))) {
		if (format_exec_cmd(&cmd, ucl_object_tostring(o), p->prefix,
		    p->last_file, line, argc, args) != EPKG_OK)
-
			return (EPKG_FATAL);
+
			goto keywords_cleanup;
		sbuf_printf(p->post_deinstall_buf, "%s\n", cmd);
		free(cmd);
	}
@@ -959,7 +959,7 @@ apply_keyword_file(ucl_object_t *obj, struct plist *p, char *line, struct file_a

			if (msg == NULL) {
				pkg_emit_errno("malloc", "struct pkg_message");
-
				return (EPKG_FATAL);
+
				goto keywords_cleanup;
			}

			msg->str = strdup(ucl_object_tostring(elt));
@@ -977,9 +977,11 @@ apply_keyword_file(ucl_object_t *obj, struct plist *p, char *line, struct file_a
		}
	}

+
	ret = EPKG_OK;
	if ((o = ucl_object_find_key(obj,  "actions")))
		ret = parse_actions(o, p, line, attr, argc, args);

+
keywords_cleanup:
	free(args);
	free(tofree);
	free_file_attr(freeattr);
@@ -1285,6 +1287,7 @@ ports_parse_plist(struct pkg *pkg, const char *plist, const char *stage)

	if ((plist_f = fopen(plist, "r")) == NULL) {
		pkg_emit_error("Unable to open plist file: %s", plist);
+
		plist_free(pplist);
		return (EPKG_FATAL);
	}

modified libpkg/pkg_repo_create.c
@@ -301,6 +301,7 @@ pkg_create_repo_worker(struct pkg_fts_item *start, size_t nelts,
	mfd = open(mlfile, O_APPEND|O_CREAT|O_WRONLY, 00644);
	if (mfd == -1) {
		pkg_emit_errno("pkg_create_repo_worker", "open");
+
		sbuf_delete(b);
		return (EPKG_FATAL);
	}

@@ -308,6 +309,7 @@ pkg_create_repo_worker(struct pkg_fts_item *start, size_t nelts,
		ffd = open(flfile, O_APPEND|O_CREAT|O_WRONLY, 00644);
		if (ffd == -1) {
			close(mfd);
+
			sbuf_delete(b);
			pkg_emit_errno("pkg_create_repo_worker", "open");
			return (EPKG_FATAL);
		}
@@ -946,12 +948,9 @@ pkg_repo_pack_db(const char *name, const char *archive, char *path,
		}

		if (packing_append_buffer(pack, sigret, "signature", siglen + 1) != EPKG_OK) {
-
			free(sigret);
			ret = EPKG_FATAL;
			goto out;
		}
-

-
		free(sigret);
	} else if (argc >= 1) {
		if (pkg_repo_sign(path, argv, argc, &sig, &pub) != EPKG_OK) {
			ret = EPKG_FATAL;
@@ -976,6 +975,7 @@ pkg_repo_pack_db(const char *name, const char *archive, char *path,
out:
	packing_finish(pack);
	unlink(path);
+
	free(sigret);
	if (sig != NULL)
		sbuf_delete(sig);
	if (pub != NULL)
modified libpkg/pkg_solve.c
@@ -702,8 +702,10 @@ pkg_solve_add_chain_rule(struct pkg_solve_problem *problem,
			RULE_ITEM_APPEND(rule, it);
			/* !Ay */
			it = pkg_solve_item_new(confvar);
-
			if (it == NULL)
+
			if (it == NULL) {
+
				pkg_solve_rule_free(rule);
				return (EPKG_FATAL);
+
			}

			it->inverse = -1;
			RULE_ITEM_APPEND(rule, it);
modified libpkg/scripts.c
@@ -86,8 +86,10 @@ pkg_script_run(struct pkg * const pkg, pkg_script type)
		{"POST-DEINSTALL", PKG_SCRIPT_DEINSTALL, PKG_SCRIPT_POST_DEINSTALL},
	};

-
	if (!pkg_object_bool(pkg_config_get("RUN_SCRIPTS")))
+
	if (!pkg_object_bool(pkg_config_get("RUN_SCRIPTS"))) {
+
		sbuf_delete(script_cmd);
		return (EPKG_OK);
+
	}

	for (i = 0; i < sizeof(map) / sizeof(map[0]); i++) {
		if (map[i].a == type)
modified src/audit.c
@@ -218,25 +218,30 @@ exec_audit(int argc, char **argv)
		ret = pkgdb_access(PKGDB_MODE_READ, PKGDB_DB_LOCAL);
		if (ret == EPKG_ENODB) {
			pkg_audit_free(audit);
+
			kh_destroy_pkgs(check);
			return (EX_OK);
		} else if (ret == EPKG_ENOACCESS) {
			warnx("Insufficient privileges to read the package database");
			pkg_audit_free(audit);
+
			kh_destroy_pkgs(check);
			return (EX_NOPERM);
		} else if (ret != EPKG_OK) {
			warnx("Error accessing the package database");
			pkg_audit_free(audit);
+
			kh_destroy_pkgs(check);
			return (EX_IOERR);
		}

		if (pkgdb_open(&db, PKGDB_DEFAULT) != EPKG_OK) {
			pkg_audit_free(audit);
+
			kh_destroy_pkgs(check);
			return (EX_IOERR);
		}

		if (pkgdb_obtain_lock(db, PKGDB_LOCK_READONLY) != EPKG_OK) {
			pkgdb_close(db);
			pkg_audit_free(audit);
+
			kh_destroy_pkgs(check);
			warnx("Cannot get a read lock on a database, it is locked by another process");
			return (EX_TEMPFAIL);
		}
@@ -260,6 +265,7 @@ exec_audit(int argc, char **argv)
		}
		if (ret != EX_OK) {
			pkg_audit_free(audit);
+
			kh_destroy_pkgs(check);
			return (ret);
		}
	}
modified src/register.c
@@ -160,6 +160,7 @@ exec_register(int argc, char **argv)
		default:
			warnx("Unrecognised option -%c\n", ch);
			usage_register();
+
			pkg_free(pkg);
			return (EX_USAGE);
		}
	}
modified src/rquery.c
@@ -211,20 +211,31 @@ exec_rquery(int argc, char **argv)
	ret = pkgdb_access(PKGDB_MODE_READ, PKGDB_DB_REPO);
	if (ret == EPKG_ENOACCESS) {
		warnx("Insufficient privileges to query the package database");
+
		if (sqlcond != NULL)
+
			sbuf_delete(sqlcond);
		return (EX_NOPERM);
-
	} else if (ret != EPKG_OK)
+
	} else if (ret != EPKG_OK) {
+
		if (sqlcond != NULL)
+
			sbuf_delete(sqlcond);
		return (EX_IOERR);
+
	}

	/* first update the remote repositories if needed */
	old_quiet = quiet;
	quiet = true;
-
	if (auto_update && (ret = pkgcli_update(false, false, reponame)) != EPKG_OK)
+
	if (auto_update && (ret = pkgcli_update(false, false, reponame)) != EPKG_OK) {
+
		if (sqlcond != NULL)
+
			sbuf_delete(sqlcond);
		return (ret);
+
	}
	quiet = old_quiet;

	ret = pkgdb_open_all(&db, PKGDB_REMOTE, reponame);
-
	if (ret != EPKG_OK)
+
	if (ret != EPKG_OK) {
+
		if (sqlcond != NULL)
+
			sbuf_delete(sqlcond);
		return (EX_IOERR);
+
	}

	if (index_output)
		query_flags = PKG_LOAD_BASIC|PKG_LOAD_CATEGORIES|PKG_LOAD_DEPS;
@@ -233,8 +244,11 @@ exec_rquery(int argc, char **argv)
		const char *condition_sql = NULL;
		if (match == MATCH_CONDITION && sqlcond)
			condition_sql = sbuf_data(sqlcond);
-
		if ((it = pkgdb_repo_query(db, condition_sql, match, reponame)) == NULL)
+
		if ((it = pkgdb_repo_query(db, condition_sql, match, reponame)) == NULL) {
+
			if (sqlcond != NULL)
+
				sbuf_delete(sqlcond);
			return (EX_IOERR);
+
		}

		while ((ret = pkgdb_it_next(it, &pkg, query_flags)) == EPKG_OK) {
			if (index_output)
@@ -251,8 +265,11 @@ exec_rquery(int argc, char **argv)
		for (i = (index_output ? 0 : 1); i < argc; i++) {
			pkgname = argv[i];

-
			if ((it = pkgdb_repo_query(db, pkgname, match, reponame)) == NULL)
+
			if ((it = pkgdb_repo_query(db, pkgname, match, reponame)) == NULL) {
+
				if (sqlcond != NULL)
+
					sbuf_delete(sqlcond);
				return (EX_IOERR);
+
			}

			while ((ret = pkgdb_it_next(it, &pkg, query_flags)) == EPKG_OK) {
				onematched = true;
@@ -273,6 +290,8 @@ exec_rquery(int argc, char **argv)
			retcode = EX_UNAVAILABLE;
	}

+
	if (sqlcond != NULL)
+
		sbuf_delete(sqlcond);
	pkg_free(pkg);
	pkgdb_close(db);

modified src/set.c
@@ -193,6 +193,7 @@ exec_set(int argc, char **argv)
	if ((argc < 1 && match != MATCH_ALL) ||
		(newautomatic == -1 && newvital == -1 && newvalue == NULL) ||
		(sets & (NAME|ORIGIN)) == (NAME|ORIGIN)) {
+
		free(newvalue);
		usage_set();
		return (EX_USAGE);
	}
modified src/version.c
@@ -336,8 +336,13 @@ hash_indexfile(const char *indexfilename)
		if (index == NULL)
			index = kh_init_index();
		k = kh_put_index(index, entry->origin, &ret);
-
		if (ret != 0)
+
		if (ret != 0) {
			kh_value(index, k) = entry;
+
		} else {
+
			free(entry->origin);
+
			free(entry->version);
+
			free(entry);
+
		}
	}

	free(line);