From: Branden Robinson <[email protected]>

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 <[email protected]>.
---
 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

_______________________________________________
xorg-devel mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to