Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Fix pkg delete trying to remove directories it should not
Baptiste Daroussin committed 11 years ago
commit c7a364972a11025c945e10eec7e489377314052d
parent 2c0cf0f
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);