2017-07-03 66 views
1

程序运行至getsockname,返回值为-1,errno为9(EBADF,坏文件描述符)。但是,Android应用程序中的代码运行良好。getsockname返回-1,errno是EBADF?

void sysLibCSendHookHandler(CPUState* env, int isStart){ 

if(isStart){ 
    int fd = env->regs[0]; 
    int buf = env->regs[1]; 
    int len = env->regs[2]; 
    int flags = env->regs[3]; 
    DECAF_printf("xxxxx send(%d, %p, %d, %d)\n", fd, buf, len, flags); 
    extern int errno; 
    struct sockaddr_un sock_addr; 
    socklen_t sock_addr_len; 
    sock_addr_len = sizeof(sock_addr); 
    int t = getsockname(fd, (struct sockaddr*)&sock_addr, &sock_addr_len); 
    DECAF_printf("fd:%d",fd);} 
+0

*“但是,在Android应用程序中安装的代码进行得很顺利......”* - 这是否意味着问题出在模拟器中? – jww

+1

'EBADF'表示传递给'getsockname()'的文件描述符无效。这段代码*暗示*你以某种方式挂钩了send()函数,对吗?究竟如何?该代码假设参数正在传递到CPU寄存器中,但它们通常是在堆栈上传递的。是什么让你认为'send()'参数被存储在'env-> regs []'中? –

回答

2

该代码产生不确定的行为:

extern int errno; 

7.5错误< errno.h中>的the C Standard(注意粗体部分):

头定义了几个宏,所有与错误条件的报告有关的 。

的宏

EDOM 
EILSEQ 
ERANGE 

其扩展到整数,int类型,不同 正值常量表达式,并且其适合于在#if预处理 指令使用;和

errno 

其扩展到具有键入int和 线程本地存储的持续时间,其值是由几个库函数设定为 正误差数目的修改的左值。 如果为了访问实际对象而禁止了宏 定义,则 或程序定义了名称为errno的标识符,因此 行为未定义。

按照Google Android source codeerrno是被定义为

extern int *__geterrno(void); 

#define errno (*__geterrno()) 

既然如此,你extern int errno你看到的值是无意义的宏。