【问题标题】:copy_from_user function prints junk valuescopy_from_user 函数打印垃圾值
【发布时间】:2015-08-05 04:18:24
【问题描述】:

我正在尝试在内核空间中打印用户空间缓冲区的内容,但是我收到了一些垃圾字符,我不确定我哪里出错了。

SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
    unsigned, flags, struct sockaddr __user *, addr,
    int, addr_len) {

 char *messageRead = kmalloc(len,GFP_KERNEL);
 unsigned long bytesNotCopied = copy_from_user(messageRead,(char*)buff,len);
 printk("The messageRead Read is %s \n",messageRead);

.....
.....

}

bytesNotCopied 返回 0,因此我能够确认内容已被复制。但是当我尝试打印 messageRead 值时,它返回了一些垃圾值。

【问题讨论】:

  • 函数无法编译,因为缺少buff 的类型。在size_tlen 之间也有错位的逗号。
  • 这与套接字有什么关系?
  • alk,这是内核空间所遵循的格式。
  • 我怀疑它应该是:int printChar(void __user * buff, size_t len).
  • alk,感谢您的帮助,让我修改代码并重新发布,我正在尝试打印socket.c文件中的内容

标签: c linux sockets kernel


【解决方案1】:

返回值为 0 表示复制成功。 为什么要将缓冲区打印为字符串,即在 printk() 中使用 %s。 buff是用户进程中的字符串吗?如果不尝试这种方式倾倒

for(i=0; i<len; i++) /*make sure you declare i */
{
    printk("%x ",messageRead[i]);
}

【讨论】:

  • 是的,大部分 buff 是用户空间中的 char 字符串,我希望看到一些字符串被打印出来(例如 http get request、post ...),但我没有看到任何类似的信息,也按照建议让我尝试以十六进制格式打印。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多