vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Wed Jul 27 19:35:15 2016 +0300| [13260b30685b4ec6a9cab4e0c715bee0295dab6b] | committer: Rémi Denis-Courmont
aout: fix aout_DevicesList() error handling Return -1 if and only if there was an error. Never return an incomplete list, and do not pretend an error occurred when the devices list is merely empty. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=13260b30685b4ec6a9cab4e0c715bee0295dab6b --- src/audio_output/output.c | 55 ++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/src/audio_output/output.c b/src/audio_output/output.c index f5363f1..90db056 100644 --- a/src/audio_output/output.c +++ b/src/audio_output/output.c @@ -692,41 +692,46 @@ int aout_DevicesList (audio_output_t *aout, char ***ids, char ***names) { aout_owner_t *owner = aout_owner (aout); char **tabid, **tabname; - unsigned count = 0; + unsigned i = 0; vlc_mutex_lock (&owner->dev.lock); tabid = malloc (sizeof (*tabid) * owner->dev.count); tabname = malloc (sizeof (*tabname) * owner->dev.count); - if(likely(tabid && tabname)) - { - for (aout_dev_t *dev = owner->dev.list; dev != NULL; dev = dev->next) - { - char *psz_id = strdup (dev->id); - if(unlikely(psz_id == NULL)) - break; - char *psz_name = strdup (dev->name); - if(unlikely(psz_name == NULL)) - { - free(psz_id); - break; - } + if (unlikely(tabid == NULL || tabname == NULL)) + goto error; + + *ids = tabid; + *names = tabname; + + for (aout_dev_t *dev = owner->dev.list; dev != NULL; dev = dev->next) + { + tabid[i] = strdup(dev->id); + if (unlikely(tabid[i] == NULL)) + goto error; - tabid[count] = psz_id; - tabname[count++] = psz_name; + tabname[i] = strdup(dev->name); + if (unlikely(tabname[i] == NULL)) + { + free(tabid[i]); + goto error; } + + i++; } vlc_mutex_unlock (&owner->dev.lock); - if(unlikely(count == 0)) + return i; + +error: + vlc_mutex_unlock(&owner->dev.lock); + while (i > 0) { - free(tabid); - free(tabname); - return -1; + i--; + free(tabname[i]); + free(tabid[i]); } - - *ids = tabid; - *names = tabname; - - return count; + free(tabname); + free(tabid); + return -1; } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
