[glib/wip/2-58-cve-2021-28153] glocalfileoutputstream: Tidy up error handling



commit af39d83fc71408bca50f2cb3739099f36139281b
Author: Philip Withnall <pwithnall endlessos org>
Date:   Tue Mar 16 11:36:27 2021 +0000

    glocalfileoutputstream: Tidy up error handling
    
    After the recent reworking of this code it was possible for `g_close()`
    to be called on `fd == -1`, which is invalid. It would have reported an
    error, were errors not ignored. So it was harmless, but still best to
    fix.
    
    Simplify the error handling by combining both error labels and checking
    the state of `fd` dynamically.
    
    Coverity CID: #1450834
    
    Signed-off-by: Philip Withnall <pwithnall endlessos org>
    (cherry picked from commit c4b4fecaef5fa6eac63569513511ba6f8674548a)

 gio/glocalfileoutputstream.c | 33 +++++++++++++++++----------------
 1 file changed, 17 insertions(+), 16 deletions(-)
---
diff --git a/gio/glocalfileoutputstream.c b/gio/glocalfileoutputstream.c
index fff2439b9..8d7eadd95 100644
--- a/gio/glocalfileoutputstream.c
+++ b/gio/glocalfileoutputstream.c
@@ -829,7 +829,7 @@ handle_overwrite_open (const char    *filename,
                   _("Error when getting information for file ā€œ%sā€: %s"),
                   display_name, g_strerror (errsv));
       g_free (display_name);
-      goto err_out;
+      goto error;
     }
   
   /* not a regular file */
@@ -841,7 +841,7 @@ handle_overwrite_open (const char    *filename,
                                G_IO_ERROR,
                                G_IO_ERROR_IS_DIRECTORY,
                                _("Target file is a directory"));
-          goto err_out;
+          goto error;
         }
       else if (!is_symlink ||
 #ifdef S_ISLNK
@@ -855,7 +855,7 @@ handle_overwrite_open (const char    *filename,
                              G_IO_ERROR,
                              G_IO_ERROR_NOT_REGULAR_FILE,
                              _("Target file is not a regular file"));
-          goto err_out;
+          goto error;
         }
     }
   
@@ -869,7 +869,7 @@ handle_overwrite_open (const char    *filename,
                                G_IO_ERROR_WRONG_ETAG,
                                _("The file was externally modified"));
          g_free (current_etag);
-         goto err_out;
+          goto error;
        }
       g_free (current_etag);
     }
@@ -962,7 +962,7 @@ handle_overwrite_open (const char    *filename,
                                G_IO_ERROR_CANT_CREATE_BACKUP,
                                _("Backup file creation failed"));
          g_free (backup_filename);
-         goto err_out;
+          goto error;
        }
 
       bfd = g_open (backup_filename,
@@ -976,7 +976,7 @@ handle_overwrite_open (const char    *filename,
                                G_IO_ERROR_CANT_CREATE_BACKUP,
                                _("Backup file creation failed"));
          g_free (backup_filename);
-         goto err_out;
+          goto error;
        }
 
       /* If needed, Try to set the group of the backup same as the
@@ -993,7 +993,7 @@ handle_overwrite_open (const char    *filename,
          g_unlink (backup_filename);
          g_close (bfd, NULL);
          g_free (backup_filename);
-         goto err_out;
+          goto error;
        }
       
       if ((original_stat.st_gid != tmp_statbuf.st_gid)  &&
@@ -1010,7 +1010,7 @@ handle_overwrite_open (const char    *filename,
              g_unlink (backup_filename);
              g_close (bfd, NULL);
              g_free (backup_filename);
-             goto err_out;
+              goto error;
            }
        }
 #endif
@@ -1025,7 +1025,7 @@ handle_overwrite_open (const char    *filename,
           g_close (bfd, NULL);
          g_free (backup_filename);
          
-         goto err_out;
+          goto error;
        }
       
       g_close (bfd, NULL);
@@ -1040,7 +1040,7 @@ handle_overwrite_open (const char    *filename,
                       g_io_error_from_errno (errsv),
                       _("Error seeking in file: %s"),
                       g_strerror (errsv));
-         goto err_out;
+          goto error;
        }
     }
 
@@ -1056,7 +1056,7 @@ handle_overwrite_open (const char    *filename,
                       g_io_error_from_errno (errsv),
                       _("Error removing old file: %s"),
                       g_strerror (errsv));
-         goto err_out2;
+          goto error;
        }
 
       if (readable)
@@ -1073,7 +1073,7 @@ handle_overwrite_open (const char    *filename,
                       _("Error opening file ā€œ%sā€: %s"),
                       display_name, g_strerror (errsv));
          g_free (display_name);
-         goto err_out2;
+          goto error;
        }
     }
   else
@@ -1091,15 +1091,16 @@ handle_overwrite_open (const char    *filename,
                         g_io_error_from_errno (errsv),
                         _("Error truncating file: %s"),
                         g_strerror (errsv));
-           goto err_out;
+            goto error;
          }
     }
     
   return fd;
 
- err_out:
-  g_close (fd, NULL);
- err_out2:
+error:
+  if (fd >= 0)
+    g_close (fd, NULL);
+
   return -1;
 }
 


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