[linux-pm] [PATCH] suspend.c: make sure stdin, stdout and stderr are open

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

 



On Friday 24 March 2006 21:36, Rafael J. Wysocki wrote:
> On Friday 24 March 2006 20:13, Stefan Rompf wrote:
> > recently I patched my 2.6.16 kernel to use uswsusp. Nice work, but when I 
> > installed /usr/local/sbin/suspend into the Suse 9.3 powermanagement scripts, 
> > I've stumbled over a bad interaction: powersaved closes all filedescriptors 
> > before calling scripts. suspend then opens snapshot and swap device, 
> > allocating file descriptors 0 and 1, but printfs() afterwards. Luckily, I did 
> > not lose any data.

Fortunately it drops the 0, 1 and 2 descriptors afterwards in prepare_console(). :-)

Still this is a bug and has to be fixed.

I've redone your patch a bit, could you please test it?

Rafael

---
 suspend.c |   15 ++++++++++++++-
 1 files changed, 14 insertions(+), 1 deletion(-)

Index: suspend/suspend.c
===================================================================
--- suspend.orig/suspend.c
+++ suspend/suspend.c
@@ -856,7 +856,7 @@ int main(int argc, char *argv[])
 	struct stat stat_buf;
 	int resume_fd, snapshot_fd, vt_fd, orig_vc = -1, suspend_vc = -1;
 	dev_t resume_dev;
-	int orig_loglevel, ret = 0;
+	int orig_loglevel, ret;
 
 	if (get_config("suspend", argc, argv, PARAM_NO, parameters, resume_dev_name))
 		return EINVAL;
@@ -875,6 +875,18 @@ int main(int argc, char *argv[])
 	if (s2ram != 'y' && s2ram != 'Y')
 		s2ram = 0;
 
+	/* Make sure the 0, 1, 2 descriptors are open before opening the
+	 * snapshot and resume devices
+	 */
+	do {
+		ret = open("/dev/null", O_RDWR);
+		if (ret < 0) {
+			fprintf(stderr, "suspend: Could not open /dev/null\n");
+			return errno;
+		}
+	} while (ret <= 2);
+	close(ret);
+
 	setvbuf(stdout, NULL, _IONBF, 0);
 	setvbuf(stderr, NULL, _IONBF, 0);
 
@@ -898,6 +910,7 @@ int main(int argc, char *argv[])
 	}
 	resume_dev = stat_buf.st_rdev;
 
+	ret = 0;
 	if (stat(snapshot_dev_name, &stat_buf)) {
 		fprintf(stderr, "suspend: Could not stat the snapshot device file\n");
 		ret = ENODEV;

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

  Powered by Linux