[gegl] buffer: in swap backend, free block when failing to set write offset



commit 8eb0c4105e54f369a1e54949489cab5eaa3fe1f7
Author: Ell <ell_se yahoo com>
Date:   Sun Mar 15 23:08:14 2020 +0200

    buffer: in swap backend, free block when failing to set write offset
    
    In addition to last commit, also free the block when failing to set
    the file offset while writing a tile, in which case nothing is
    written, to avoid reading back junk data, causing a segfault with
    RLE compression.

 gegl/buffer/gegl-tile-backend-swap.c | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)
---
diff --git a/gegl/buffer/gegl-tile-backend-swap.c b/gegl/buffer/gegl-tile-backend-swap.c
index 7adb1140b..c66cd2914 100644
--- a/gegl/buffer/gegl-tile-backend-swap.c
+++ b/gegl/buffer/gegl-tile-backend-swap.c
@@ -625,7 +625,8 @@ gegl_tile_backend_swap_write (ThreadParams *params)
       if (lseek (out_fd, offset, SEEK_SET) < 0)
         {
           g_warning ("unable to seek to tile in buffer: %s", g_strerror (errno));
-          return;
+
+          goto error;
         }
       out_offset = offset;
     }
@@ -638,14 +639,13 @@ gegl_tile_backend_swap_write (ThreadParams *params)
       wrote = write (out_fd, data, to_be_written);
       if (wrote <= 0)
         {
-          g_atomic_pointer_add (&total_uncompressed, -params->size);
-
-          gegl_tile_backend_swap_free_block (params->block);
+          writing = FALSE;
 
           g_message ("unable to write tile data to self: "
                      "%s (%d/%d bytes written)",
                      g_strerror (errno), wrote, to_be_written);
-          break;
+
+          goto error;
         }
 
       data          += wrote;
@@ -658,6 +658,15 @@ gegl_tile_backend_swap_write (ThreadParams *params)
   writing = FALSE;
 
   GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "writer thread wrote at %i", (gint)offset);
+
+  return;
+
+error:
+  g_atomic_pointer_add (&total_uncompressed, -params->size);
+
+  gegl_tile_backend_swap_free_block (params->block);
+
+  return;
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]