2009-12-02 2 views
3

전달 된 문자 버퍼를 수정하는 시스템 호출을 정의하려고합니다. 구체적으로는 다음과 같습니다.copy_to_user를 올바르게 사용하려면?

... 
asmlinkage int sys_mycall(char __user *buff, int len) 
{ 
    char tmp[1000]; 
    copy_from_user(tmp, buff, len); 
    /* change tmp here */ 
    copy_to_user(buff, &tmp, len); 
} 

여기서 copy_to_user는 -1을 반환하고 호출 프로그램의 버퍼는 변경되지 않습니다. 무슨 일이야?

+0

다음 호출된다 할 것이다 사용자로 가장 먼저하는 일 I : 문자 버피 [2000]; sys_mycall (buf, 2000); 어떻게해야합니까? –

+0

1000은 길이보다 엄격합니다. –

+0

또한 실제 코드에는 오류 검사가 있습니다. –

답변

5

괜찮아 보입니다. 사용자 공간이 전달한 버퍼는 읽기 전용으로 매핑 될 수 있습니다 (예 : 텍스트 세그먼트에있는 경우). 예 : 문자열 리터럴. 그건 그렇고 아마도 이것은 당신이 원하는 것일 것입니다 :

return copy_to_user(buff, &tmp, len) ? -EFAULT : 0; 
+0

실제 코드가 그렇게합니다. 핵심 문제를 설명하기 위해 예제를 단순화했습니다. –

+3

나는 C.를 싫어한다. 당신의 대답은 나의 문제를 완전히 해결하지만, 나는 왜 그런지 인정하지 않는다. –

+1

나는 누군가가 그들의 errno에 서명하는 것을 잊었다 고 생각한다 :) –

8

tmp는 이미 포인터입니다! 올바른 방법으로 그것을 할 :

copy_to_user(buff, tmp, len); 
+0

http://www.gnugeneration.com/mirrors/kernel-api/r4299.html – drahnr

관련 문제