Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
Fix pkg delete trying to remove directories it should not
Baptiste Daroussin committed 11 years ago
commit c7a364972a11025c945e10eec7e489377314052d
parent 2c0cf0fae1dfdd6ec283109aaed9500499343413
2 files changed +10 -5
modified libpkg/pkg_delete.c
@@ -158,8 +158,13 @@ rmdir_p(struct pkgdb *db, struct pkg *pkg, char *dir, const char *prefix_r)
	char *tmp;
	int64_t cnt;
	char fullpath[MAXPATHLEN];
+
	size_t len;

-
	snprintf(fullpath, sizeof(fullpath), "/%s", dir);
+
	len = snprintf(fullpath, sizeof(fullpath), "/%s", dir);
+
	while (fullpath[len -1] == '/') {
+
		fullpath[len - 1] = '\0';
+
		len--;
+
	}
	if (pkgdb_is_dir_used(db, pkg, fullpath, &cnt) != EPKG_OK)
		return;

@@ -176,7 +181,7 @@ rmdir_p(struct pkgdb *db, struct pkg *pkg, char *dir, const char *prefix_r)
	if (strcmp(prefix_r, dir) == 0)
		return;

-
	pkg_debug(1, "removing directory %s", dir);
+
	pkg_debug(1, "removing directory %s", fullpath);
	if (unlinkat(pkg->rootfd, dir, AT_REMOVEDIR) == -1 &&
	    errno != ENOTEMPTY && errno != EBUSY) {
		pkg_emit_errno("unlinkat", dir);
@@ -207,7 +212,7 @@ pkg_effective_rmdir(struct pkgdb *db, struct pkg *pkg)
	char prefix_r[MAXPATHLEN];
	size_t i;

-
	snprintf(prefix_r, sizeof(prefix_r), "%s/", pkg->prefix + 1);
+
	snprintf(prefix_r, sizeof(prefix_r), "%s", pkg->prefix + 1);
	for (i = 0; i < pkg->dir_to_del_len; i++)
		rmdir_p(db, pkg, pkg->dir_to_del[i], prefix_r);
}
modified libpkg/pkgdb.c
@@ -2994,7 +2994,7 @@ pkgdb_is_dir_used(struct pkgdb *db, struct pkg *p, const char *dir, int64_t *res
	const char sql[] = ""
		"SELECT count(package_id) FROM pkg_directories, directories "
		"WHERE directory_id = directories.id AND directories.path = ?1 "
-
		"AND package_id != (SELECT id from PACKAGES where name=?2);";
+
		"AND package_id != ?2;";

	if (sqlite3_prepare_v2(db->sqlite, sql, -1, &stmt, NULL) != SQLITE_OK) {
		ERROR_SQLITE(db->sqlite, sql);
@@ -3002,7 +3002,7 @@ pkgdb_is_dir_used(struct pkgdb *db, struct pkg *p, const char *dir, int64_t *res
	}

	sqlite3_bind_text(stmt, 1, dir, -1, SQLITE_TRANSIENT);
-
	sqlite3_bind_text(stmt, 2, p->name, -1, SQLITE_TRANSIENT);
+
	sqlite3_bind_int64(stmt, 2, p->id);

	ret = sqlite3_step(stmt);