diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-06-02 22:38:11 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-06-02 22:38:11 +0000 |
commit | 523bd6737ea97bce1f92d2e171a09cc564b50125 (patch) | |
tree | cc2f30a1f08891d269c77148b5208a8eca9a38e4 /dir.c | |
parent | 284d7463924b313f12da8de5184af3407c3612ac (diff) | |
download | ruby-523bd6737ea97bce1f92d2e171a09cc564b50125.tar.gz |
* 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.c | 55 |
1 files changed, 6 insertions, 49 deletions
@@ -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; |