Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Plug some memory leaks
Baptiste Daroussin committed 10 years ago
commit c0ea7069466cab37c590e5240005383066fad722
parent 26f5a05
13 files changed +58 -25
modified libpkg/pkg.c
@@ -607,7 +607,7 @@ pkg_adduser(struct pkg *pkg, const char *name)
	}

	storename = strdup(name);
-
	kh_add(strings, pkg->users, storename, storename);
+
	kh_add(strings, pkg->users, storename, storename, free);

	return (EPKG_OK);
}
@@ -631,7 +631,7 @@ pkg_addgroup(struct pkg *pkg, const char *name)
	}

	storename = strdup(name);
-
	kh_add(strings, pkg->groups, storename, storename);
+
	kh_add(strings, pkg->groups, storename, storename, free);

	return (EPKG_OK);
}
@@ -667,7 +667,7 @@ pkg_adddep(struct pkg *pkg, const char *name, const char *origin, const char *ve
	d->uid = strdup(name);
	d->locked = locked;

-
	kh_add(pkg_deps, pkg->deps, d, d->name);
+
	kh_add(pkg_deps, pkg->deps, d, d->name, pkg_dep_free);

	return (EPKG_OK);
}
@@ -691,7 +691,7 @@ pkg_addrdep(struct pkg *pkg, const char *name, const char *origin, const char *v
	d->uid = strdup(name);
	d->locked = locked;

-
	kh_add(pkg_deps, pkg->rdeps, d, d->name);
+
	kh_add(pkg_deps, pkg->rdeps, d, d->name, pkg_dep_free);

	return (EPKG_OK);
}
@@ -744,7 +744,7 @@ pkg_addfile_attr(struct pkg *pkg, const char *path, const char *sum,
	if (fflags != 0)
		f->fflags = fflags;

-
	kh_add(pkg_files, pkg->filehash, f, f->path);
+
	kh_add(pkg_files, pkg->filehash, f, f->path, pkg_file_free);
	DL_APPEND(pkg->files, f);

	return (EPKG_OK);
@@ -773,7 +773,7 @@ pkg_addconfig_file(struct pkg *pkg, const char *path, const char *content)
	if (content != NULL)
		f->content = strdup(content);

-
	kh_add(pkg_config_files, pkg->config_files, f, f->path);
+
	kh_add(pkg_config_files, pkg->config_files, f, f->path, pkg_config_file_free);

	return (EPKG_OK);
}
@@ -799,7 +799,7 @@ pkg_addstring(kh_strings_t **list, const char *val, const char *title)
	}

	store = strdup(val);
-
	kh_add(strings, *list, store, store);
+
	kh_add(strings, *list, store, store, free);

	return (EPKG_OK);
}
@@ -847,7 +847,7 @@ pkg_adddir_attr(struct pkg *pkg, const char *path, const char *uname,
	if (fflags != 0)
		d->fflags = fflags;

-
	kh_add(pkg_dirs, pkg->dirhash, d, d->path);
+
	kh_add(pkg_dirs, pkg->dirhash, d, d->path, pkg_dir_free);
	DL_APPEND(pkg->dirs, d);

	return (EPKG_OK);
@@ -1120,7 +1120,7 @@ pkg_addshlib_required(struct pkg *pkg, const char *name)
		return (EPKG_OK);

	storename = strdup(name);
-
	kh_add(strings, pkg->shlibs_required, storename, storename);
+
	kh_add(strings, pkg->shlibs_required, storename, storename, free);

	pkg_debug(3, "added shlib deps for %s on %s", pkg->name, name);

@@ -1144,7 +1144,7 @@ pkg_addshlib_provided(struct pkg *pkg, const char *name)
		return (EPKG_OK);

	storename = strdup(name);
-
	kh_add(strings, pkg->shlibs_provided, storename, storename);
+
	kh_add(strings, pkg->shlibs_provided, storename, storename, free);

	pkg_debug(3, "added shlib provide %s for %s", name, pkg->name);

@@ -1187,7 +1187,7 @@ pkg_addrequire(struct pkg *pkg, const char *name)

	storename = strdup(name);

-
	kh_add(strings, pkg->requires, storename, storename);
+
	kh_add(strings, pkg->requires, storename, storename, free);

	return (EPKG_OK);
}
@@ -1206,7 +1206,7 @@ pkg_addprovide(struct pkg *pkg, const char *name)

	storename = strdup(name);

-
	kh_add(strings, pkg->provides, storename, storename);
+
	kh_add(strings, pkg->provides, storename, storename, free);

	return (EPKG_OK);
}
modified libpkg/pkg_add.c
@@ -383,6 +383,7 @@ cleanup:

	pkg_emit_progress_tick(nfiles, nfiles);
	pkg_emit_extract_finished(pkg);
+
	sbuf_delete(newconf);

	if (renamed && retcode == EPKG_FATAL) {
#ifdef HAVE_CHFLAGS
modified libpkg/pkg_create.c
@@ -98,8 +98,10 @@ pkg_create_from_dir(struct pkg *pkg, const char *root,

		file->sum = pkg_checksum_generate_file(fpath,
		    PKG_HASH_TYPE_SHA256_HEX);
-
		if (file->sum == NULL)
+
		if (file->sum == NULL) {
+
			kh_destroy_hardlinks(hardlinks);
			return (EPKG_FATAL);
+
		}

		counter_count();
	}
modified libpkg/pkg_deps.c
@@ -367,6 +367,8 @@ pkg_deps_parse_formula(const char *in)
		default:
			pkg_emit_error("cannot parse pkg formula: %s", in);
			pkg_deps_formula_free(res);
+
			free(cur_item->name);
+
			free(cur_item);

			return (NULL);

modified libpkg/pkg_jobs_universe.c
@@ -230,7 +230,7 @@ pkg_jobs_universe_add_pkg(struct pkg_jobs_universe *universe, struct pkg *pkg,
	DL_APPEND(tmp, item);

	if (seen == NULL)
-
		kh_add(pkg_jobs_seen, universe->seen, item, item->pkg->digest);
+
		kh_safe_add(pkg_jobs_seen, universe->seen, item, item->pkg->digest);

	universe->nitems++;

modified libpkg/pkg_manifest.c
@@ -1244,6 +1244,9 @@ pkg_emit_object(struct pkg *pkg, short flags)
			"messages", sizeof("messages") - 1, false);
	}

+
	if (tmpsbuf != NULL)
+
		sbuf_delete(tmpsbuf);
+

	return (top);
}

modified libpkg/pkg_ports.c
@@ -1138,6 +1138,7 @@ parse_keywords(struct plist *plist, char *keyword, char *line)
			if (ret != EPKG_OK)
				return (ret);
		}
+
		free_file_attr(attr);
		return (ret);
	}

modified libpkg/pkg_solve.c
@@ -519,8 +519,11 @@ pkg_solve_add_require_rule(struct pkg_solve_problem *problem,
		/* B1 | B2 | ... */
		cnt = 1;
		LL_FOREACH(prhead, pr) {
-
			if (pkg_solve_handle_provide(problem, pr, rule, pkg, &cnt) != EPKG_OK)
+
			if (pkg_solve_handle_provide(problem, pr, rule, pkg, &cnt) != EPKG_OK) {
+
				free(it);
+
				free(rule);
				return (EPKG_FATAL);
+
			}
		}

		if (cnt > 1) {
modified libpkg/private/pkg.h
@@ -184,13 +184,24 @@

#define kh_count(h) ((h)?((h)->size):0)

-
#define kh_add(name, h, val, k) do {		\
-
	int __ret;				\
-
	khint_t __i;				\
-
	if (!h) h = kh_init_##name();		\
-
	__i = kh_put_##name(h, k, &__ret);	\
-
	if (__ret != 0)				\
-
		kh_val(h, __i) = val;		\
+
#define kh_safe_add(name, h, val, k) do {		\
+
	int __ret;					\
+
	khint_t __i;					\
+
	if (!h) h = kh_init_##name();			\
+
	__i = kh_put_##name(h, k, &__ret);		\
+
	if (__ret != 0)					\
+
		kh_val(h, __i) = val;			\
+
} while (0)
+

+
#define kh_add(name, h, val, k, free_func) do {		\
+
	int __ret;					\
+
	khint_t __i;					\
+
	if (!h) h = kh_init_##name();			\
+
	__i = kh_put_##name(h, k, &__ret);		\
+
	if (__ret != 0)					\
+
		kh_val(h, __i) = val;			\
+
	else						\
+
		free_func(val);				\
} while (0)


modified src/annotate.c
@@ -318,6 +318,8 @@ exec_annotate(int argc, char **argv)

	retcode = pkgdb_open(&db, PKGDB_DEFAULT);
	if (retcode != EPKG_OK) {
+
		if (input != NULL)
+
			sbuf_delete(input);
		return (EX_IOERR);
	}

modified src/register.c
@@ -170,10 +170,12 @@ exec_register(int argc, char **argv)
			       PKGDB_DB_LOCAL);
	if (retcode == EPKG_ENOACCESS) {
		warnx("Insufficient privileges to register packages");
+
		pkg_free(pkg);
		return (EX_NOPERM);
-
	} else if (retcode != EPKG_OK)
+
	} else if (retcode != EPKG_OK) {
+
		pkg_free(pkg);
		return (EX_IOERR);
-
	else
+
	} else
		retcode = EX_OK;

	/*
modified src/rquery.c
@@ -201,8 +201,10 @@ exec_rquery(int argc, char **argv)

	if (condition != NULL) {
		sqlcond = sbuf_new_auto();
-
		if (format_sql_condition(condition, sqlcond, true) != EPKG_OK)
+
		if (format_sql_condition(condition, sqlcond, true) != EPKG_OK) {
+
			sbuf_delete(sqlcond);
			return (EX_USAGE);
+
		}
		sbuf_finish(sqlcond);
	}

modified src/updating.c
@@ -192,16 +192,19 @@ exec_updating(int argc, char **argv)
				SLIST_FOREACH(port, &origins, next) {
					if (caseinsensitive) {
						if ((tmp = strcasestr(line, port->origin)) != NULL) {
+
							free(dateline);
							break;
						}
					} else {
						if ((tmp = strstr(line, port->origin)) != NULL) {
+
							free(dateline);
							break;
						}
					}
				}
				if (tmp != NULL) {
					if ((date != NULL) && strncmp(dateline, date, 8) < 0)
+
						free(dateline);
						continue;
					printf("%s%s",dateline, line);
					found = 1;
@@ -210,6 +213,7 @@ exec_updating(int argc, char **argv)
		} else {
			printf("%s",line);
		}
+
		free(dateline);
	}
	fclose(fd);