From d3468d907f94c01f8b41c8142007529bae9a6ccc Mon Sep 17 00:00:00 2001 From: Oliver Hartkopp Date: Sat, 25 Sep 2010 10:24:37 +0000 Subject: [PATCH] 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. --- candump.c | 11 +++-------- cangw.c | 13 +++++-------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/candump.c b/candump.c index cc81b3f..7aeeef5 100644 --- a/candump.c +++ b/candump.c @@ -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; } diff --git a/cangw.c b/cangw.c index d6e9668..fbc230d 100644 --- a/cangw.c +++ b/cangw.c @@ -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 { -- 2.39.2