[alsa-devel] [bug report] ALSA: usb: add UAC3 BADD profiles support
Dan Carpenter
dan.carpenter at oracle.com
Wed May 16 13:32:54 CEST 2018
[ Your patch didn't really introduce the bug, it just made it visible
to static checkers. - dan ]
Hello Ruslan Bilovol,
The patch 17156f23e93c: "ALSA: usb: add UAC3 BADD profiles support"
from May 4, 2018, leads to the following static checker warning:
sound/usb/stream.c:984 snd_usb_get_audioformat_uac3()
warn: possible memory leak of 'chmap'
sound/usb/stream.c
864
865 chmap = kzalloc(sizeof(*chmap), GFP_KERNEL);
866 if (!chmap)
867 return ERR_PTR(-ENOMEM);
868
869 if (num_channels == 1) {
870 chmap->map[0] = SNDRV_CHMAP_MONO;
871 } else {
872 chmap->map[0] = SNDRV_CHMAP_FL;
873 chmap->map[1] = SNDRV_CHMAP_FR;
874 }
875
876 chmap->channels = num_channels;
877 clock = UAC3_BADD_CS_ID9;
878 goto found_clock;
879 }
880
881 as = snd_usb_find_csint_desc(alts->extra, alts->extralen,
882 NULL, UAC_AS_GENERAL);
883 if (!as) {
884 dev_err(&dev->dev,
885 "%u:%d : UAC_AS_GENERAL descriptor not found\n",
886 iface_no, altno);
887 return NULL;
888 }
889
890 if (as->bLength < sizeof(*as)) {
891 dev_err(&dev->dev,
892 "%u:%d : invalid UAC_AS_GENERAL desc\n",
893 iface_no, altno);
894 return NULL;
895 }
896
897 cluster_id = le16_to_cpu(as->wClusterDescrID);
898 if (!cluster_id) {
899 dev_err(&dev->dev,
900 "%u:%d : no cluster descriptor\n",
901 iface_no, altno);
902 return NULL;
903 }
904
905 /*
906 * Get number of channels and channel map through
907 * High Capability Cluster Descriptor
908 *
909 * First step: get High Capability header and
910 * read size of Cluster Descriptor
911 */
912 err = snd_usb_ctl_msg(chip->dev,
913 usb_rcvctrlpipe(chip->dev, 0),
914 UAC3_CS_REQ_HIGH_CAPABILITY_DESCRIPTOR,
915 USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
916 cluster_id,
917 snd_usb_ctrl_intf(chip),
918 &hc_header, sizeof(hc_header));
919 if (err < 0)
920 return ERR_PTR(err);
921 else if (err != sizeof(hc_header)) {
922 dev_err(&dev->dev,
923 "%u:%d : can't get High Capability descriptor\n",
924 iface_no, altno);
925 return ERR_PTR(-EIO);
926 }
927
928 /*
929 * Second step: allocate needed amount of memory
930 * and request Cluster Descriptor
931 */
932 wLength = le16_to_cpu(hc_header.wLength);
933 cluster = kzalloc(wLength, GFP_KERNEL);
934 if (!cluster)
935 return ERR_PTR(-ENOMEM);
936 err = snd_usb_ctl_msg(chip->dev,
937 usb_rcvctrlpipe(chip->dev, 0),
938 UAC3_CS_REQ_HIGH_CAPABILITY_DESCRIPTOR,
939 USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
940 cluster_id,
941 snd_usb_ctrl_intf(chip),
942 cluster, wLength);
943 if (err < 0) {
944 kfree(cluster);
945 return ERR_PTR(err);
946 } else if (err != wLength) {
947 dev_err(&dev->dev,
948 "%u:%d : can't get Cluster Descriptor\n",
949 iface_no, altno);
950 kfree(cluster);
951 return ERR_PTR(-EIO);
952 }
953
954 num_channels = cluster->bNrChannels;
955 chmap = convert_chmap_v3(cluster);
956 kfree(cluster);
957
958 /*
959 * lookup the terminal associated to this interface
960 * to extract the clock
961 */
962 input_term = snd_usb_find_input_terminal_descriptor(chip->ctrl_intf,
963 as->bTerminalLink);
964 if (input_term) {
965 clock = input_term->bCSourceID;
966 goto found_clock;
967 }
968
969 output_term = snd_usb_find_output_terminal_descriptor(chip->ctrl_intf,
970 as->bTerminalLink);
971 if (output_term) {
972 clock = output_term->bCSourceID;
973 goto found_clock;
974 }
975
976 dev_err(&dev->dev, "%u:%d : bogus bTerminalLink %d\n",
977 iface_no, altno, as->bTerminalLink);
978 return NULL;
979
980 found_clock:
981 fp = audio_format_alloc_init(chip, alts, UAC_VERSION_3, iface_no,
982 altset_idx, altno, num_channels, clock);
983 if (!fp)
984 return ERR_PTR(-ENOMEM);
We should free "chmap" before returning.
985
986 fp->chmap = chmap;
987
988 if (badd_profile >= UAC3_FUNCTION_SUBCLASS_GENERIC_IO) {
989 fp->attributes = 0; /* No attributes */
990
991 fp->fmt_type = UAC_FORMAT_TYPE_I;
992 fp->formats = badd_formats;
993
994 fp->nr_rates = 0; /* SNDRV_PCM_RATE_CONTINUOUS */
995 fp->rate_min = UAC3_BADD_SAMPLING_RATE;
996 fp->rate_max = UAC3_BADD_SAMPLING_RATE;
997 fp->rates = SNDRV_PCM_RATE_CONTINUOUS;
998
999 } else {
1000 fp->attributes = parse_uac_endpoint_attributes(chip, alts,
1001 UAC_VERSION_3,
1002 iface_no);
1003 /* ok, let's parse further... */
1004 if (snd_usb_parse_audio_format_v3(chip, fp, as, stream) < 0) {
1005 kfree(fp->rate_table);
1006 kfree(fp);
1007 return NULL;
And here as well? I don't know.
1008 }
1009 }
1010
1011 return fp;
1012 }
regards,
dan carpenter
More information about the Alsa-devel
mailing list