2016-04-15 9 views
1

Ich habe einige Testfälle ausgeführt, von denen ich weiß, dass sie dazu führen, dass mein Programm (im Kernel-Bereich ausgeführt) -EFAULT zurückgibt. Hier ist der Code, der den Fehler zurückgibt:Behavior oder -EFAULT, Linux Kernel

for (index = 0; index < size; index++){ 
     //copy_from_user checks to make sure input parameter is valid. Returns 0 on success 
     if(copy_from_user(&currentArrayElement, &data[index], sizeof(long))) { 
      printk("copy from user error \n");   
      return -EFAULT; 
      printk("copy from user error: just returned efault"); 
     } 
     else { 
     //parameter is ok 
     if (currentArrayElement < kernelStats.min) 
      kernelStats.min = currentArrayElement; 

     if (currentArrayElement > kernelStats.max) 
      kernelStats.max = currentArrayElement; 

     kernelStats.sum += currentArrayElement;  
     } 
    } 

    //print debugging info 
    printk("Min: %ld Max: %ld Sum: %ld\n", kernelStats.min, kernelStats.max, kernelStats.sum); 

Wenn der erste Block, wenn ausgelöst wird, scheint es, wie der EFAULT zurückgegeben werden, da die „Kopie von Benutzerfehler: nur zurück efault“ druckt nicht. Anstatt jedoch die Funktion vollständig zu beenden, werden die Debugging-Informationen im unteren Bereich gedruckt. Es scheint zu drucken, ob es einen EFAULT gibt oder nicht. Ist das eine Idiosynkrasie von EFAULT? Oder mache ich etwas falsch?

Antwort

2

(zu lang für einen Kommentar.)

return wird tun, was Sie erwarten, dass es unabhängig von den Parametern.

Ich würde wetten, dass Sie die Funktion mehr als einmal aufrufen. Beim ersten Mal sehen Sie copy from user error, und beim zweiten Mal sehen Sie die Debugging-Informationen.

Um diese Theorie zu testen, setzen Sie ein Extra printk oben rechts.