1

整数 "timer_interval" (グローバル変数) を保持する sysfs ファイルのストア関数を作成しようとしています。

static ssize_t sys_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf,     size_t count)
{
  printk(KERN_ALERT "BUF IS %s and count is %d", buf, count);
  int ret;

  char *pTemp = kmalloc(100, GFP_KERNEL); 
  if (pTemp == NULL) 
  {
     printk(KERN_ALERT "malloc WRONG");
     return -EFAULT;
  }

  printk(KERN_ALERT "AFTER MALLOC");

  if (ret = copy_from_user(pTemp ,buf, count)) 
  {
    printk(KERN_ALERT "COPY WRONG %d", ret);
    kfree(pTemp);
    printk(KERN_ALERT "%d" , pTemp);
    return -EFAULT;
  }

  printk(KERN_ALERT "AFTER COPY");

  if (sscanf(pTemp, "%d", &Timer_interval) < count);
  {
    printk(KERN_ALERT "SCANF WRONG");
    kfree(pTemp);
    return -EFAULT;
  }

  printk(KERN_ALERT "AFTER SCANF COUNT = %d", Timer_interval);
  kfree(pTemp);
  return count;
}

問題はユーザーへのコピーにあります。dmesg は、割り当てに問題がないことを示しています。buf には正しいデータが含まれていますが、copy_from_user はバッファのサイズを返します。つまり、何もコピーされていません。

ここで何が間違っていますか?

4

1 に答える 1

1

ほとんどbufの場合、カーネル空間ポインターであり、使用する必要はありませんcopy_from_user。copy_from_user はカーネルによって呼び出されます。

アップデート。

bufユーザーからの直接バッファです。また、buf のデータが正しいかどうかを確認する必要があります。たとえば、数値を期待しているときに、関数をテキストで呼び出すことができます。

ところで。sscanf を呼び出す前に、どの pTemp 配列に null ターミネータが含まれているかを確認しません。また、バッファをコピーする場合は、src および dst バッファのサイズをチェックして、メモリの破損やセグメンテーション違反を防ぐ必要があります。

于 2012-05-15T10:59:16.627 に答える