if (err < 0)
                goto end;
 
-       formats[eid] = kmalloc(*len, GFP_KERNEL);
+       formats[eid] = kmemdup(buf, *len, GFP_KERNEL);
        if (formats[eid] == NULL) {
                err = -ENOMEM;
                goto end;
        }
-       memcpy(formats[eid], buf, *len);
 
        /* apply the format for each available sampling rate */
        for (i = 0; i < ARRAY_SIZE(oxfw_rate_table); i++) {
                        continue;
 
                eid++;
-               formats[eid] = kmalloc(*len, GFP_KERNEL);
+               formats[eid] = kmemdup(buf, *len, GFP_KERNEL);
                if (formats[eid] == NULL) {
                        err = -ENOMEM;
                        goto end;
                }
-               memcpy(formats[eid], buf, *len);
                formats[eid][2] = avc_stream_rate_table[i];
        }
 
                if (err < 0)
                        break;
 
-               formats[eid] = kmalloc(len, GFP_KERNEL);
+               formats[eid] = kmemdup(buf, len, GFP_KERNEL);
                if (formats[eid] == NULL) {
                        err = -ENOMEM;
                        break;
                }
-               memcpy(formats[eid], buf, len);
 
                /* get next entry */
                len = AVC_GENERIC_FRAME_MAXIMUM_BYTES;