msgrcv参数错误导致堆栈被破坏

struct my_msg_st

    int src;
    int des;
    int cmd;
    int param;
    char data[BUF_LEN];
    int ack;
    int arg;
int broadcast;
};  

static void receive(int native_name, int dest_name, signal_callback scallback, void *arg)

{
    //asm("bkpt");
    int msgid;
    int running = 1;
    struct my_msg_st some_data;  
    long int msg_to_receive = 0;  
    struct smpg_ipc_data ipc_data;


    msgid = init_msg(native_name);
    if(msgid == -1){
        return ;
    }


    while(running){  
printf("%x %x %x %x %x\n", msgid, (void*)&some_data, sizeof(struct my_msg_st), msg_to_receive, 0);
        printf("&errno:0x%x", &errno);
        asm("mov r31, r31");
        if(msgrcv(msgid , (void*)&some_data, sizeof(struct my_msg_st), msg_to_receive, 0) ==-1){  
            if(errno != EINTR){
                printf("msgrcv failed with error! errno:%d\n", errno);
            }
return;
            continue;
        }  
......

}


msgrcv系统调用传入的第二个参数并不是一个buffer,而是一个long型的type+buffer,所以第三个参数传入的不应该是sizeof(type+buffer),而是sizeof(buffer)。

所以上面定义的struct my_msg_st结构体需要注意,得定义一个type。

现在按照上面的这种写法,会导致msgrcv系统调用中拷贝数据越界4个字节,又由于some_data定义在堆栈中,可能会导致msgid等变量被破坏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值