]> git.alsa-project.org Git - alsa-lib.git/commitdiff
snd_pcm_direct_parse_open_conf(): use thread-safe getgrnam_r()
authorJerome Forissier <jerome@taodyne.com>
Wed, 30 Jan 2013 15:22:17 +0000 (16:22 +0100)
committerTakashi Iwai <tiwai@suse.de>
Wed, 30 Jan 2013 16:07:12 +0000 (17:07 +0100)
Fixes a thread safety issue with snd_pcm_open().

Signed-off-by: Jerome Forissier <jerome@taodyne.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/pcm/pcm_direct.c

index 6802ecc7e24fbf8f4fde6daa99427930b016bf63..38c6c66283270c15a718457c314d5da7a9d084bb 100644 (file)
@@ -1629,13 +1629,20 @@ int snd_pcm_direct_parse_open_conf(snd_config_t *root, snd_config_t *conf,
                                continue;
                        }
                        if (isdigit(*group) == 0) {
-                               struct group *grp = getgrnam(group);
-                               if (grp == NULL) {
+                               long clen = sysconf(_SC_GETGR_R_SIZE_MAX);
+                               size_t len = (clen == -1) ? 1024 : (size_t)clen;
+                               struct group grp, *pgrp;
+                               char *buffer = (char *)malloc(len);
+                               if (buffer == NULL)
+                                       return -ENOMEM;
+                               int st = getgrnam_r(group, &grp, buffer, len, &pgrp);
+                               if (st != 0) {
                                        SNDERR("The field ipc_gid must be a valid group (create group %s)", group);
-                                       free(group);
+                                       free(buffer);
                                        return -EINVAL;
                                }
-                               rec->ipc_gid = grp->gr_gid;
+                               rec->ipc_gid = pgrp->gr_gid;
+                               free(buffer);
                        } else {
                                rec->ipc_gid = strtol(group, &endp, 10);
                        }