lib/repo: Do free space math under lock in error path
authorColin Walters <walters@verbum.org>
Mon, 18 Jun 2018 14:47:49 +0000 (14:47 +0000)
committerAtomic Bot <atomic-devel@projectatomic.io>
Tue, 19 Jun 2018 18:29:31 +0000 (18:29 +0000)
We were referencing the txn bits outside of the lock in the error
path. Generally shouldn't matter, but e.g. Rust wouldn't let us do this, and
race detector tooling will warn about it.

Closes: #1632
Approved by: jlebon

src/libostree/ostree-repo-commit.c

index 0642828c2442476ac6fe40d1a15089e36a7176a1..37be748bb5fb5e4fa9001db756f4c14776f5d2f4 100644 (file)
@@ -896,8 +896,9 @@ write_content_object (OstreeRepo         *self,
       const fsblkcnt_t object_blocks = (size / self->txn.blocksize) + 1;
       if (object_blocks > self->txn.max_blocks)
         {
+          guint64 bytes_required = (guint64)object_blocks * self->txn.blocksize;
           g_mutex_unlock (&self->txn_lock);
-          g_autofree char *formatted_required = g_format_size ((guint64)object_blocks * self->txn.blocksize);
+          g_autofree char *formatted_required = g_format_size (bytes_required);
           if (self->min_free_space_percent > 0)
             return glnx_throw (error, "min-free-space-percent '%u%%' would be exceeded, %s more required",
                                self->min_free_space_percent, formatted_required);
@@ -1609,8 +1610,9 @@ ostree_repo_prepare_transaction (OstreeRepo     *self,
         self->txn.max_blocks = bfree - reserved_blocks;
       else
         {
+          guint64 bytes_required = bfree * self->txn.blocksize;
           g_mutex_unlock (&self->txn_lock);
-          g_autofree char *formatted_free = g_format_size (bfree * self->txn.blocksize);
+          g_autofree char *formatted_free = g_format_size (bytes_required);
           if (self->min_free_space_percent > 0)
             return glnx_throw (error, "min-free-space-percent '%u%%' would be exceeded, %s available",
                                self->min_free_space_percent, formatted_free);