]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
quota: fix memory leak in quota_compare_and_update()
authorTheodore Ts'o <tytso@mit.edu>
Sat, 10 May 2014 21:29:18 +0000 (17:29 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 13 May 2014 14:12:57 +0000 (10:12 -0400)
The quota_handle wasn't getting closed in quota_compare_and_update().
Fix this, and also make sure that quota_file_close() doesn't
unnecessarily modify the quota inode if it's not necessary.  Otherwise
e2fsck will claim that the file system is modified when it didn't need
to be.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Reviewed-by: Aditya Kali <adityakali@google.com>
lib/quota/mkquota.c
lib/quota/quotaio.c

index f5ae0e00e63de46a6fdb8f175707ee1add2174ad..ed10890a705e7f18f476d8cd7200be9a6831a34e 100644 (file)
@@ -597,7 +597,7 @@ errcode_t quota_compare_and_update(quota_ctx_t qctx, int qtype,
        err = qh.qh_ops->scan_dquots(&qh, scan_dquots_callback, &scan_data);
        if (err) {
                log_err("Error scanning dquots");
-               goto out;
+               goto out_close_qh;
        }
 
        for (n = dict_first(dict); n; n = dict_next(dict, n)) {
@@ -612,6 +612,13 @@ errcode_t quota_compare_and_update(quota_ctx_t qctx, int qtype,
        }
        *usage_inconsistent = scan_data.usage_is_inconsistent;
 
+out_close_qh:
+       err = quota_file_close(&qh);
+       if (err) {
+               log_err("Cannot close quotafile: %s", error_message(errno));
+               if (qh.qh_qf.e2_file)
+                       ext2fs_file_close(qh.qh_qf.e2_file);
+       }
 out:
        return err;
 }
index 7e98ed751ea0402eb76be762fc94c5eba467947b..a95a1f9e0b8bd10f7877794117641c03aa7611c1 100644 (file)
@@ -356,9 +356,14 @@ errcode_t quota_file_close(struct quota_handle *h)
        if (h->qh_ops->end_io && h->qh_ops->end_io(h) < 0)
                return -1;
        if (h->qh_qf.e2_file) {
+               __u64 new_size, size;
+
+               new_size = compute_inode_size(h->qh_qf.fs, h->qh_qf.ino);
                ext2fs_file_flush(h->qh_qf.e2_file);
-               ext2fs_file_set_size2(h->qh_qf.e2_file,
-                       compute_inode_size(h->qh_qf.fs, h->qh_qf.ino));
+               if (ext2fs_file_get_lsize(h->qh_qf.e2_file, &size))
+                       new_size = 0;
+               if (size != new_size)
+                       ext2fs_file_set_size2(h->qh_qf.e2_file, new_size);
                ext2fs_file_close(h->qh_qf.e2_file);
        }