Hi Ruslan,
Thank you for the patch! Perhaps something to improve:
url: https://github.com/0day-ci/linux/commits/Ruslan-Bilovol/USB-Audio-Device-Cla... base: https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git for-next
smatch warnings: sound/usb/stream.c:964 snd_usb_get_audioformat_uac3() warn: possible memory leak of 'chmap'
# https://github.com/0day-ci/linux/commit/7e255927f3e697fce36dcd48f205a7997771... git remote add linux-review https://github.com/0day-ci/linux git remote update linux-review git checkout 7e255927f3e697fce36dcd48f205a7997771ed4d vim +/chmap +964 sound/usb/stream.c
9a2fe9b801 Ruslan Bilovol 2018-03-21 791 1145e3d13b Ruslan Bilovol 2018-04-14 792 static struct audioformat * 1145e3d13b Ruslan Bilovol 2018-04-14 793 snd_usb_get_audioformat_uac3(struct snd_usb_audio *chip, 1145e3d13b Ruslan Bilovol 2018-04-14 794 struct usb_host_interface *alts, 1145e3d13b Ruslan Bilovol 2018-04-14 795 int iface_no, int altno, int stream) 1145e3d13b Ruslan Bilovol 2018-04-14 796 { 1145e3d13b Ruslan Bilovol 2018-04-14 797 struct usb_device *dev = chip->dev; 9a2fe9b801 Ruslan Bilovol 2018-03-21 798 struct uac3_input_terminal_descriptor *input_term; 9a2fe9b801 Ruslan Bilovol 2018-03-21 799 struct uac3_output_terminal_descriptor *output_term; 9a2fe9b801 Ruslan Bilovol 2018-03-21 800 struct uac3_cluster_header_descriptor *cluster; 7e255927f3 Ruslan Bilovol 2018-04-14 801 struct uac3_as_header_descriptor *as = NULL; 9a2fe9b801 Ruslan Bilovol 2018-03-21 802 struct uac3_hc_descriptor_header hc_header; 1145e3d13b Ruslan Bilovol 2018-04-14 803 struct snd_pcm_chmap_elem *chmap; 7e255927f3 Ruslan Bilovol 2018-04-14 804 unsigned char badd_profile; 7e255927f3 Ruslan Bilovol 2018-04-14 805 u64 badd_formats = 0; 1145e3d13b Ruslan Bilovol 2018-04-14 806 unsigned int num_channels; 1145e3d13b Ruslan Bilovol 2018-04-14 807 struct audioformat *fp; 9a2fe9b801 Ruslan Bilovol 2018-03-21 808 u16 cluster_id, wLength; 1145e3d13b Ruslan Bilovol 2018-04-14 809 int clock = 0; 1145e3d13b Ruslan Bilovol 2018-04-14 810 int err; 9a2fe9b801 Ruslan Bilovol 2018-03-21 811 7e255927f3 Ruslan Bilovol 2018-04-14 812 badd_profile = chip->badd_profile; 7e255927f3 Ruslan Bilovol 2018-04-14 813 7e255927f3 Ruslan Bilovol 2018-04-14 814 if (badd_profile >= UAC3_FUNCTION_SUBCLASS_GENERIC_IO) { 7e255927f3 Ruslan Bilovol 2018-04-14 815 unsigned int maxpacksize = 7e255927f3 Ruslan Bilovol 2018-04-14 816 le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); 7e255927f3 Ruslan Bilovol 2018-04-14 817 7e255927f3 Ruslan Bilovol 2018-04-14 818 switch (maxpacksize) { 7e255927f3 Ruslan Bilovol 2018-04-14 819 default: 7e255927f3 Ruslan Bilovol 2018-04-14 820 dev_err(&dev->dev, 7e255927f3 Ruslan Bilovol 2018-04-14 821 "%u:%d : incorrect wMaxPacketSize for BADD profile\n", 7e255927f3 Ruslan Bilovol 2018-04-14 822 iface_no, altno); 7e255927f3 Ruslan Bilovol 2018-04-14 823 return NULL; 7e255927f3 Ruslan Bilovol 2018-04-14 824 case UAC3_BADD_EP_MAXPSIZE_SYNC_MONO_16: 7e255927f3 Ruslan Bilovol 2018-04-14 825 case UAC3_BADD_EP_MAXPSIZE_ASYNC_MONO_16: 7e255927f3 Ruslan Bilovol 2018-04-14 826 badd_formats = SNDRV_PCM_FMTBIT_S16_LE; 7e255927f3 Ruslan Bilovol 2018-04-14 827 num_channels = 1; 7e255927f3 Ruslan Bilovol 2018-04-14 828 break; 7e255927f3 Ruslan Bilovol 2018-04-14 829 case UAC3_BADD_EP_MAXPSIZE_SYNC_MONO_24: 7e255927f3 Ruslan Bilovol 2018-04-14 830 case UAC3_BADD_EP_MAXPSIZE_ASYNC_MONO_24: 7e255927f3 Ruslan Bilovol 2018-04-14 831 badd_formats = SNDRV_PCM_FMTBIT_S24_3LE; 7e255927f3 Ruslan Bilovol 2018-04-14 832 num_channels = 1; 7e255927f3 Ruslan Bilovol 2018-04-14 833 break; 7e255927f3 Ruslan Bilovol 2018-04-14 834 case UAC3_BADD_EP_MAXPSIZE_SYNC_STEREO_16: 7e255927f3 Ruslan Bilovol 2018-04-14 835 case UAC3_BADD_EP_MAXPSIZE_ASYNC_STEREO_16: 7e255927f3 Ruslan Bilovol 2018-04-14 836 badd_formats = SNDRV_PCM_FMTBIT_S16_LE; 7e255927f3 Ruslan Bilovol 2018-04-14 837 num_channels = 2; 7e255927f3 Ruslan Bilovol 2018-04-14 838 break; 7e255927f3 Ruslan Bilovol 2018-04-14 839 case UAC3_BADD_EP_MAXPSIZE_SYNC_STEREO_24: 7e255927f3 Ruslan Bilovol 2018-04-14 840 case UAC3_BADD_EP_MAXPSIZE_ASYNC_STEREO_24: 7e255927f3 Ruslan Bilovol 2018-04-14 841 badd_formats = SNDRV_PCM_FMTBIT_S24_3LE; 7e255927f3 Ruslan Bilovol 2018-04-14 842 num_channels = 2; 7e255927f3 Ruslan Bilovol 2018-04-14 843 break; 7e255927f3 Ruslan Bilovol 2018-04-14 844 } 7e255927f3 Ruslan Bilovol 2018-04-14 845 7e255927f3 Ruslan Bilovol 2018-04-14 846 chmap = kzalloc(sizeof(*chmap), GFP_KERNEL); 7e255927f3 Ruslan Bilovol 2018-04-14 847 if (!chmap) 7e255927f3 Ruslan Bilovol 2018-04-14 848 return ERR_PTR(-ENOMEM); 7e255927f3 Ruslan Bilovol 2018-04-14 849 7e255927f3 Ruslan Bilovol 2018-04-14 850 if (num_channels == 1) { 7e255927f3 Ruslan Bilovol 2018-04-14 851 chmap->map[0] = SNDRV_CHMAP_MONO; 7e255927f3 Ruslan Bilovol 2018-04-14 852 } else { 7e255927f3 Ruslan Bilovol 2018-04-14 853 chmap->map[0] = SNDRV_CHMAP_FL; 7e255927f3 Ruslan Bilovol 2018-04-14 854 chmap->map[1] = SNDRV_CHMAP_FR; 7e255927f3 Ruslan Bilovol 2018-04-14 855 } 7e255927f3 Ruslan Bilovol 2018-04-14 856 7e255927f3 Ruslan Bilovol 2018-04-14 857 chmap->channels = num_channels; 7e255927f3 Ruslan Bilovol 2018-04-14 858 clock = UAC3_BADD_CS_ID9; 7e255927f3 Ruslan Bilovol 2018-04-14 859 goto found_clock; 7e255927f3 Ruslan Bilovol 2018-04-14 860 } 7e255927f3 Ruslan Bilovol 2018-04-14 861 1145e3d13b Ruslan Bilovol 2018-04-14 862 as = snd_usb_find_csint_desc(alts->extra, alts->extralen, 9a2fe9b801 Ruslan Bilovol 2018-03-21 863 NULL, UAC_AS_GENERAL); 9a2fe9b801 Ruslan Bilovol 2018-03-21 864 if (!as) { 9a2fe9b801 Ruslan Bilovol 2018-03-21 865 dev_err(&dev->dev, 9a2fe9b801 Ruslan Bilovol 2018-03-21 866 "%u:%d : UAC_AS_GENERAL descriptor not found\n", 9a2fe9b801 Ruslan Bilovol 2018-03-21 867 iface_no, altno); 1145e3d13b Ruslan Bilovol 2018-04-14 868 return NULL; e8e8babf56 Daniel Mack 2011-09-12 869 } e8e8babf56 Daniel Mack 2011-09-12 870 9a2fe9b801 Ruslan Bilovol 2018-03-21 871 if (as->bLength < sizeof(*as)) { 9a2fe9b801 Ruslan Bilovol 2018-03-21 872 dev_err(&dev->dev, 9a2fe9b801 Ruslan Bilovol 2018-03-21 873 "%u:%d : invalid UAC_AS_GENERAL desc\n", 9a2fe9b801 Ruslan Bilovol 2018-03-21 874 iface_no, altno); 1145e3d13b Ruslan Bilovol 2018-04-14 875 return NULL; 9a2fe9b801 Ruslan Bilovol 2018-03-21 876 } 9a2fe9b801 Ruslan Bilovol 2018-03-21 877 9a2fe9b801 Ruslan Bilovol 2018-03-21 878 cluster_id = le16_to_cpu(as->wClusterDescrID); 9a2fe9b801 Ruslan Bilovol 2018-03-21 879 if (!cluster_id) { 9a2fe9b801 Ruslan Bilovol 2018-03-21 880 dev_err(&dev->dev, 9a2fe9b801 Ruslan Bilovol 2018-03-21 881 "%u:%d : no cluster descriptor\n", 9a2fe9b801 Ruslan Bilovol 2018-03-21 882 iface_no, altno); 1145e3d13b Ruslan Bilovol 2018-04-14 883 return NULL; 9a2fe9b801 Ruslan Bilovol 2018-03-21 884 } 9a2fe9b801 Ruslan Bilovol 2018-03-21 885 9a2fe9b801 Ruslan Bilovol 2018-03-21 886 /* 9a2fe9b801 Ruslan Bilovol 2018-03-21 887 * Get number of channels and channel map through 9a2fe9b801 Ruslan Bilovol 2018-03-21 888 * High Capability Cluster Descriptor 9a2fe9b801 Ruslan Bilovol 2018-03-21 889 * 9a2fe9b801 Ruslan Bilovol 2018-03-21 890 * First step: get High Capability header and 9a2fe9b801 Ruslan Bilovol 2018-03-21 891 * read size of Cluster Descriptor 9a2fe9b801 Ruslan Bilovol 2018-03-21 892 */ 9a2fe9b801 Ruslan Bilovol 2018-03-21 893 err = snd_usb_ctl_msg(chip->dev, 9a2fe9b801 Ruslan Bilovol 2018-03-21 894 usb_rcvctrlpipe(chip->dev, 0), 9a2fe9b801 Ruslan Bilovol 2018-03-21 895 UAC3_CS_REQ_HIGH_CAPABILITY_DESCRIPTOR, 9a2fe9b801 Ruslan Bilovol 2018-03-21 896 USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN, 9a2fe9b801 Ruslan Bilovol 2018-03-21 897 cluster_id, 9a2fe9b801 Ruslan Bilovol 2018-03-21 898 snd_usb_ctrl_intf(chip), 9a2fe9b801 Ruslan Bilovol 2018-03-21 899 &hc_header, sizeof(hc_header)); 9a2fe9b801 Ruslan Bilovol 2018-03-21 900 if (err < 0) 1145e3d13b Ruslan Bilovol 2018-04-14 901 return ERR_PTR(err); 9a2fe9b801 Ruslan Bilovol 2018-03-21 902 else if (err != sizeof(hc_header)) { 9a2fe9b801 Ruslan Bilovol 2018-03-21 903 dev_err(&dev->dev, 9a2fe9b801 Ruslan Bilovol 2018-03-21 904 "%u:%d : can't get High Capability descriptor\n", 9a2fe9b801 Ruslan Bilovol 2018-03-21 905 iface_no, altno); 1145e3d13b Ruslan Bilovol 2018-04-14 906 return ERR_PTR(-EIO); 9a2fe9b801 Ruslan Bilovol 2018-03-21 907 } 9a2fe9b801 Ruslan Bilovol 2018-03-21 908 9a2fe9b801 Ruslan Bilovol 2018-03-21 909 /* 9a2fe9b801 Ruslan Bilovol 2018-03-21 910 * Second step: allocate needed amount of memory 9a2fe9b801 Ruslan Bilovol 2018-03-21 911 * and request Cluster Descriptor 9a2fe9b801 Ruslan Bilovol 2018-03-21 912 */ 9a2fe9b801 Ruslan Bilovol 2018-03-21 913 wLength = le16_to_cpu(hc_header.wLength); 9a2fe9b801 Ruslan Bilovol 2018-03-21 914 cluster = kzalloc(wLength, GFP_KERNEL); 9a2fe9b801 Ruslan Bilovol 2018-03-21 915 if (!cluster) 1145e3d13b Ruslan Bilovol 2018-04-14 916 return ERR_PTR(-ENOMEM); 9a2fe9b801 Ruslan Bilovol 2018-03-21 917 err = snd_usb_ctl_msg(chip->dev, 9a2fe9b801 Ruslan Bilovol 2018-03-21 918 usb_rcvctrlpipe(chip->dev, 0), 9a2fe9b801 Ruslan Bilovol 2018-03-21 919 UAC3_CS_REQ_HIGH_CAPABILITY_DESCRIPTOR, 9a2fe9b801 Ruslan Bilovol 2018-03-21 920 USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN, 9a2fe9b801 Ruslan Bilovol 2018-03-21 921 cluster_id, 9a2fe9b801 Ruslan Bilovol 2018-03-21 922 snd_usb_ctrl_intf(chip), 9a2fe9b801 Ruslan Bilovol 2018-03-21 923 cluster, wLength); 9a2fe9b801 Ruslan Bilovol 2018-03-21 924 if (err < 0) { 9a2fe9b801 Ruslan Bilovol 2018-03-21 925 kfree(cluster); 1145e3d13b Ruslan Bilovol 2018-04-14 926 return ERR_PTR(err); 9a2fe9b801 Ruslan Bilovol 2018-03-21 927 } else if (err != wLength) { 9a2fe9b801 Ruslan Bilovol 2018-03-21 928 dev_err(&dev->dev, 9a2fe9b801 Ruslan Bilovol 2018-03-21 929 "%u:%d : can't get Cluster Descriptor\n", 9a2fe9b801 Ruslan Bilovol 2018-03-21 930 iface_no, altno); 9a2fe9b801 Ruslan Bilovol 2018-03-21 931 kfree(cluster); 1145e3d13b Ruslan Bilovol 2018-04-14 932 return ERR_PTR(-EIO); 9a2fe9b801 Ruslan Bilovol 2018-03-21 933 } 9a2fe9b801 Ruslan Bilovol 2018-03-21 934 9a2fe9b801 Ruslan Bilovol 2018-03-21 935 num_channels = cluster->bNrChannels; 1145e3d13b Ruslan Bilovol 2018-04-14 936 chmap = convert_chmap_v3(cluster); 9a2fe9b801 Ruslan Bilovol 2018-03-21 937 kfree(cluster); 9a2fe9b801 Ruslan Bilovol 2018-03-21 938 1145e3d13b Ruslan Bilovol 2018-04-14 939 /* 1145e3d13b Ruslan Bilovol 2018-04-14 940 * lookup the terminal associated to this interface 1145e3d13b Ruslan Bilovol 2018-04-14 941 * to extract the clock 1145e3d13b Ruslan Bilovol 2018-04-14 942 */ 1145e3d13b Ruslan Bilovol 2018-04-14 943 input_term = snd_usb_find_input_terminal_descriptor(chip->ctrl_intf, 9a2fe9b801 Ruslan Bilovol 2018-03-21 944 as->bTerminalLink); 9a2fe9b801 Ruslan Bilovol 2018-03-21 945 if (input_term) { 9a2fe9b801 Ruslan Bilovol 2018-03-21 946 clock = input_term->bCSourceID; 1145e3d13b Ruslan Bilovol 2018-04-14 947 goto found_clock; 9a2fe9b801 Ruslan Bilovol 2018-03-21 948 } 9a2fe9b801 Ruslan Bilovol 2018-03-21 949 9a2fe9b801 Ruslan Bilovol 2018-03-21 950 output_term = snd_usb_find_output_terminal_descriptor(chip->ctrl_intf, 9a2fe9b801 Ruslan Bilovol 2018-03-21 951 as->bTerminalLink); 9a2fe9b801 Ruslan Bilovol 2018-03-21 952 if (output_term) { 9a2fe9b801 Ruslan Bilovol 2018-03-21 953 clock = output_term->bCSourceID; 1145e3d13b Ruslan Bilovol 2018-04-14 954 goto found_clock; 9a2fe9b801 Ruslan Bilovol 2018-03-21 955 } 9a2fe9b801 Ruslan Bilovol 2018-03-21 956 1145e3d13b Ruslan Bilovol 2018-04-14 957 dev_err(&dev->dev, "%u:%d : bogus bTerminalLink %d\n", 9a2fe9b801 Ruslan Bilovol 2018-03-21 958 iface_no, altno, as->bTerminalLink); 1145e3d13b Ruslan Bilovol 2018-04-14 959 return NULL; e8e8babf56 Daniel Mack 2011-09-12 960 1145e3d13b Ruslan Bilovol 2018-04-14 961 found_clock: e8e8babf56 Daniel Mack 2011-09-12 962 fp = kzalloc(sizeof(*fp), GFP_KERNEL); 9ecb2406de Markus Elfring 2017-08-11 963 if (!fp) 1145e3d13b Ruslan Bilovol 2018-04-14 @964 return ERR_PTR(-ENOMEM); e8e8babf56 Daniel Mack 2011-09-12 965 e8e8babf56 Daniel Mack 2011-09-12 966 fp->iface = iface_no; e8e8babf56 Daniel Mack 2011-09-12 967 fp->altsetting = altno; e8e8babf56 Daniel Mack 2011-09-12 968 fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress; e8e8babf56 Daniel Mack 2011-09-12 969 fp->ep_attr = get_endpoint(alts, 0)->bmAttributes; e8e8babf56 Daniel Mack 2011-09-12 970 fp->datainterval = snd_usb_parse_datainterval(chip, alts); 1145e3d13b Ruslan Bilovol 2018-04-14 971 fp->protocol = UAC_VERSION_3; e8e8babf56 Daniel Mack 2011-09-12 972 fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); e8e8babf56 Daniel Mack 2011-09-12 973 fp->channels = num_channels; e8e8babf56 Daniel Mack 2011-09-12 974 if (snd_usb_get_speed(dev) == USB_SPEED_HIGH) e8e8babf56 Daniel Mack 2011-09-12 975 fp->maxpacksize = (((fp->maxpacksize >> 11) & 3) + 1) e8e8babf56 Daniel Mack 2011-09-12 976 * (fp->maxpacksize & 0x7ff); e8e8babf56 Daniel Mack 2011-09-12 977 fp->clock = clock; 1145e3d13b Ruslan Bilovol 2018-04-14 978 fp->chmap = chmap; 836b34a935 Vladis Dronov 2016-03-31 979 INIT_LIST_HEAD(&fp->list); e8e8babf56 Daniel Mack 2011-09-12 980 7e255927f3 Ruslan Bilovol 2018-04-14 981 if (badd_profile >= UAC3_FUNCTION_SUBCLASS_GENERIC_IO) { 7e255927f3 Ruslan Bilovol 2018-04-14 982 fp->attributes = 0; /* No attributes */ 7e255927f3 Ruslan Bilovol 2018-04-14 983 7e255927f3 Ruslan Bilovol 2018-04-14 984 fp->fmt_type = UAC_FORMAT_TYPE_I; 7e255927f3 Ruslan Bilovol 2018-04-14 985 fp->formats = badd_formats; 7e255927f3 Ruslan Bilovol 2018-04-14 986 7e255927f3 Ruslan Bilovol 2018-04-14 987 fp->nr_rates = 0; /* SNDRV_PCM_RATE_CONTINUOUS */ 7e255927f3 Ruslan Bilovol 2018-04-14 988 fp->rate_min = UAC3_BADD_SAMPLING_RATE; 7e255927f3 Ruslan Bilovol 2018-04-14 989 fp->rate_max = UAC3_BADD_SAMPLING_RATE; 7e255927f3 Ruslan Bilovol 2018-04-14 990 fp->rates = SNDRV_PCM_RATE_CONTINUOUS; 7e255927f3 Ruslan Bilovol 2018-04-14 991 7e255927f3 Ruslan Bilovol 2018-04-14 992 } else { 7e255927f3 Ruslan Bilovol 2018-04-14 993 fp->attributes = parse_uac_endpoint_attributes(chip, alts, 7e255927f3 Ruslan Bilovol 2018-04-14 994 UAC_VERSION_3, 7e255927f3 Ruslan Bilovol 2018-04-14 995 iface_no); e8e8babf56 Daniel Mack 2011-09-12 996 /* ok, let's parse further... */ 1145e3d13b Ruslan Bilovol 2018-04-14 997 if (snd_usb_parse_audio_format_v3(chip, fp, as, stream) < 0) { e8e8babf56 Daniel Mack 2011-09-12 998 kfree(fp->rate_table); e8e8babf56 Daniel Mack 2011-09-12 999 kfree(fp); 1145e3d13b Ruslan Bilovol 2018-04-14 1000 return NULL; e8e8babf56 Daniel Mack 2011-09-12 1001 } 7e255927f3 Ruslan Bilovol 2018-04-14 1002 } 9a2fe9b801 Ruslan Bilovol 2018-03-21 1003 1145e3d13b Ruslan Bilovol 2018-04-14 1004 return fp; 1145e3d13b Ruslan Bilovol 2018-04-14 1005 } 9a2fe9b801 Ruslan Bilovol 2018-03-21 1006
--- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation