简体   繁体   中英

Character buffer being overrun while reading file

I'm trying to read data from a file but I'm getting a STATUS_STACK_BUFFER_OVERRUN error and the app crashes.

I have a struct:

struct BSPEntities
{
    char* ents; 
};

And I'm reading the file:

BSPEntities entities
ifstream mapfile;
int size = 54506;
int offset = 5182600; 

entities.ents = new char[size];
mapfile.seekg(offset, ios::beg);
mapfile.read((char *)(&entities.ents), size);

"size" and "offset" are values loaded from the file and known to be valid. I have preprocessor directives #pragma pack(1) and #pragma push around the BSPEntities struct.

Thanks.

&entities.ents is a pointer to a pointer to char. The object pointed to (a pointer to char) is probably only 4 or 8 bytes depending on the architecture you're targeting, but you're trying to write 54,506 bytes to it. Obviously 54,506 is larger than 8, so you're writing past the end of the pointer, and the behavior is undefined.

That read should just be mapfile.read(entities.ents, size);

Also you don't need to mess around with #pragma pack here, unless there's something more complicated going on that you're not showing.

mapfile.read((char *)(&entities.ents), size);

Should be

mapfile.read(entities.ents, size);

Instead of passing the address of the heap memory block that ents points to, you are passing the address of ents itself. And since ents is being allocated on the stack, you are reading bytes onto the stack until it overruns.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM