summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--Src/params.c18
-rw-r--r--Test/D07multibyte.ztst30
3 files changed, 39 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index 3e9439d63..4f961da3a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2009-05-08 Peter Stephenson <pws@csr.com>
+ * 26953: Test/D07multibyte.ztst: print warning but don't fail test
+ if system apparently can't do simple character set conversion.
+
+ * 26950: Src/params.c: warn on failed attempt to change real or
+ effective group or user ID.
+
* 26949: Completion/Unix/Command/_sudo: new options and sudoedit.
* 26948: Src/Zle/zle_refresh.c: ensure recorded window sizes
@@ -11673,5 +11679,5 @@
*****************************************************
* This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.4680 $
+* $Revision: 1.4681 $
*****************************************************
diff --git a/Src/params.c b/Src/params.c
index 6a7ab0fa6..4767aaa34 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -3527,7 +3527,11 @@ usernamesetfn(UNUSED(Param pm), char *x)
# ifdef USE_INITGROUPS
initgroups(x, pswd->pw_gid);
# endif
- if(!setgid(pswd->pw_gid) && !setuid(pswd->pw_uid)) {
+ if (setgid(pswd->pw_gid))
+ zwarn("failed to change group ID: %e", errno);
+ else if (setuid(pswd->pw_uid))
+ zwarn("failed to change user ID: %e", errno);
+ else {
zsfree(cached_username);
cached_username = ztrdup(pswd->pw_name);
cached_uid = pswd->pw_uid;
@@ -3553,7 +3557,8 @@ void
uidsetfn(UNUSED(Param pm), zlong x)
{
#ifdef HAVE_SETUID
- setuid((uid_t)x);
+ if (setuid((uid_t)x))
+ zwarn("failed to change user ID: %e", errno);
#endif
}
@@ -3573,7 +3578,8 @@ void
euidsetfn(UNUSED(Param pm), zlong x)
{
#ifdef HAVE_SETEUID
- seteuid((uid_t)x);
+ if (seteuid((uid_t)x))
+ zwarn("failed to change effective user ID: %e", errno);
#endif
}
@@ -3593,7 +3599,8 @@ void
gidsetfn(UNUSED(Param pm), zlong x)
{
#ifdef HAVE_SETUID
- setgid((gid_t)x);
+ if (setgid((gid_t)x))
+ zwarn("failed to change group ID: %e", errno);
#endif
}
@@ -3613,7 +3620,8 @@ void
egidsetfn(UNUSED(Param pm), zlong x)
{
#ifdef HAVE_SETEUID
- setegid((gid_t)x);
+ if (setegid((gid_t)x))
+ zwarn("failed to change effective group ID: %e", errno);
#endif
}
diff --git a/Test/D07multibyte.ztst b/Test/D07multibyte.ztst
index c7ee5791b..3f4eaf9c0 100644
--- a/Test/D07multibyte.ztst
+++ b/Test/D07multibyte.ztst
@@ -378,17 +378,25 @@
>X$'\300'Y$'\a'Z$'\177'T
# This also isn't strictly multibyte and is here to reduce the
-# likelihood of a "can't do character set conversion" error.
- testfn() { (LC_ALL=C; print $'\u00e9') }
- repeat 4 testfn 2>&1 | while read line; do
- if [[ $line = *"character not in range"* ]]; then
- print OK
- elif [[ $line = "?" ]]; then
- print OK
- else
- print Failed: no error message and no question mark
- fi
- done
+# likelihood of a "cannot do character set conversion" error.
+ (print $'\u00e9') 2>&1 | read
+ if [[ $REPLY != é ]]; then
+ print "warning: your system can't do simple Unicode conversion." >&$ZTST_fd
+ print "Check you have a correctly installed iconv library." >&$ZTST_fd
+ # cheat
+ repeat 4 print OK
+ else
+ testfn() { (LC_ALL=C; print $'\u00e9') }
+ repeat 4 testfn 2>&1 | while read line; do
+ if [[ $line = *"character not in range"* ]]; then
+ print OK
+ elif [[ $line = "?" ]]; then
+ print OK
+ else
+ print Failed: no error message and no question mark
+ fi
+ done
+ fi
true
0:error handling in Unicode quoting
>OK