Просмотр исходного кода

libdpkg: Fix TOCTOU race in triggers database loading

This is not security sensitive.

Warned-by: coverity
Guillem Jover лет назад: 12
Родитель
Сommit
4f8369c744
2 измененных файлов с 14 добавлено и 14 удалено
  1. 1 0
      debian/changelog
  2. 13 14
      lib/dpkg/trigdeferred.l

+ 1 - 0
debian/changelog

@@ -10,6 +10,7 @@ dpkg (1.17.10) UNRELEASED; urgency=low
   * Fix memory leaks in buffer_copy() on error conditions.
   * Test suite:
     - Improve C code coverage.
+  * Fix non-security sensitive TOCTOU race in triggers database loading.
 
   [ Updated manpages translations ]
   * German (Helge Kreutzmann).

+ 13 - 14
lib/dpkg/trigdeferred.l

@@ -121,9 +121,6 @@ constructfn(struct varbuf *vb, const char *dir, const char *tail)
 enum trigdef_update_status
 trigdef_update_start(enum trigdef_updateflags uf)
 {
-	struct stat stab;
-	int r;
-
 	triggersdir = dpkg_db_get_path(TRIGGERSDIR);
 
 	if (uf & tduf_write) {
@@ -146,17 +143,6 @@ trigdef_update_start(enum trigdef_updateflags uf)
 	}
 
 	constructfn(&fn, triggersdir, TRIGGERSDEFERREDFILE);
-	r = stat(fn.buf, &stab);
-	if (r) {
-		if (errno != ENOENT)
-			ohshite(_("unable to stat triggers deferred file `%.250s'"),
-			        fn.buf);
-	} else if (!stab.st_size) {
-		if (!(uf & tduf_writeifempty)) {
-			pop_cleanup(ehflag_normaltidy);
-			return tdus_error_empty_deferred;
-		}
-	}
 
 	if (old_deferred)
 		fclose(old_deferred);
@@ -169,6 +155,19 @@ trigdef_update_start(enum trigdef_updateflags uf)
 			pop_cleanup(ehflag_normaltidy);
 			return tdus_error_no_deferred;
 		}
+	} else {
+		struct stat stab;
+		int rc;
+
+		rc = fstat(fileno(old_deferred), &stab);
+		if (rc < 0)
+			ohshite(_("unable to stat triggers deferred file `%.250s'"),
+			        fn.buf);
+
+		if (stab.st_size == 0 && !(uf & tduf_writeifempty)) {
+			pop_cleanup(ehflag_normaltidy);
+			return tdus_error_empty_deferred;
+		}
 	}
 
 	if (uf & tduf_write) {