[PATCH 05/10] Always attempt to write data to the auth file

Julien Cristau jcristau at debian.org
Tue Jan 5 10:18:19 PST 2010


From: Branden Robinson <branden at debian.org>

Actually attempt to write data to the auth file in SaveServerAuthorizations();
that way we detect problems like ENOSPC (full filesystem, user over quota)
early enough to do something about it.  (See Debian #217505, #253480)

Forward-ported by Julien Cristau <jcristau at debian.org>.
---
 auth.c |   34 ++++++++++++++++++++++++++++++++++
 1 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/auth.c b/auth.c
index b80f16d..571276a 100644
--- a/auth.c
+++ b/auth.c
@@ -401,6 +401,8 @@ SaveServerAuthorizations (
     mode_t	mask;
     int		ret;
     int		i;
+    char	dummy_auth[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+		               "XXXXXXXXXXXXXXXXX"; /* 64 "X"s */
 
     mask = umask (0077);
     ret = MakeServerAuthFile(d, &auth_file);
@@ -418,6 +420,31 @@ SaveServerAuthorizations (
     {
     	Debug ("File: %s auth: %p\n", d->authFile, auths);
 	ret = TRUE;
+	if (count == 0)
+	{
+		/*
+		 * This is a crude hack to determine whether we really can
+		 * write to the auth file even if we don't have real data
+		 * to write right now.
+		 */
+
+		/*
+		 * Write garbage data to file to provoke ENOSPC and other
+		 * errors.
+		 */
+		(void) fprintf (auth_file, "%s", dummy_auth);
+		(void) fflush (auth_file);
+		if (ferror (auth_file))
+		{
+		    LogError ("Cannot write server authorization file %s\n",
+			      d->authFile);
+		    ret = FALSE;
+		}
+		/*
+		 * Rewind so that the garbage data is overwritten later.
+		 */
+		rewind(auth_file);
+	}
 	for (i = 0; i < count; i++)
 	{
 	    /*
@@ -436,6 +463,13 @@ SaveServerAuthorizations (
 		    d->authFile = NULL;
 		}
     	}
+	/*
+	 * XXX: This is not elegant, but stdio has no truncation function.
+	 */
+	if (ftruncate(fileno(auth_file), ftell(auth_file)))
+	{
+		Debug ("ftruncate() failed\n");
+	}
 	fclose (auth_file);
     }
     return ret;
-- 
1.6.5.7



More information about the xorg-devel mailing list