[Midnightbsd-cvs] src [7745] trunk/lib/libmport/bundle_read_install_pkg.c: fix locking
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Tue Aug 16 23:07:00 EDT 2016
Revision: 7745
http://svnweb.midnightbsd.org/src/?rev=7745
Author: laffer1
Date: 2016-08-16 23:06:59 -0400 (Tue, 16 Aug 2016)
Log Message:
-----------
fix locking
Modified Paths:
--------------
trunk/lib/libmport/bundle_read_install_pkg.c
Modified: trunk/lib/libmport/bundle_read_install_pkg.c
===================================================================
--- trunk/lib/libmport/bundle_read_install_pkg.c 2016-08-17 02:42:15 UTC (rev 7744)
+++ trunk/lib/libmport/bundle_read_install_pkg.c 2016-08-17 03:06:59 UTC (rev 7745)
@@ -346,7 +346,7 @@
char *mode = NULL;
char *mkdirp = NULL;
struct stat sb;
- char file[FILENAME_MAX], cwd[FILENAME_MAX], dir[FILENAME_MAX];
+ __block char file[FILENAME_MAX], cwd[FILENAME_MAX];
__block sqlite3_stmt *insert = NULL;
/* sadly, we can't just use abs pathnames, because it will break hardlinks */
@@ -380,6 +380,8 @@
if (mport_chdir(mport, cwd) != MPORT_OK)
goto ERROR;
+ mport_db_do(mport->db, "BEGIN TRANSACTION");
+
STAILQ_FOREACH(e, alist, next) {
switch (e->type) {
case ASSET_CWD:
@@ -560,7 +562,10 @@
/* insert this asset into the master database */
__block int code = MPORT_OK;
__block const char *err;
+ __block char *filePtr = strdup(file);
+ __block char *cwdPtr = strdup(cwd);
dispatch_sync(mportSQLSerial, ^{
+ char dir[FILENAME_MAX];
if (sqlite3_bind_int(insert, 1, (int) e->type) != SQLITE_OK) {
code = MPORT_ERR_FATAL;
err = sqlite3_errmsg(mport->db);
@@ -569,7 +574,7 @@
if (e->type == ASSET_FILE || e->type == ASSET_SAMPLE || e->type == ASSET_SHELL ||
e->type == ASSET_FILE_OWNER_MODE) {
/* don't put the root in the database! */
- if (sqlite3_bind_text(insert, 2, file + strlen(mport->root), -1, SQLITE_STATIC) != SQLITE_OK) {
+ if (sqlite3_bind_text(insert, 2, filePtr + strlen(mport->root), -1, SQLITE_STATIC) != SQLITE_OK) {
code = MPORT_ERR_FATAL;
err = sqlite3_errmsg(mport->db);
return;
@@ -627,7 +632,7 @@
if (e->data != NULL && e->data[0] == '/')
(void) snprintf(dir, FILENAME_MAX, "%s", e->data);
else
- (void) snprintf(dir, FILENAME_MAX, "%s/%s", cwd, e->data);
+ (void) snprintf(dir, FILENAME_MAX, "%s/%s", cwdPtr, e->data);
if (sqlite3_bind_text(insert, 2, dir, -1, SQLITE_STATIC) != SQLITE_OK) {
code = MPORT_ERR_FATAL;
@@ -699,29 +704,34 @@
sqlite3_reset(insert);
});
+ free(filePtr);
+ free(cwdPtr);
if (code != MPORT_OK) {
SET_ERROR(code, err);
goto ERROR;
}
- }
+ }
- sqlite3_finalize(insert);
+ if (mport_db_do(mport->db, "COMMIT") != MPORT_OK) {
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
+ goto ERROR;
+ }
+ sqlite3_finalize(insert);
mport_pkgmeta_logevent(mport, pkg, "Installed");
- (mport->progress_free_cb)();
- (void) mport_chdir(NULL, orig_cwd);
- free(orig_cwd);
+ (mport->progress_free_cb)();
+ (void) mport_chdir(NULL, orig_cwd);
+ free(orig_cwd);
mport_assetlist_free(alist);
- return MPORT_OK;
+ return (MPORT_OK);
- ERROR:
- sqlite3_finalize(insert);
- (mport->progress_free_cb)();
- free(orig_cwd);
- mport_assetlist_free(alist);
- //rollback();
- RETURN_CURRENT_ERROR;
+ERROR:
+ sqlite3_finalize(insert);
+ (mport->progress_free_cb)();
+ free(orig_cwd);
+ mport_assetlist_free(alist);
+ RETURN_CURRENT_ERROR;
}
More information about the Midnightbsd-cvs
mailing list