c - Why is this code vulnerable to buffer overflow attacks? -


int func(char* str) {    char buffer[100];    unsigned short len = strlen(str);     if(len >= 100)    {         return (-1);    }     strncpy(buffer,str,strlen(str));    return 0; } 

this code vulnerable buffer overflow attack, , i'm trying figure out why. i'm thinking has len being declared short instead of int, i'm not sure.

any ideas?

on compilers maximum value of unsigned short 65535.

any value above gets wrapped around, 65536 becomes 0, , 65600 becomes 65.

this means long strings of right length (e.g. 65600) pass check, , overflow buffer.


use size_t store result of strlen(), not unsigned short, , compare len expression directly encodes size of buffer. example:

char buffer[100]; size_t len = strlen(str); if (len >= sizeof(buffer) / sizeof(buffer[0]))  return -1; memcpy(buffer, str, len + 1);