static char quirks_param[128];
 
-static int quirks_param_set(const char *val, const struct kernel_param *kp)
+static int quirks_param_set(const char *value, const struct kernel_param *kp)
 {
-       char *p, *field;
+       char *val, *p, *field;
        u16 vid, pid;
        u32 flags;
        size_t i;
        int err;
 
+       val = kstrdup(value, GFP_KERNEL);
+       if (!val)
+               return -ENOMEM;
+
        err = param_set_copystring(val, kp);
-       if (err)
+       if (err) {
+               kfree(val);
                return err;
+       }
 
        mutex_lock(&quirk_mutex);
 
        if (!quirk_list) {
                quirk_count = 0;
                mutex_unlock(&quirk_mutex);
+               kfree(val);
                return -ENOMEM;
        }
 
-       for (i = 0, p = (char *)val; p && *p;) {
+       for (i = 0, p = val; p && *p;) {
                /* Each entry consists of VID:PID:flags */
                field = strsep(&p, ":");
                if (!field)
 
 unlock:
        mutex_unlock(&quirk_mutex);
+       kfree(val);
 
        return 0;
 }