summaryrefslogtreecommitdiff
path: root/src/dired.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2009-03-18 20:37:34 +0000
committerEli Zaretskii <eliz@gnu.org>2009-03-18 20:37:34 +0000
commitf5674b92e0fc31540abd927c58e3896f0c78dfcf (patch)
tree54b56d6f184ec0ac19cb844b578e859b09622bf1 /src/dired.c
parent80ad2f27cd986656aa4b86682c187051e1888566 (diff)
downloademacs-f5674b92e0fc31540abd927c58e3896f0c78dfcf.tar.gz
(Ffile_attributes): Make sure UID and GID are always positive, even
if the value is too large for a positive EMACS_INT. Doc fix.
Diffstat (limited to 'src/dired.c')
-rw-r--r--src/dired.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/dired.c b/src/dired.c
index 4beac6e50e4..7c7c7571a4a 100644
--- a/src/dired.c
+++ b/src/dired.c
@@ -906,8 +906,8 @@ ID-FORMAT if you use the returned uid or gid.
Elements of the attribute list are:
0. t for directory, string (name linked to) for symbolic link, or nil.
1. Number of links to file.
- 2. File uid as a string or an integer. If a string value cannot be
- looked up, the integer value is returned.
+ 2. File uid as a string or a number. If a string value cannot be
+ looked up, a numeric value, either an integer or a float, is returned.
3. File gid, likewise.
4. Last access time, as a list of two integers.
First integer has high-order 16 bits of time, second has low 16 bits.
@@ -980,8 +980,16 @@ which see. */)
gid = s.st_gid;
if (NILP (id_format) || EQ (id_format, Qinteger))
{
- values[2] = make_fixnum_or_float (uid);
- values[3] = make_fixnum_or_float (gid);
+ if (sizeof (s.st_uid) > sizeof (uid) || uid < 0
+ || FIXNUM_OVERFLOW_P (uid))
+ values[2] = make_float ((double)s.st_uid);
+ else
+ values[2] = make_number (uid);
+ if (sizeof (s.st_gid) > sizeof (gid) || gid < 0
+ || FIXNUM_OVERFLOW_P (gid))
+ values[3] = make_float ((double)s.st_gid);
+ else
+ values[3] = make_number (gid);
}
else
{