bug-gnulib
[Top][All Lists]
Advanced

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

Re: Test suite failure in clean chroot of ArchLinux


From: Bruno Haible
Subject: Re: Test suite failure in clean chroot of ArchLinux
Date: Sun, 19 Jun 2022 16:26:01 +0200

Letu Ren wrote:
> Thanks for the patch.I back-ported your patch and tested in ArchLinux 
> chroot. It still failed because the type of /proc/self/loginuid is uid_t 
> not string.

Thanks for testing and reporting back.

> By the way, I accidentally created a new thread in the mailing list
> because I'm not familiar with `git send-email`.

That's not a problem; we can live with that.

But there's no need to follow up in private email; please always keep the
list in CC.

> I made some changes based on your patch and tested 
> the patch under ArchLinux x86_64 chroot.
> 
> 
> * tests/test-getlogin.h (test_getlogin_result):
> According to the source code of glibc, the type of /proc/self/loginuid is
> uid_t, which is unsigned int.
> 
> Signed-off-by: Letu Ren <fantasquex@gmail.com>
> ---
>   tests/test-getlogin.h | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/tests/test-getlogin.h b/tests/test-getlogin.h
> index 3489e3e03..b5ed8b572 100644
> --- a/tests/test-getlogin.h
> +++ b/tests/test-getlogin.h
> @@ -58,9 +58,9 @@ test_getlogin_result (const char *buf, int err)
>         FILE *fp = fopen ("/proc/self/loginuid", "r");
>         if (fp != NULL)
>           {
> -          char buf[3];
> +          uid_t uid;
>             loginuid_undefined =
> -            (fread (buf, 1, 3, fp) == 2 && buf[0] == '-' && buf[1] == '1');
> +            (fscanf (fp, "%u", &uid) == 1 && uid == (uid_t) -1);
>             fclose (fp);
>           }

I don't like the *scanf family of functions. For a simple parsing function
like strtoul(), I can understand for which inputs it behaves in which ways
(empty input? not integer syntax? leading minus sign? unsigned integer
overflow?); for fscanf there are just too many cases, I can't wrap my head
around.

So I'm committing this instead.


2022-06-19  Bruno Haible  <bruno@clisp.org>

        getlogin, getlogin_r tests: Really avoid test failure.
        Reported by Letu Ren <fantasquex@gmail.com> in
        <https://lists.gnu.org/archive/html/bug-gnulib/2022-06/msg00037.html>.
        * tests/test-getlogin.h (test_getlogin_result): Parse the contents of
        /proc/self/loginuid as an unsigned integer.

diff --git a/tests/test-getlogin.h b/tests/test-getlogin.h
index 3489e3e03d..fcc7741f12 100644
--- a/tests/test-getlogin.h
+++ b/tests/test-getlogin.h
@@ -51,16 +51,25 @@ test_getlogin_result (const char *buf, int err)
 #if defined __linux__
       /* On Linux, it is possible to set up a chroot environment in such a way
          that stdin is connected to a tty and nervertheless /proc/self/loginuid
-         contains "-1".  In this situation, getlogin() and getlogin_r() fail;
-         this is expected.  */
+         contains the value (uid_t)(-1).  In this situation, getlogin() and
+         getlogin_r() fail; this is expected.  */
       bool loginuid_undefined = false;
-      /* Does the special file /proc/self/loginuid contain "-1"?  */
+      /* Does the special file /proc/self/loginuid contain the value
+         (uid_t)(-1)?  */
       FILE *fp = fopen ("/proc/self/loginuid", "r");
       if (fp != NULL)
         {
-          char buf[3];
-          loginuid_undefined =
-            (fread (buf, 1, 3, fp) == 2 && buf[0] == '-' && buf[1] == '1');
+          char buf[21];
+          size_t n = fread (buf, 1, sizeof buf, fp);
+          if (n > 0 && n < sizeof buf)
+            {
+              buf[n] = '\0';
+              errno = 0;
+              char *endptr;
+              unsigned long value = strtoul (buf, &endptr, 10);
+              if (*endptr == '\0' && errno == 0)
+                loginuid_undefined = ((uid_t) value == (uid_t)(-1));
+            }
           fclose (fp);
         }
       if (loginuid_undefined)






reply via email to

[Prev in Thread] Current Thread [Next in Thread]