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等變量被破壞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章