LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 773|回复: 2

memfrob()还有什么限制?总是段错误的?

[复制链接]
发表于 2010-6-15 23:23:57 | 显示全部楼层 |阅读模式
对于下面一个程序,就是把一个文件映射到内存,然后创建一个新文件也映射到内存,然后调用memfrob()函数把源文件的内存块加密,再把加密的内存块复制到新文件那里去。
但是却总是段错误,难道这个函数有什么限制么?
如果不要那个加密的函数的话就能够正常复制。
  1. #include <fcntl.h>
  2. #include <sys/mman.h>
  3. #include <string.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <unistd.h>

  7. #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)

  8. int
  9. main(int argc, char *argv[])
  10. {
  11.         int                fdin, fdout;
  12.         void        *src, *dst;
  13.         struct stat statbuf;

  14.         if(argc != 3)
  15.         {
  16.                 printf("usage: %s <fromfile> <tofile>", argv[0]);
  17.                 return 0;
  18.         }
  19.         fdin = open(argv[1], O_RDONLY);
  20.         fdout = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, FILE_MODE);
  21.         fstat(fdin, &statbuf);
  22.         lseek(fdout, statbuf.st_size - 1, SEEK_SET);
  23.         write(fdout, "", 1);
  24.         src = mmap(0, statbuf.st_size, PROT_READ, MAP_SHARED, fdin, 0);
  25.         dst = mmap(0, statbuf.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fdout, 0);
  26.         memfrob(src, statbuf.st_size);
  27.         memcpy(dst, src, statbuf.st_size);
  28.        
  29.         return 0;
  30. }
复制代码

尝试加密一个小文件。
  1. lucifer@cross:~/tmp$ cat tmp3.c
  2. /*printf 枚举可显示枚举的序号*/
  3. #include <stdio.h>
  4. int main(void)
  5. {
  6.         enum ABC{AAA,BBB,CCC};

  7.         enum ABC e1,e2,e3;

  8.         e1 = AAA;
  9.         e2 = BBB;
  10.         e3 = CCC;

  11.         printf("%d,%d,%d\n",e1,e2,e3);
  12.         getchar();
  13.         return 0;
  14. }
  15. lucifer@cross:~/tmp$ ./a.out tmp3.c ddd
  16. Segmentation fault
  17. lucifer@cross:~/tmp$
复制代码

GDB的调试信息,说明了是 memfrob () 函数出问题了。
  1. lucifer@cross:~/tmp$ gdb -q ./a.out
  2. Reading symbols from /home/lucifer/tmp/a.out...done.
  3. (gdb) r tmp3.c ddd
  4. Starting program: /home/lucifer/tmp/a.out tmp3.c ddd

  5. Program received signal SIGSEGV, Segmentation fault.
  6. 0x00007ffff7ae184e in memfrob () from /lib/libc.so.6
  7. (gdb) q
  8. A debugging session is active.

  9.         Inferior 1 [process 6216] will be killed.

  10. Quit anyway? (y or n) y
  11. lucifer@cross:~/tmp$
复制代码
发表于 2010-6-17 12:30:54 | 显示全部楼层
把memfrob和memcpy这两行改为

memcpy(dst, src, statbuf.st_size);
memfrob(dst, statbuf.st_size);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-17 16:42:26 | 显示全部楼层
Post by x11;2097097
把memfrob和memcpy这两行改为

memcpy(dst, src, statbuf.st_size);
memfrob(dst, statbuf.st_size);


哦~

我知道了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表