函数ERR_PTR,PTR_ERR还有IS_ERR理解

news/2024/7/3 2:51:45

ERR_PTR()和PTR_ERR()都是很简单的类型转换,没有什么可说的。

IS_ERR()有一些妙处。
内核中的函数常常返回指针,问题是如果出错,也希望能够通过返回的指针体现出来。
所幸的是,内核返回的指针一般是指向页面的边界(4K边界),即

ptr & 0xfff == 0


这样ptr的值不可能落在(0xfffff000,0xffffffff)之间,
而一般内核的出错代码也是一个小负数,在-1000到0之间,转变成unsigned long,
正好在(0xfffff000,0xffffffff)之间。因此可以用

(unsigned long)ptr > (unsigned long)-1000L


来判断内核函数的返回值是一个有效的指针,还是一个出错代码。

以下是具体代码,当然,这只限于i386。


/*
* Kernel pointers have redundant information, so we can use a
* scheme where we can return either an error code or a dentry
* pointer with the same return value.
*
* This should be a per-architecture thing, to allow different
* error and pointer decisions.
*/
static inline void *ERR_PTR(long error)
{
return (void *) error;
}

static inline long PTR_ERR(const void *ptr)
{
return (long) ptr;
}

static inline long IS_ERR(const void *ptr)
{
return (unsigned long)ptr > (unsigned long)-1000L;
}




--------------------

 

可否还是介绍一下err_ptr和ptr_err?因为确实不知道他是作甚么用的。
非常感谢!
另外is_err说得非常清晰,再感谢一遍!

err_ptr和ptr_err就是强制类型转换,没有的话,编译器回报错。


http://www.niftyadmin.cn/n/4464085.html

相关文章

nginx环境下配置nagios-关于start_perl_cgi.sh

文件配置如下: #!/bin/bash set -x dir/export/servers/nginxstop () { #pkill -f $dir/perl-fcgi.pl kill $(cat $dir/logs/perl-fcgi.pid) rm $dir/logs/perl-fcgi.pid 2>/dev/null rm $dir/logs/perl-fcgi.sock 2>/dev/null echo "stop perl-fcgi d…

sys_call_table undefined 及 如何替换系统调用

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://chenm.blogbus.com/logs/52077181.html 2.4的内核中可以通过修改sys_call_table来很轻松的替换系统调用,来完成很多trick,很多的rootkit就是基于这种手法来完成的。…

nginx环境下配置nagios-关于perl-fcgi.pl

配置文件如下: 请注意,网上提供的官方文档在运行时可能会出现问题,此文中保证无问题。 #!/usr/bin/perl # # author Daniel Dominik Rudnicki # thanks to: Piotr Romanczuk # email danielsardz…

(转)在Linux2.6内核下实现进程隐藏

很早以前的小程序,比较简单但是觉得有趣原理很简单,Linux查看进程的命令ps是通过系统调用sys_getdents实现,sys_getdents用户获取一个指定路径下的目录条目,实际上就是枚举/proc/ 下的pid,这样我们只需要hook一下sys_…

2.6内核系统调用劫持段错误segment fault等问题的解决方法

在网上搜了很多关于2.6内核系统调用劫持的文章,流传的最多的可能就是那个以mkdir系统调用为例子的文章,自己按照源码敲进去,写好Makefile后也编译通过了,但是加载时却出现了Segment fault的错误,后来调试了一下&#x…

Linux2.6内核中劫持系统调用隐藏进程

网上很多类似的文章,其中很多示例程序都是在比较老的内核版本上测试过,很多在新的内核下根本无法运行,我收集了一些相关的资料,并给出一个在linux内核2.6.28(ubuntu9.04)上可以运行的程序代码.相比其他一些文章,修改如下:1.增加了两个函数,清CR0的第20位,不然在替换sys_call_ta…

windows和linux下如何远程获取操作系统版本和主机名

远程获取windows和linux操作系统版本和主机名需要具备以下条件: 假设 主机A(windows 7),ip:192.168.12.2 主机B(centos 6.3),ip:192.168.12.3 主机C(windows 2008)-为远程要获取信息的主机,ip:192.168.12.4 主机D(centos 6.3…

shell脚本-利用check_snmp查看远程linux操作系统版本

说明: 脚本通过本地执行check_snmp命令,获取远程linux操作系统版本,并将信息写入文本中 #!/bin/bash awk {print $1} list.txt |while read line do echo $line info/usr/local/nagios/libexec/check_snmp -H $line -C public -o sysDescr…