* posix/bits/unistd.h (__readlinkat_chk): New prototype.

(__readlinkat_alias): New alias.
	(readlinkat): New inline function.
	* include/unistd.h (readlinkat): Add libc_hidden_proto.
	* sysdeps/unix/sysv/linux/readlinkat.c (readlinkat): Add
	libc_hidden_def.
	* io/readlinkat.c (readlinkat): Likewise.
	* debug/readlinkat_chk.c: New file.
	* debug/Makefile (routines): Add readlinkat_chk.
	* debug/Versions (libc): Export __readlinkat_chk@@GLIBC_2.5.
	* debug/tst-chk1.c (do_test): Add readlinkat tests.

	* nis/nss_nisplus/nisplus-netgrp.c: Cleanups.
	code is possible.  Move compatibility code in .text.compat section.
	over gaih array.  There is only one function to call in the moment.
This commit is contained in:
Ulrich Drepper 2006-04-24 17:01:40 +00:00
parent 34a15e61e0
commit a346370d58
9 changed files with 107 additions and 5 deletions

View File

@ -1,6 +1,20 @@
2006-04-24 Jakub Jelinek <jakub@redhat.com>
* posix/bits/unistd.h (__readlinkat_chk): New prototype.
(__readlinkat_alias): New alias.
(readlinkat): New inline function.
* include/unistd.h (readlinkat): Add libc_hidden_proto.
* sysdeps/unix/sysv/linux/readlinkat.c (readlinkat): Add
libc_hidden_def.
* io/readlinkat.c (readlinkat): Likewise.
* debug/readlinkat_chk.c: New file.
* debug/Makefile (routines): Add readlinkat_chk.
* debug/Versions (libc): Export __readlinkat_chk@@GLIBC_2.5.
* debug/tst-chk1.c (do_test): Add readlinkat tests.
2006-04-23 Ulrich Drepper <drepper@redhat.com> 2006-04-23 Ulrich Drepper <drepper@redhat.com>
* nis/nss_nisplus/nisplus-netgrp.c: Cleanups. * nis/nss_nisplus/nisplus-netgrp.c: Cleanups.
[BZ #1951] [BZ #1951]
* sysdeps/posix/sigset.c (sigset): Return correct value reflecting * sysdeps/posix/sigset.c (sigset): Return correct value reflecting
@ -37,13 +51,13 @@
* sysdeps/unix/sysv/linux/kernel-features.h: Define * sysdeps/unix/sysv/linux/kernel-features.h: Define
__ASSUME_PROC_SELF_FD_SYMLINK. __ASSUME_PROC_SELF_FD_SYMLINK.
* sysdeps/unix/sysv/linux/ttyname.c: Cleanups. Avoid compatibility * sysdeps/unix/sysv/linux/ttyname.c: Cleanups. Avoid compatibility
code if possible. Move compatibility code in .text.compat section. code is possible. Move compatibility code in .text.compat section.
* sysdeps/unix/sysv/linux/ttyname_r.c: Likewise. * sysdeps/unix/sysv/linux/ttyname_r.c: Likewise.
2006-04-18 Ulrich Drepper <drepper@redhat.com> 2006-04-18 Ulrich Drepper <drepper@redhat.com>
* sysdeps/posix/getaddrinfo.c (getaddrinfo): Rewrite to avoid loop * sysdeps/posix/getaddrinfo.c (getaddrinfo): Rewrite to avoid loop
over gaih array. There is only on function to call in the moment. over gaih array. There is only one function to call in the moment.
2006-04-16 Ulrich Drepper <drepper@redhat.com> 2006-04-16 Ulrich Drepper <drepper@redhat.com>

View File

@ -31,7 +31,8 @@ routines = backtrace backtracesyms backtracesymsfd noophooks \
printf_chk fprintf_chk vprintf_chk vfprintf_chk \ printf_chk fprintf_chk vprintf_chk vfprintf_chk \
gets_chk chk_fail readonly-area fgets_chk fgets_u_chk \ gets_chk chk_fail readonly-area fgets_chk fgets_u_chk \
read_chk pread_chk pread64_chk recv_chk recvfrom_chk \ read_chk pread_chk pread64_chk recv_chk recvfrom_chk \
readlink_chk getwd_chk getcwd_chk realpath_chk ptsname_r_chk \ readlink_chk readlinkat_chk getwd_chk getcwd_chk \
realpath_chk ptsname_r_chk \
wctomb_chk wcscpy_chk wmemcpy_chk wmemmove_chk wmempcpy_chk \ wctomb_chk wcscpy_chk wmemcpy_chk wmemmove_chk wmempcpy_chk \
wcpcpy_chk wcsncpy_chk wcscat_chk wcsncat_chk wmemset_chk \ wcpcpy_chk wcsncpy_chk wcscat_chk wcsncat_chk wmemset_chk \
wcpncpy_chk \ wcpncpy_chk \

View File

@ -36,4 +36,7 @@ libc {
__stack_chk_fail; __stack_chk_fail;
} }
GLIBC_2.5 {
__readlinkat_chk;
}
} }

31
debug/readlinkat_chk.c Normal file
View File

@ -0,0 +1,31 @@
/* Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
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, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <unistd.h>
#include <sys/param.h>
ssize_t
__readlinkat_chk (int fd, const char *path, void *buf, size_t len,
size_t buflen)
{
if (len > buflen)
__chk_fail ();
return readlinkat (fd, path, buf, len);
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2004, 2005 Free Software Foundation, Inc. /* Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.
@ -944,6 +944,34 @@ do_test (void)
CHK_FAIL_END CHK_FAIL_END
#endif #endif
int tmpfd = open ("/tmp", O_RDONLY | O_DIRECTORY);
if (tmpfd < 0)
FAIL ();
if (readlinkat (tmpfd, fname + sizeof ("/tmp/") - 1, readlinkbuf, 4) != 3
|| memcmp (readlinkbuf, "bar", 3) != 0)
FAIL ();
if (readlinkat (tmpfd, fname + sizeof ("/tmp/") - 1, readlinkbuf + 1,
l0 + 3) != 3
|| memcmp (readlinkbuf, "bbar", 4) != 0)
FAIL ();
#if __USE_FORTIFY_LEVEL >= 1
CHK_FAIL_START
if (readlinkat (tmpfd, fname + sizeof ("/tmp/") - 1, readlinkbuf + 2,
l0 + 3) != 3)
FAIL ();
CHK_FAIL_END
CHK_FAIL_START
if (readlinkat (tmpfd, fname + sizeof ("/tmp/") - 1, readlinkbuf + 3,
4) != 3)
FAIL ();
CHK_FAIL_END
#endif
close (tmpfd);
char *cwd1 = getcwd (NULL, 0); char *cwd1 = getcwd (NULL, 0);
if (cwd1 == NULL) if (cwd1 == NULL)
FAIL (); FAIL ();

View File

@ -15,6 +15,7 @@ libc_hidden_proto (getlogin_r)
libc_hidden_proto (seteuid) libc_hidden_proto (seteuid)
libc_hidden_proto (setegid) libc_hidden_proto (setegid)
libc_hidden_proto (tcgetpgrp) libc_hidden_proto (tcgetpgrp)
libc_hidden_proto (readlinkat)
/* Now define the internal interfaces. */ /* Now define the internal interfaces. */
extern int __access (__const char *__name, int __type); extern int __access (__const char *__name, int __type);

View File

@ -46,5 +46,6 @@ readlinkat (fd, path, buf, len)
return -1; return -1;
} }
stub_warning (readlinkat) stub_warning (readlinkat)
libc_hidden_def (readlinkat)
#include <stub-tag.h> #include <stub-tag.h>

View File

@ -100,6 +100,28 @@ __NTH (readlink (__const char *__restrict __path, char *__restrict __buf,
} }
#endif #endif
#ifdef __USE_ATFILE
extern ssize_t __readlinkat_chk (int __fd, __const char *__restrict __path,
char *__restrict __buf, size_t __len,
size_t __buflen)
__THROW __nonnull ((2, 3)) __wur;
extern ssize_t __REDIRECT_NTH (__readlinkat_alias,
(int __fd, __const char *__restrict __path,
char *__restrict __buf, size_t __len),
readlinkat)
__nonnull ((2, 3)) __wur;
extern __always_inline __nonnull ((2, 3)) __wur ssize_t
__NTH (readlinkat (int __fd, __const char *__restrict __path,
char *__restrict __buf, size_t __len))
{
if (__bos (__buf) != (size_t) -1
&& (!__builtin_constant_p (__len) || __len > __bos (__buf)))
return __readlinkat_chk (__fd, __path, __buf, __len, __bos (__buf));
return __readlinkat_alias (__fd, __path, __buf, __len);
}
#endif
extern char *__getcwd_chk (char *__buf, size_t __size, size_t __buflen) extern char *__getcwd_chk (char *__buf, size_t __size, size_t __buflen)
__THROW __wur; __THROW __wur;
extern char *__REDIRECT_NTH (__getcwd_alias, extern char *__REDIRECT_NTH (__getcwd_alias,

View File

@ -87,3 +87,4 @@ readlinkat (fd, path, buf, len)
return result; return result;
#endif #endif
} }
libc_hidden_def (readlinkat)