diff options
author | Chris Metcalf <cmetcalf@tilera.com> | 2014-02-10 10:54:47 -0500 |
---|---|---|
committer | Chris Metcalf <cmetcalf@tilera.com> | 2014-02-10 11:04:39 -0500 |
commit | 4372980f5881e7d537a52e3c49588ce116088061 (patch) | |
tree | 138fbc88313c8cb0cabee393e0c08afd67dac6f1 /sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h | |
parent | a1ffb40e32741f992c743e7b16c061fefa3747ac (diff) | |
download | glibc-4372980f5881e7d537a52e3c49588ce116088061.tar.gz glibc-4372980f5881e7d537a52e3c49588ce116088061.tar.xz glibc-4372980f5881e7d537a52e3c49588ce116088061.zip |
Move tilegx, tilepro, and linux-generic from ports to libc.
I've moved the TILE-Gx and TILEPro ports to the main sysdeps hierarchy, along with the linux-generic ports infrastructure. Beyond the README update, the move was just git mv ports/sysdeps/tile sysdeps/tile git mv ports/sysdeps/unix/sysv/linux/tile \ sysdeps/unix/sysv/linux/tile git mv ports/sysdeps/unix/sysv/linux/generic \ sysdeps/unix/sysv/linux/generic I updated the relevant ChangeLogs along the lines of the ARM move in commit c6bfe5c4d75 and tested the 64-bit tilegx build to confirm that there were no changes in "objdump -dr" output in the shared objects.
Diffstat (limited to 'sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h')
-rw-r--r-- | sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h b/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h new file mode 100644 index 0000000000..2acc2e5486 --- /dev/null +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h @@ -0,0 +1,60 @@ +/* Overflow tests for stat, statfs, and lseek functions. + Copyright (C) 2011-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include <sys/stat.h> +#include <sys/statfs.h> + +/* Test for overflows of structures where we ask the kernel to fill them + in with standard 64-bit syscalls but return them through APIs that + only expose the low 32 bits of some fields. */ + +static inline off_t lseek_overflow (loff_t res) +{ + off_t retval = (off_t) res; + if (retval == res) + return retval; + + __set_errno (EOVERFLOW); + return (off_t) -1; +} + +static inline int stat_overflow (struct stat *buf) +{ + if (buf->__st_ino_pad == 0 && buf->__st_size_pad == 0 && + buf->__st_blocks_pad == 0) + return 0; + + __set_errno (EOVERFLOW); + return -1; +} + +/* Note that f_files and f_ffree may validly be a sign-extended -1. */ +static inline int statfs_overflow (struct statfs *buf) +{ + if (buf->__f_blocks_pad == 0 && buf->__f_bfree_pad == 0 && + buf->__f_bavail_pad == 0 && + (buf->__f_files_pad == 0 || + (buf->f_files == -1U && buf->__f_files_pad == -1)) && + (buf->__f_ffree_pad == 0 || + (buf->f_ffree == -1U && buf->__f_ffree_pad == -1))) + return 0; + + __set_errno (EOVERFLOW); + return -1; +} |