From 96cf177352940831b989301681c1483a52a319d5 Mon Sep 17 00:00:00 2001 From: Raja R Harinath Date: Sun, 24 Jan 1999 07:10:18 +0000 Subject: [PATCH] Hopefully got the error handling for `getpwuid_r' right. (g_get_any_init) * gutils.c (g_get_any_init) [HAVE_GETPWUID_R && HAVE_GETPWUID_R_POSIX]: Hopefully got the error handling for `getpwuid_r' right. (g_get_any_init) [HAVE_GETPWUID_R && !HAVE_GETPWUID_R_POSIX]: Fix typo (change `pw == NULL' to `pw != NULL'). Please let this be right :-/. --- ChangeLog | 8 ++++++++ ChangeLog.pre-2-0 | 8 ++++++++ ChangeLog.pre-2-10 | 8 ++++++++ ChangeLog.pre-2-12 | 8 ++++++++ ChangeLog.pre-2-2 | 8 ++++++++ ChangeLog.pre-2-4 | 8 ++++++++ ChangeLog.pre-2-6 | 8 ++++++++ ChangeLog.pre-2-8 | 8 ++++++++ glib/gutils.c | 27 ++++++++++++++++++++++++--- gutils.c | 27 ++++++++++++++++++++++++--- 10 files changed, 112 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index afe3eea..abce291 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +1999-01-24 Raja R Harinath + + * gutils.c + (g_get_any_init) [HAVE_GETPWUID_R && HAVE_GETPWUID_R_POSIX]: + Hopefully got the error handling for `getpwuid_r' right. + (g_get_any_init) [HAVE_GETPWUID_R && !HAVE_GETPWUID_R_POSIX]: + Fix typo (change `pw == NULL' to `pw != NULL'). + Sun Jan 24 00:36:22 EST 1999 Jeff Garzik * ghash.c: diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index afe3eea..abce291 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,11 @@ +1999-01-24 Raja R Harinath + + * gutils.c + (g_get_any_init) [HAVE_GETPWUID_R && HAVE_GETPWUID_R_POSIX]: + Hopefully got the error handling for `getpwuid_r' right. + (g_get_any_init) [HAVE_GETPWUID_R && !HAVE_GETPWUID_R_POSIX]: + Fix typo (change `pw == NULL' to `pw != NULL'). + Sun Jan 24 00:36:22 EST 1999 Jeff Garzik * ghash.c: diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index afe3eea..abce291 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,11 @@ +1999-01-24 Raja R Harinath + + * gutils.c + (g_get_any_init) [HAVE_GETPWUID_R && HAVE_GETPWUID_R_POSIX]: + Hopefully got the error handling for `getpwuid_r' right. + (g_get_any_init) [HAVE_GETPWUID_R && !HAVE_GETPWUID_R_POSIX]: + Fix typo (change `pw == NULL' to `pw != NULL'). + Sun Jan 24 00:36:22 EST 1999 Jeff Garzik * ghash.c: diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index afe3eea..abce291 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,11 @@ +1999-01-24 Raja R Harinath + + * gutils.c + (g_get_any_init) [HAVE_GETPWUID_R && HAVE_GETPWUID_R_POSIX]: + Hopefully got the error handling for `getpwuid_r' right. + (g_get_any_init) [HAVE_GETPWUID_R && !HAVE_GETPWUID_R_POSIX]: + Fix typo (change `pw == NULL' to `pw != NULL'). + Sun Jan 24 00:36:22 EST 1999 Jeff Garzik * ghash.c: diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index afe3eea..abce291 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,11 @@ +1999-01-24 Raja R Harinath + + * gutils.c + (g_get_any_init) [HAVE_GETPWUID_R && HAVE_GETPWUID_R_POSIX]: + Hopefully got the error handling for `getpwuid_r' right. + (g_get_any_init) [HAVE_GETPWUID_R && !HAVE_GETPWUID_R_POSIX]: + Fix typo (change `pw == NULL' to `pw != NULL'). + Sun Jan 24 00:36:22 EST 1999 Jeff Garzik * ghash.c: diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index afe3eea..abce291 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,11 @@ +1999-01-24 Raja R Harinath + + * gutils.c + (g_get_any_init) [HAVE_GETPWUID_R && HAVE_GETPWUID_R_POSIX]: + Hopefully got the error handling for `getpwuid_r' right. + (g_get_any_init) [HAVE_GETPWUID_R && !HAVE_GETPWUID_R_POSIX]: + Fix typo (change `pw == NULL' to `pw != NULL'). + Sun Jan 24 00:36:22 EST 1999 Jeff Garzik * ghash.c: diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index afe3eea..abce291 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,11 @@ +1999-01-24 Raja R Harinath + + * gutils.c + (g_get_any_init) [HAVE_GETPWUID_R && HAVE_GETPWUID_R_POSIX]: + Hopefully got the error handling for `getpwuid_r' right. + (g_get_any_init) [HAVE_GETPWUID_R && !HAVE_GETPWUID_R_POSIX]: + Fix typo (change `pw == NULL' to `pw != NULL'). + Sun Jan 24 00:36:22 EST 1999 Jeff Garzik * ghash.c: diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index afe3eea..abce291 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,11 @@ +1999-01-24 Raja R Harinath + + * gutils.c + (g_get_any_init) [HAVE_GETPWUID_R && HAVE_GETPWUID_R_POSIX]: + Hopefully got the error handling for `getpwuid_r' right. + (g_get_any_init) [HAVE_GETPWUID_R && !HAVE_GETPWUID_R_POSIX]: + Fix typo (change `pw == NULL' to `pw != NULL'). + Sun Jan 24 00:36:22 EST 1999 Jeff Garzik * ghash.c: diff --git a/glib/gutils.c b/glib/gutils.c index b9d5689..da4b3d1 100644 --- a/glib/gutils.c +++ b/glib/gutils.c @@ -450,14 +450,35 @@ g_get_any_init (void) buffer = g_malloc (bufsize); # ifdef HAVE_GETPWUID_R_POSIX + /* There appears to be some confusion about what the return + value should be, and whether errno is set or not. + So, we are careful about it. */ + errno = 0; error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw); - if (!error) + + if (error == 0) goto pw_out; - error = errno; + + /* Some kind of error. + + SUSv2 says returned value is an error code; says nothing + about `errno'. GNU Libc says some non-null (sic) value and + errno is set. Either way, this code path is chosen. + + If `errno' isn't changed, the return value contains the + error code (like ERANGE). + + If `errno' is changed, then it must be right, irrespective + of whether the return value follows SUSv2 or not. */ + if (errno != 0) + error = errno; + # else /* !HAVE_GETPWUID_R_POSIX */ pw = getpwuid_r (getuid (), &pwd, buffer, bufsize); - if (pw == NULL) + if (pw != NULL) goto pw_out; + /* If it got here, there is an error. The `uid' should be + valid, so there must be something else wrong. */ error = errno; # endif /* !HAVE_GETPWUID_R_POSIX */ diff --git a/gutils.c b/gutils.c index b9d5689..da4b3d1 100644 --- a/gutils.c +++ b/gutils.c @@ -450,14 +450,35 @@ g_get_any_init (void) buffer = g_malloc (bufsize); # ifdef HAVE_GETPWUID_R_POSIX + /* There appears to be some confusion about what the return + value should be, and whether errno is set or not. + So, we are careful about it. */ + errno = 0; error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw); - if (!error) + + if (error == 0) goto pw_out; - error = errno; + + /* Some kind of error. + + SUSv2 says returned value is an error code; says nothing + about `errno'. GNU Libc says some non-null (sic) value and + errno is set. Either way, this code path is chosen. + + If `errno' isn't changed, the return value contains the + error code (like ERANGE). + + If `errno' is changed, then it must be right, irrespective + of whether the return value follows SUSv2 or not. */ + if (errno != 0) + error = errno; + # else /* !HAVE_GETPWUID_R_POSIX */ pw = getpwuid_r (getuid (), &pwd, buffer, bufsize); - if (pw == NULL) + if (pw != NULL) goto pw_out; + /* If it got here, there is an error. The `uid' should be + valid, so there must be something else wrong. */ error = errno; # endif /* !HAVE_GETPWUID_R_POSIX */ -- 2.7.4