Skip to content

Commit

Permalink
* posix/bits/unistd.h (__readlinkat_chk): New prototype.
Browse files Browse the repository at this point in the history
	(__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.
  • Loading branch information
Ulrich Drepper committed Apr 24, 2006
1 parent 34a15e6 commit a346370
Show file tree
Hide file tree
Showing 9 changed files with 107 additions and 5 deletions.
20 changes: 17 additions & 3 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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>

* nis/nss_nisplus/nisplus-netgrp.c: Cleanups.
* nis/nss_nisplus/nisplus-netgrp.c: Cleanups.

[BZ #1951]
* sysdeps/posix/sigset.c (sigset): Return correct value reflecting
Expand Down Expand Up @@ -37,13 +51,13 @@
* sysdeps/unix/sysv/linux/kernel-features.h: Define
__ASSUME_PROC_SELF_FD_SYMLINK.
* 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.

2006-04-18 Ulrich Drepper <drepper@redhat.com>

* 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>

Expand Down
3 changes: 2 additions & 1 deletion debug/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ routines = backtrace backtracesyms backtracesymsfd noophooks \
printf_chk fprintf_chk vprintf_chk vfprintf_chk \
gets_chk chk_fail readonly-area fgets_chk fgets_u_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 \
wcpcpy_chk wcsncpy_chk wcscat_chk wcsncat_chk wmemset_chk \
wcpncpy_chk \
Expand Down
3 changes: 3 additions & 0 deletions debug/Versions
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,7 @@ libc {

__stack_chk_fail;
}
GLIBC_2.5 {
__readlinkat_chk;
}
}
31 changes: 31 additions & 0 deletions debug/readlinkat_chk.c
Original file line number Diff line number Diff line change
@@ -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);
}
30 changes: 29 additions & 1 deletion debug/tst-chk1.c
Original file line number Diff line number Diff line change
@@ -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.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.
Expand Down Expand Up @@ -944,6 +944,34 @@ do_test (void)
CHK_FAIL_END
#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);
if (cwd1 == NULL)
FAIL ();
Expand Down
1 change: 1 addition & 0 deletions include/unistd.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ libc_hidden_proto (getlogin_r)
libc_hidden_proto (seteuid)
libc_hidden_proto (setegid)
libc_hidden_proto (tcgetpgrp)
libc_hidden_proto (readlinkat)

/* Now define the internal interfaces. */
extern int __access (__const char *__name, int __type);
Expand Down
1 change: 1 addition & 0 deletions io/readlinkat.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,6 @@ readlinkat (fd, path, buf, len)
return -1;
}
stub_warning (readlinkat)
libc_hidden_def (readlinkat)

#include <stub-tag.h>
22 changes: 22 additions & 0 deletions posix/bits/unistd.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,28 @@ __NTH (readlink (__const char *__restrict __path, char *__restrict __buf,
}
#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)
__THROW __wur;
extern char *__REDIRECT_NTH (__getcwd_alias,
Expand Down
1 change: 1 addition & 0 deletions sysdeps/unix/sysv/linux/readlinkat.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,4 @@ readlinkat (fd, path, buf, len)
return result;
#endif
}
libc_hidden_def (readlinkat)

0 comments on commit a346370

Please sign in to comment.