(Fuser_uid, Fuser_real_uid): If UID as EMACS_INT is negative, produce
authorEli Zaretskii <eliz@gnu.org>
Fri, 20 Mar 2009 17:59:38 +0000 (17:59 +0000)
committerEli Zaretskii <eliz@gnu.org>
Fri, 20 Mar 2009 17:59:38 +0000 (17:59 +0000)
a float value.

src/ChangeLog
src/editfns.c

index 8812516..1f95b28 100644 (file)
@@ -1,3 +1,11 @@
+2009-03-20  Eli Zaretskii  <eliz@gnu.org>
+
+       * editfns.c (Fuser_uid, Fuser_real_uid): If UID as EMACS_INT is
+       negative, produce a float value.
+
+       * dired.c (make_uid, make_gid): New functions.
+       (Ffile_attributes): Use them to avoid negative UID and GID.
+
 2009-03-20  Juanma Barranquero  <lekktu@gmail.com>
 
        * keyboard.c (Fcurrent_idle_time): Reflow docstring.
index cfce1f2..aac670b 100644 (file)
@@ -1319,23 +1319,33 @@ This ignores the environment variables LOGNAME and USER, so it differs from
 
 DEFUN ("user-uid", Fuser_uid, Suser_uid, 0, 0, 0,
        doc: /* Return the effective uid of Emacs.
-Value is an integer or float, depending on the value.  */)
+Value is an integer or float, depending on the value.  */)
      ()
 {
   /* Assignment to EMACS_INT stops GCC whining about limited range of
      data type.  */
   EMACS_INT euid = geteuid ();
+
+  /* Make sure we don't produce a negative UID due to signed integer
+     overflow.  */
+  if (euid < 0)
+    return make_float ((double)geteuid ());
   return make_fixnum_or_float (euid);
 }
 
 DEFUN ("user-real-uid", Fuser_real_uid, Suser_real_uid, 0, 0, 0,
        doc: /* Return the real uid of Emacs.
-Value is an integer or float, depending on the value.  */)
+Value is an integer or float, depending on the value.  */)
      ()
 {
   /* Assignment to EMACS_INT stops GCC whining about limited range of
      data type.  */
   EMACS_INT uid = getuid ();
+
+  /* Make sure we don't produce a negative UID due to signed integer
+     overflow.  */
+  if (uid < 0)
+    return make_float ((double)getuid ());
   return make_fixnum_or_float (uid);
 }