[PATCH]: lib/fs/libdevmapper.c corner cases

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

 



Here are a couple more fixes I made before I realized that
the affected file isn't even compiled, and when I compile it manually,
I see it lacks a declaration for log_error (missing #include "log.h"?).

For the final hunk, it'd be good to avoid sscanf altogether,
but if you do continue to use it, be sure to have one more
byte in the buffer than the length specified in the format string.

2007-03-12  Jim Meyering  <jim@xxxxxxxxxxxx>

	* lib/fs/libdevmapper.c (do_suspend): Detect write failure reliably.
	(do_load): Likewise.
	(find_mount_point): Avoid buffer overrun for unusually long inputs.

Index: lib/fs/libdevmapper.c
===================================================================
RCS file: /cvs/dm/device-mapper/lib/fs/libdevmapper.c,v
retrieving revision 1.13
diff -u -p -r1.13 libdevmapper.c
--- lib/fs/libdevmapper.c	30 Mar 2004 19:08:57 -0000	1.13
+++ lib/fs/libdevmapper.c	12 Mar 2007 15:00:47 -0000
@@ -145,12 +145,20 @@ static int do_suspend(char *mnt, char *n
 		return 0;

 	if ((fp = fopen(path, "w"))) {
+		int write_failed_errno = 0;
 		c = on ? '1' : '0';
-		if (fputc(c, fp) == (int)c)
-			ret = 1;
-		else
-			log_error("%s: fputc failed: %s", path, strerror(errno));
-		fclose(fp);
+		if (fputc(c, fp) == EOF) {
+			write_failed_errno = errno;
+			fclose(fp);
+		} else {
+			if (fclose(fp) == 0)
+				ret = 1;
+			else
+				write_failed_errno = errno;
+		}
+		if (write_failed_errno)
+			log_error("%s: write failed: %s", path,
+				  strerror(write_failed_errno));
 	} else
 		log_error("%s: fopen failed: %s", path, strerror(errno));

@@ -286,9 +294,17 @@ static int do_load(char *mnt, char *name
 		return 0;

 	if ((fd = open(path, O_RDWR)) != -1) {
-		if (!(ret = write_data(fd, dmt)))
-			log_error("%s: write failed: %s", path, strerror(errno));
-		close(fd);
+		int write_failed_errno = 0;
+		if (!(ret = write_data(fd, dmt))) {
+			write_failed_errno = errno;
+			close(fd);
+		} else {
+			if (close(fd) != 0)
+				write_failed_errno = errno;
+		}
+		if (write_failed_errno)
+			log_error("%s: write failed: %s", path,
+				  strerror(write_failed_errno));
 	}

 	free(path);
@@ -333,8 +349,8 @@ static int do_error_check(char *mnt, cha
 static char *find_mount_point(void)
 {
 	FILE *fp;
-	static char mpoint[4096];
-	char fstype[30];
+	static char mpoint[4097];
+	char fstype[31];

 	if (!(fp = fopen("/proc/mounts", "r"))) {
 		log_error("/proc/mounts: fopen failed: %s", strerror(errno));

--
dm-devel mailing list
dm-devel@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/dm-devel

[Index of Archives]     [DM Crypt]     [Fedora Desktop]     [ATA RAID]     [Fedora Marketing]     [Fedora Packaging]     [Fedora SELinux]     [Yosemite Discussion]     [KDE Users]     [Fedora Docs]

  Powered by Linux