X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fposix%2Ffilesystem.c;h=45df501fc80837b984bcb9a63579b19934d8eefa;hb=e9a3dca66588a2daf41c2061c835b4f32513ead5;hp=b4ba03a39ffbd7c10fb465d82d0872971ade7cfa;hpb=3dfba47808176d1c032e34166028843a4317567c;p=vlc diff --git a/src/posix/filesystem.c b/src/posix/filesystem.c index b4ba03a39f..45df501fc8 100644 --- a/src/posix/filesystem.c +++ b/src/posix/filesystem.c @@ -142,37 +142,18 @@ DIR *vlc_opendir (const char *dirname) /** * Reads the next file name from an open directory. * - * @param dir The directory that is being read + * @param dir directory handle as returned by vlc_opendir() + * (must not be used by another thread concurrently) * - * @return a UTF-8 string of the directory entry. Use free() to release it. + * @return a UTF-8 string of the directory entry. The string is valid until + * the next call to vlc_readdir() or closedir() on the handle. * If there are no more entries in the directory, NULL is returned. * If an error occurs, errno is set and NULL is returned. */ char *vlc_readdir( DIR *dir ) { - /* Beware that readdir_r() assumes is large enough to hold the result - * dirent including the file name. A buffer overflow could occur otherwise. - * In particular, pathconf() and _POSIX_NAME_MAX cannot be used here. */ - struct dirent *ent; - char *path = NULL; - - long len = fpathconf (dirfd (dir), _PC_NAME_MAX); - /* POSIX says there shall we room for NAME_MAX bytes at all times */ - if (len == -1 || len < NAME_MAX) - len = NAME_MAX; - len += sizeof (*ent) + 1 - sizeof (ent->d_name); - - struct dirent *buf = malloc (len); - if (unlikely(buf == NULL)) - return NULL; - - int val = readdir_r (dir, buf, &ent); - if (val != 0) - errno = val; - else if (ent != NULL) - path = strdup (ent->d_name); - free (buf); - return path; + struct dirent *ent = readdir (dir); + return (ent != NULL) ? ent->d_name : NULL; } /** @@ -230,18 +211,6 @@ int vlc_rename (const char *oldpath, const char *newpath) */ char *vlc_getcwd (void) { - /* Try $PWD */ - const char *pwd = getenv ("PWD"); - if (pwd != NULL) - { - struct stat s1, s2; - /* Make sure $PWD is correct */ - if (stat (pwd, &s1) == 0 && stat (".", &s2) == 0 - && s1.st_dev == s2.st_dev && s1.st_ino == s2.st_ino) - return strdup (pwd); - } - - /* Otherwise iterate getcwd() until the buffer is big enough */ long path_max = pathconf (".", _PC_PATH_MAX); size_t size = (path_max == -1 || path_max > 4096) ? 4096 : path_max; @@ -271,7 +240,7 @@ int vlc_dup (int oldfd) int newfd; #ifdef F_DUPFD_CLOEXEC - newfd = fcntl (oldfd, F_DUPFD_CLOEXEC); + newfd = fcntl (oldfd, F_DUPFD_CLOEXEC, 0); if (unlikely(newfd == -1 && errno == EINVAL)) #endif {