copy_to(from)_user시에 \0까지도 통째로 복사하는 방법은 없나

ilgoddes의 이미지

안녕하세요...

커널에서 copy_from_user를 이용하여 파일을 읽어들인 다음에

암호화를 해서 다시 copy_to_user로 파일에 집어넣는걸 하고 있는데요...

정말 큰 벽을 만나서......

암호화를 하면 데이터가 깨지거든요...

그런데 그 깨진 데이터 안에 NULL값이 들어있어요...

그걸 다시 copy_to_user로 복사를 하려니 NULL을 만나면 그냥 말아버리네요...

어떻게 방법이 없을까요?

혹시나 해서 copy_to_user 정의되어 있는 곳을 고쳐볼라고도 했는데...

asm으로 짜여있어서...ㅡㅡ;

꼭 도움 부탁드립니다...

pastime의 이미지

copy_from/to_user 함수는 복사되지 않은 데이터의 양을 리턴합니다.
이 값을 이용하시는 것은 어떨지..

charsyam의 이미지

ilgoddes wrote:
안녕하세요...

커널에서 copy_from_user를 이용하여 파일을 읽어들인 다음에

암호화를 해서 다시 copy_to_user로 파일에 집어넣는걸 하고 있는데요...

정말 큰 벽을 만나서......

암호화를 하면 데이터가 깨지거든요...

그런데 그 깨진 데이터 안에 NULL값이 들어있어요...

그걸 다시 copy_to_user로 복사를 하려니 NULL을 만나면 그냥 말아버리네요...

어떻게 방법이 없을까요?

혹시나 해서 copy_to_user 정의되어 있는 곳을 고쳐볼라고도 했는데...

asm으로 짜여있어서...ㅡㅡ;

꼭 도움 부탁드립니다...

음, 저 같은 copy_from_user 같은 함수를
보고, 직접 만들어 보겠습니다. 고운 하루되세요.

=========================
CharSyam ^^ --- 고운 하루
=========================

hb_kim의 이미지

copy_to_user 는 string 처리 함수가 아닙니다. NULL 을 만난다고 copy 를 중단하거나 하지 않습니다. User memory <-> kernel memory 복사용 string 처리 함수는 따로 있습니다.

user 쪽에서 할당한 구조체의 크기와, 드라이버에서 복사하려는 구조체의 크기를 잘 검토해보세요.

cocas의 이미지

charsyam wrote:
ilgoddes wrote:
안녕하세요...

커널에서 copy_from_user를 이용하여 파일을 읽어들인 다음에

암호화를 해서 다시 copy_to_user로 파일에 집어넣는걸 하고 있는데요...

정말 큰 벽을 만나서......

암호화를 하면 데이터가 깨지거든요...

그런데 그 깨진 데이터 안에 NULL값이 들어있어요...

그걸 다시 copy_to_user로 복사를 하려니 NULL을 만나면 그냥 말아버리네요...

어떻게 방법이 없을까요?

혹시나 해서 copy_to_user 정의되어 있는 곳을 고쳐볼라고도 했는데...

asm으로 짜여있어서...ㅡㅡ;

꼭 도움 부탁드립니다...

음, 저 같은 copy_from_user 같은 함수를
보고, 직접 만들어 보겠습니다. 고운 하루되세요.

저 부분이 상당히 아키텍쳐 의존적이다 보니 범용 모듈을 만들고 계신다면 꽤 어렵겠네요.

hb_kim의 이미지

charsyam wrote:

음, 저 같은 copy_from_user 같은 함수를
보고, 직접 만들어 보겠습니다. 고운 하루되세요.

커널 프로그래밍에서는 위험한 발상입니다. 자신이 쓰고 싶은 기능이 커널 infrastructure 에 구현되어 있지 않다는 것은 기존의 모든 모듈/드라이버들도 그런 기능을 사용하지 않고 구현되었다는것을 암시하죠. 왜 그런지를 먼저 이해한 다음에 어떻게 대처할지를 정해도 늦지 않습니다.

pastime의 이미지

254 /* Generic arbitrary sized copy.  */
255 #define __copy_user(to,from,size)                                       \
256 do {                                                                    \
257         int __d0, __d1;                                                 \
258         __asm__ __volatile__(                                           \
259                 "0:     rep; movsl\n"                                   \
260                 "       movl %3,%0\n"                                   \
261                 "1:     rep; movsb\n"                                   \
262                 "2:\n"                                                  \
263                 ".section .fixup,\"ax\"\n"                              \
264                 "3:     lea 0(%3,%0,4),%0\n"                            \
265                 "       jmp 2b\n"                                       \
266                 ".previous\n"                                           \
267                 ".section __ex_table,\"a\"\n"                           \
268                 "       .align 4\n"                                     \
269                 "       .long 0b,3b\n"                                  \
270                 "       .long 1b,2b\n"                                  \
271                 ".previous"                                             \
272                 : "=&c"(size), "=&D" (__d0), "=&S" (__d1)               \
273                 : "r"(size & 3), ""(size / 4), "1"(to), "2"(from)      \
274                 : "memory");                                            \
275 } while (0)

copy_from/to_user 를 살펴보다가 궁금한 점이 생겨서 다시 질문을 올립니다.. :)

먼저 264 번 라인의 lea 명령어에 사용된 0(%3,%0,4) 부분이 어떻게 해석되는지 궁금하고
그 아래에서 jmp 2b 를 부르면 제어가 어떻게 넘어가는 것인지도 알고 싶습니다. (리턴(종료?)되는 것인듯 한데..)
또 273 번 라인에서 "1"(to), "2"(from) 는 __d0, __d1 의 초기값이 되는건가요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.