Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
plug resource leaks in case of errors
Baptiste Daroussin committed 10 years ago
commit e3780c399489d14d55545e287aecf837bfcace35
parent 596a372455ae8a2c0e28a77717ea21d92969e0d8
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);