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等变量被破坏。

青春一经典当即永不再赎

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

相关文章:

你感兴趣的文章:

标签云: