summaryrefslogtreecommitdiff
path: root/dir.c
diff options
context:
space:
mode:
authorkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-06-02 22:38:11 +0000
committerkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-06-02 22:38:11 +0000
commit523bd6737ea97bce1f92d2e171a09cc564b50125 (patch)
treecc2f30a1f08891d269c77148b5208a8eca9a38e4 /dir.c
parent284d7463924b313f12da8de5184af3407c3612ac (diff)
* configure.in: removes AC_CHECK_FUNCS(readdir_r). readdir_r()
is only used from dir.c and it doesn't need readdir_r(). * configure.in (SIZEOF_STRUCT_DIRENT_TOO_SMALL): remvoed. It is only used for readdir_r. * dir.c: removes NAME_MAX_FOR_STRUCT_DIRENT. It is not right way to detect maximum length of path len. POSIX require to use fpathconf(). IOW, it might have lead to make a vulnerability using stack smashing. Moreover, readdir() works enough for our usage. * dir.c (READDIR): removes an implementation which uses readdir_r() and parenthesize in a macro body correctly. * dir.c (dir_read): removes IF_HAVE_READDIR_R(DEFINE_STRUCT_DIRENT entry), it is used only for readdir_r(). * dir.c (dir_each): ditto. * dir.c (glob_helper): ditto. * dir.c (READDIR): removes entry and dp argument. * dir.c (dir_read): adjust for the above change. * dir.c (dir_each): ditto. * dir.c (glob_helper): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41042 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'dir.c')
-rw-r--r--dir.c55
1 files changed, 6 insertions, 49 deletions
diff --git a/dir.c b/dir.c
index 9eccadbcf5..23b5437cbe 100644
--- a/dir.c
+++ b/dir.c
@@ -561,50 +561,10 @@ dir_path(VALUE dir)
return rb_str_dup(dirp->path);
}
-#if defined HAVE_READDIR_R
-# define READDIR(dir, enc, entry, dp) (readdir_r((dir), (entry), &(dp)) == 0 && (dp) != 0)
-#elif defined _WIN32
-# define READDIR(dir, enc, entry, dp) (((dp) = rb_w32_readdir((dir), (enc))) != 0)
+#if defined _WIN32
+# define READDIR(dir, enc) rb_w32_readdir((dir), (enc))
#else
-# define READDIR(dir, enc, entry, dp) (((dp) = readdir(dir)) != 0)
-#endif
-#if defined HAVE_READDIR_R
-# define IF_HAVE_READDIR_R(something) something
-#else
-# define IF_HAVE_READDIR_R(something) /* nothing */
-#endif
-
-#if defined SIZEOF_STRUCT_DIRENT_TOO_SMALL
-# include <limits.h>
-# define NAME_MAX_FOR_STRUCT_DIRENT 255
-# if defined NAME_MAX
-# if NAME_MAX_FOR_STRUCT_DIRENT < NAME_MAX
-# undef NAME_MAX_FOR_STRUCT_DIRENT
-# define NAME_MAX_FOR_STRUCT_DIRENT NAME_MAX
-# endif
-# endif
-# if defined _POSIX_NAME_MAX
-# if NAME_MAX_FOR_STRUCT_DIRENT < _POSIX_NAME_MAX
-# undef NAME_MAX_FOR_STRUCT_DIRENT
-# define NAME_MAX_FOR_STRUCT_DIRENT _POSIX_NAME_MAX
-# endif
-# endif
-# if defined _XOPEN_NAME_MAX
-# if NAME_MAX_FOR_STRUCT_DIRENT < _XOPEN_NAME_MAX
-# undef NAME_MAX_FOR_STRUCT_DIRENT
-# define NAME_MAX_FOR_STRUCT_DIRENT _XOPEN_NAME_MAX
-# endif
-# endif
-# define DEFINE_STRUCT_DIRENT \
- union { \
- struct dirent dirent; \
- char dummy[offsetof(struct dirent, d_name) + \
- NAME_MAX_FOR_STRUCT_DIRENT + 1]; \
- }
-# define STRUCT_DIRENT(entry) ((entry).dirent)
-#else
-# define DEFINE_STRUCT_DIRENT struct dirent
-# define STRUCT_DIRENT(entry) (entry)
+# define READDIR(dir, enc) readdir((dir))
#endif
/*
@@ -624,11 +584,10 @@ dir_read(VALUE dir)
{
struct dir_data *dirp;
struct dirent *dp;
- IF_HAVE_READDIR_R(DEFINE_STRUCT_DIRENT entry);
GetDIR(dir, dirp);
errno = 0;
- if (READDIR(dirp->dir, dirp->enc, &STRUCT_DIRENT(entry), dp)) {
+ if ((dp = READDIR(dirp->dir, dirp->enc)) != NULL) {
return rb_external_str_new_with_enc(dp->d_name, NAMLEN(dp), dirp->enc);
}
else {
@@ -662,14 +621,13 @@ dir_each(VALUE dir)
{
struct dir_data *dirp;
struct dirent *dp;
- IF_HAVE_READDIR_R(DEFINE_STRUCT_DIRENT entry);
IF_HAVE_HFS(int hfs_p);
RETURN_ENUMERATOR(dir, 0, 0);
GetDIR(dir, dirp);
rewinddir(dirp->dir);
IF_HAVE_HFS(hfs_p = !NIL_P(dirp->path) && is_hfs(RSTRING_PTR(dirp->path)));
- while (READDIR(dirp->dir, dirp->enc, &STRUCT_DIRENT(entry), dp)) {
+ while ((dp = READDIR(dirp->dir, dirp->enc)) != NULL) {
const char *name = dp->d_name;
size_t namlen = NAMLEN(dp);
VALUE path;
@@ -1440,13 +1398,12 @@ glob_helper(
if (magical || recursive) {
struct dirent *dp;
DIR *dirp;
- IF_HAVE_READDIR_R(DEFINE_STRUCT_DIRENT entry);
IF_HAVE_HFS(int hfs_p);
dirp = do_opendir(*path ? path : ".", flags, enc);
if (dirp == NULL) return 0;
IF_HAVE_HFS(hfs_p = is_hfs(*path ? path : "."));
- while (READDIR(dirp, enc, &STRUCT_DIRENT(entry), dp)) {
+ while ((dp = READDIR(dirp, enc)) != NULL) {
char *buf;
enum answer new_isdir = UNKNOWN;
const char *name;