rfc: handle broken /proc/swaps

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

 



i dont see any mention of this issue in the util-linux-ng archives (or i cant 
search), but linux-2.6.19 and older had a bug in the /proc/swaps code where 
the header would not be displayed (the first line).  most people report the 
issue as a sequence of swapon/swapoff calls to trigger, but for some "lucky" 
reason it triggers for me all the time (no swap calls).

there are two aspects to the issue ... the first of which i think we should 
handle while i'm on the fence about the second.

first, i dont think we should whine about unexpected format if the file is 
empty (the default at boot).  this is easy to do by putting the warning behind 
a check to ferror().

second, we could detect that the first line we read isnt actually the header 
but instead is a valid swap line and so needs processing.  this relies on the 
assumption that the first line will always be the same format.  looking 
quickly at older versions shows that this header has retained its exact format 
since at least linux-2.2.0 and considering the concern that goes along with 
/proc/ files and the ABI, it's highly unlikely it will ever change.

diff --git a/mount/swapon.c b/mount/swapon.c
index 55933b1..d89c6a9 100644
--- a/mount/swapon.c
+++ b/mount/swapon.c
@@ -135,11 +135,18 @@ read_proc_swaps(void) {
 
 	/* skip the first line */
 	if (!fgets(line, sizeof(line), swaps)) {
-		warnx(_("%s: unexpected file format"), _PATH_PROC_SWAPS);
+		/* do not whine about an empty file */
+		if (ferror(swaps))
+			warn(_("%s: unexpected file format"), _PATH_PROC_SWAPS);
 		fclose(swaps);
 		return;
 	}
+	/* make sure the first line is the header */
+	if (line[0] != '\0' && strncmp(line, "Filename\t", 9))
+		goto valid_first_line;
+
 	while (fgets(line, sizeof(line), swaps)) {
+ valid_first_line:
 		/*
 		 * Cut the line "swap_device  ... more info" after device.
 		 * This will fail with names with embedded spaces.
-mike

Attachment: signature.asc
Description: This is a digitally signed message part.


[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux