[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