Mares Smart Apnea

Jef Driesen jef at libdivecomputer.org
Wed Sep 9 05:45:56 PDT 2015


On 2015-09-09 14:04, Giorgio Marzano wrote:
> I have compiled this sniplet:
> 
> main (int argc, char *argv[])
> {
> int i;
> const mares_iconhd_model_t models[] = {
> {"Matrix",      MATRIX},
> // {"Smart Apnea", SMARTAPNEA},
> {"Smart",       SMART},
> {"Icon HD",     ICONHD},
> {"Icon AIR",    ICONHDNET},
> {"Puck Pro",    PUCKPRO},
> {"Nemo Wide 2", NEMOWIDE2},
> {"Puck 2",      PUCK2},
> };
> 
> // Check the product name in the version packet against the list
> // with valid names, and return the corresponding model number.
> unsigned int model = 0;
> for ( i = 0; i < 7; ++i) {
> printf ("i: %d, sizeof: %d, strlen:  
> %d\n",i,sizeof(models[i].name),strlen
> (models[i].name));
> 
> }
> }
> 
> and the corresponding ouput is:
> 
> 
> giorgio at giorgio-laptop:~$ ./prova i: 0, sizeof: 17, strlen: 6 i: 1, 
> sizeof:
> 17, strlen: 5 i: 2, sizeof: 17, strlen: 7 i: 3, sizeof: 17, strlen: 8 
> i: 4,
> sizeof: 17, strlen: 8 i: 5, sizeof: 17, strlen: 11 i: 6, sizeof: 17,
> strlen: 6
> 
> 
> So it seems to me that either we use strlen or we use strcmp

No, the memcmp is correct. In the mares header, the name is a 16 byte 
array. If the name is shorter than 16 bytes, the remaining bytes are 
padded with zero's. But if there would be a name that's exactly 16 bytes 
long, then there won't be a terminating zero byte. In that case, strlen 
and strcmp will result in a buffer overflow! That's why we use memcmp. 
The other reason is that I want to do an exact match. The "Smart" entry 
should not match "Smart Apnea". Future models needs to be added 
explicitly, and not detected by accident.

Jef


More information about the devel mailing list