Fix datatype issue in sscanf() on 64bit systems.

On 64bit systems a 'long' is a 64bit value but the target values of scanf()
are always 32bit in the affected code - which means just an 'unsigned int'.
Unsigned int is fine on 32 and 64 bit systems.

Thanks to Andre Naujoks for reporting this issue.
pull/7/head
Oliver Hartkopp 2010-09-25 10:24:37 +00:00
parent 1463ee4ce4
commit d3468d907f
2 changed files with 8 additions and 16 deletions

View File

@ -443,23 +443,18 @@ int main(int argc, char **argv)
ptr = nptr+1; /* hop behind the ',' */
nptr = strchr(ptr, ','); /* update exit condition */
if (sscanf(ptr, "%lx:%lx",
(long unsigned int *)
if (sscanf(ptr, "%x:%x",
&rfilter[numfilter].can_id,
(long unsigned int *)
&rfilter[numfilter].can_mask) == 2) {
rfilter[numfilter].can_mask &= ~CAN_ERR_FLAG;
numfilter++;
} else if (sscanf(ptr, "%lx~%lx",
(long unsigned int *)
} else if (sscanf(ptr, "%x~%x",
&rfilter[numfilter].can_id,
(long unsigned int *)
&rfilter[numfilter].can_mask) == 2) {
rfilter[numfilter].can_id |= CAN_INV_FILTER;
rfilter[numfilter].can_mask &= ~CAN_ERR_FLAG;
numfilter++;
} else if (sscanf(ptr, "#%lx",
(long unsigned int *)&err_mask) != 1) {
} else if (sscanf(ptr, "#%x", &err_mask) != 1) {
fprintf(stderr, "Error in filter option parsing: '%s'\n", ptr);
return 1;
}

13
cangw.c
View File

@ -328,8 +328,7 @@ int parse_mod(char *optarg, struct modattr *modmsg)
ptr++;
}
if (sscanf(++ptr, "%lx.%hhx.%16s",
(long unsigned int *)&modmsg->cf.can_id,
if (sscanf(++ptr, "%x.%hhx.%16s", &modmsg->cf.can_id,
(unsigned char *)&modmsg->cf.can_dlc, hexdata) != 3)
return 5;
@ -593,13 +592,11 @@ int main(int argc, char **argv)
break;
case 'f':
if (sscanf(optarg, "%lx:%lx",
(long unsigned int *)&filter.can_id,
(long unsigned int *)&filter.can_mask) == 2) {
if (sscanf(optarg, "%x:%x", &filter.can_id,
&filter.can_mask) == 2) {
have_filter = 1;
} else if (sscanf(optarg, "%lx~%lx",
(long unsigned int *)&filter.can_id,
(long unsigned int *)&filter.can_mask) == 2) {
} else if (sscanf(optarg, "%x~%x", &filter.can_id,
&filter.can_mask) == 2) {
filter.can_id |= CAN_INV_FILTER;
have_filter = 1;
} else {