This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
Re: [libfortran,committed] Fix PR31299, GETLOG intrinsic
- From: "François-Xavier Coudert" <fxcoudert at gmail dot com>
- To: "Jakub Jelinek" <jakub at redhat dot com>
- Cc: "Fortran List" <fortran at gcc dot gnu dot org>, "gcc-patches List" <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 25 Apr 2007 09:37:07 +0200
- Subject: Re: [libfortran,committed] Fix PR31299, GETLOG intrinsic
- Dkim-signature: a=rsa-sha1; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:references; b=bzWfIw7JP6Trgv8l1y8eHkBl8ur1stewcu9kdAYW+zYcHStPm1IA4pRwHSjrQurt+u2HxekOjER3t0EqjyI3IRg+XheR4f+Mkwy2ssHsgD5FD09zCewOhDvoesYLjNDIfUrTj2YSiANn2fTkRT3jvCgE1EY7fgUGsLCBhvifRLk=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:references; b=TskouS8sY2z7GSxqZ76Rqn/44D2Gva6Sqz2vdfc/EsKe4mZKNXfqG+3LH6Ixw2srRDybVnXqK1ZxoOcvyDsS8UDAWIOE73QRKSICFWS9Y6LxZFZ3gIRRfG+/t4dhmq4gJrKJA1RCgSlSJAekHcTgM9iQsa4kSLnisSWwzCFKtSA=
- References: <6AC8C8A4-78DC-4BF0-9FED-D2514392ED88@gmail.com> <20070424204715.GY355@devserv.devel.redhat.com>
# define GETLOG (getpwuid(geteuid())->pw_name)
This will segfault if getpwuid returns NULL.
Doh, stupid me. Here's what I committed as rev. 124143.
FX
Index: intrinsics/getlog.c
===================================================================
--- intrinsics/getlog.c (revision 124142)
+++ intrinsics/getlog.c (working copy)
@@ -37,8 +37,13 @@
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_PWD_H
+#include <pwd.h>
+#endif
-
/* Windows32 version */
#if defined __MINGW32__ && !defined HAVE_GETLOGIN
#define WIN32_LEAN_AND_MEAN
@@ -66,7 +71,6 @@
process.
CHARACTER(len=*), INTENT(OUT) :: LOGIN */
-#ifdef HAVE_GETLOGIN
void PREFIX(getlog) (char *, gfc_charlen_type);
export_proto_np(PREFIX(getlog));
@@ -78,7 +82,22 @@
memset (login, ' ', login_len); /* Blank the string. */
- p = getlogin ();
+#if defined(HAVE_GETPWUID) && defined(HAVE_GETEUID)
+ {
+ struct passwd *pw = getpwuid (geteuid ());
+ if (pw)
+ p = pw->pw_name;
+ else
+ return;
+ }
+#else
+# ifdef HAVE_GETLOGIN
+ p = getlogin();
+# else
+ return;
+# endif
+#endif
+
if (p == NULL)
return;
@@ -88,4 +107,3 @@
else
memcpy (login, p, p_len);
}
-#endif
Index: configure.ac
===================================================================
--- configure.ac (revision 124142)
+++ configure.ac (working copy)
@@ -178,7 +178,7 @@
AC_HAVE_HEADERS(stdlib.h string.h unistd.h signal.h)
AC_CHECK_HEADERS(time.h sys/time.h sys/times.h sys/resource.h)
AC_CHECK_HEADERS(sys/types.h sys/stat.h sys/wait.h floatingpoint.h ieeefp.h)
-AC_CHECK_HEADERS(fenv.h fptrap.h float.h execinfo.h)
+AC_CHECK_HEADERS(fenv.h fptrap.h float.h execinfo.h pwd.h)
AC_CHECK_HEADER([complex.h],[AC_DEFINE([HAVE_COMPLEX_H], [1], [complex.h exists])])
GCC_HEADER_STDINT(gstdint.h)
@@ -191,7 +191,7 @@
AC_CHECK_FUNCS(chdir strerror getlogin gethostname kill link symlink perror)
AC_CHECK_FUNCS(sleep time ttyname signal alarm ctime clock access fork execl)
AC_CHECK_FUNCS(wait setmode execvp pipe dup2 close fdopen strcasestr getrlimit)
-AC_CHECK_FUNCS(gettimeofday stat fstat lstat)
+AC_CHECK_FUNCS(gettimeofday stat fstat lstat getpwuid)
# Check for glibc backtrace functions
AC_CHECK_FUNCS(backtrace backtrace_symbols)
@@ -204,9 +204,9 @@
AC_CHECK_LIB([c],[getpid],[AC_DEFINE([HAVE_GETPID],[1],[libc includes getpid])])
AC_CHECK_LIB([c],[getppid],[AC_DEFINE([HAVE_GETPPID],[1],[libc includes getppid])])
AC_CHECK_LIB([c],[getuid],[AC_DEFINE([HAVE_GETUID],[1],[libc includes getuid])])
+AC_CHECK_LIB([c],[geteuid],[AC_DEFINE([HAVE_GETEUID],[1],[libc includes geteuid])])
# Check for C99 (and other IEEE) math functions
-# ??? This list seems awful long. Is there a better way to test for these?
AC_CHECK_LIB([m],[acosf],[AC_DEFINE([HAVE_ACOSF],[1],[libm includes acosf])])
AC_CHECK_LIB([m],[acos],[AC_DEFINE([HAVE_ACOS],[1],[libm includes acos])])
AC_CHECK_LIB([m],[acosl],[AC_DEFINE([HAVE_ACOSL],[1],[libm includes acosl])])