[pulseaudio-discuss] [PATCH] udev-detect: don't use readdir_r(), it's deprecated
Arun Raghavan
arun at arunraghavan.net
Thu Mar 9 05:41:30 UTC 2017
On Thu, 13 Oct 2016, at 07:52 PM, Tanu Kaskinen wrote:
> readdir_r() was supposed to be a thread-safe version of readdir(), but
> the interface turned out to be problematic. Due to the problems and the
> fact that readdir() is safe enough on modern libc implementations, glibc
> deprecated readdir_r() in version 2.24.
>
> The man page contains more information about what's wrong with
> readdir_r(): http://man7.org/linux/man-pages/man3/readdir_r.3.html
> ---
> src/modules/module-udev-detect.c | 22 +++++++++-------------
> 1 file changed, 9 insertions(+), 13 deletions(-)
>
> diff --git a/src/modules/module-udev-detect.c
> b/src/modules/module-udev-detect.c
> index bb41a96..3d7064f 100644
> --- a/src/modules/module-udev-detect.c
> +++ b/src/modules/module-udev-detect.c
> @@ -177,10 +177,8 @@ static bool is_card_busy(const char *id) {
> char *card_path = NULL, *pcm_path = NULL, *sub_status = NULL;
> DIR *card_dir = NULL, *pcm_dir = NULL;
> FILE *status_file = NULL;
> - size_t len;
> - struct dirent *space = NULL, *de;
> + struct dirent *de;
> bool busy = false;
> - int r;
>
> pa_assert(id);
>
> @@ -194,14 +192,11 @@ static bool is_card_busy(const char *id) {
> goto fail;
> }
>
> - len = offsetof(struct dirent, d_name) + fpathconf(dirfd(card_dir),
> _PC_NAME_MAX) + 1;
> - space = pa_xmalloc(len);
> -
> for (;;) {
> - de = NULL;
> -
> - if ((r = readdir_r(card_dir, space, &de)) != 0) {
> - pa_log_warn("readdir_r() failed: %s", pa_cstrerror(r));
> + errno = 0;
> + de = readdir(card_dir);
> + if (!de && errno) {
> + pa_log_warn("readdir() failed: %s", pa_cstrerror(errno));
> goto fail;
> }
>
> @@ -228,8 +223,10 @@ static bool is_card_busy(const char *id) {
> for (;;) {
> char line[32];
>
> - if ((r = readdir_r(pcm_dir, space, &de)) != 0) {
> - pa_log_warn("readdir_r() failed: %s", pa_cstrerror(r));
> + errno = 0;
> + de = readdir(pcm_dir);
> + if (!de && errno) {
> + pa_log_warn("readdir() failed: %s",
> pa_cstrerror(errno));
> goto fail;
> }
>
> @@ -267,7 +264,6 @@ fail:
> pa_xfree(card_path);
> pa_xfree(pcm_path);
> pa_xfree(sub_status);
> - pa_xfree(space);
>
> if (card_dir)
> closedir(card_dir);
> --
LGTM.
-- Arun
More information about the pulseaudio-discuss
mailing list