linux字符串类型,如何在Linux内核中为char *类型字符串分配内存?

您应该在用户空间指针上使用strlen_user()而不是strlen() – 并且您应该只调用一次,并保持结果(否则,您有潜在的内核漏洞,因为第二个用户空间线程可能会更改缓冲区当你正在努力的时候).

或者,您可以使用strncpy_from_user().

除此之外,kmalloc看起来还不错.

(但实际上,正如ephemient所说,你应该重新考虑整个方法并使用count参数而不是将输入视为字符串).

由于您不能依赖写入以nul结尾的字符串的文件的数据,因此您需要在数据旁边保留data_len长度参数.那么你的读/写实现将沿着这些方向:

static char *data = NULL;

static size_t data_len;

static DEFINE_MUTEX(data_mutex);

static ssize_t memo_read(struct file *f,loff_t *f_pos

{

ssize_t retval = 0;

char *start;

mutex_lock(&data_mutex);

if (!data)

{

retval = -EINVAL; /* Or whatever you want to do here... */

goto out;

}

if (*f_pos >= data_len)

goto out; /* EOF */

start = data + *f_pos;

retval = data_len - *f_pos;

if (retval > count)

retval = count;

if (copy_to_user(buf,start,retval))

{

retval = -EFAULT;

goto out;

}

*f_pos += retval;

out:

mutex_unlock(&data_mutex);

return retval;

}

static ssize_t memo_write(struct file *filp,loff_t *f_pos)

{

ssize_t retval = -ENOMEM;

mutex_lock(&data_mutex);

if (data)

kfree(data);

data = kmalloc(count,GFP_KERNEL);

if (!data)

goto out;

if (copy_from_user(data,count))

{

kfree(data);

retval = -EFAULT;

goto out;

}

*f_pos = count;

retval = count;

data_len = count;

out:

mutex_unlock(&data_mutex);

return retval;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值