Skip to content

Commit 9732ebd

Browse files
authored
Merge pull request #3353 from BsAtHome/fix_Os-to-O2-warnings
Fix string truncation warnings
2 parents 713bd91 + 0231a5f commit 9732ebd

4 files changed

Lines changed: 47 additions & 58 deletions

File tree

src/hal/drivers/mesa-hostmot2/abs_encoder.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ int hm2_absenc_parse_format(hm2_sserial_remote_t *chan, hm2_absenc_format_t *de
237237
char* AA64 = "%5pbatt_fail%1b%2ppos_invalid%1b%9plow%16l%2pencoder%16h%2pcomm%10u%7pcrc%5u";
238238
char* format = def->string;
239239
char name[HM2_SSERIAL_MAX_STRING_LENGTH+1] = "";
240+
char *nameptr = name;
240241

241242
if (chan->myinst == HM2_GTAG_FABS && strncmp(format, "AA64",4) == 0){
242243
format = AA64;
@@ -330,21 +331,23 @@ int hm2_absenc_parse_format(hm2_sserial_remote_t *chan, hm2_absenc_format_t *de
330331
" paired with one of the other data types\n");
331332
return -EINVAL;
332333
}
333-
334334
}
335335
else
336336
{
337337
HM2_ERR_NO_LL("Unknown format specifier %s\n", format);
338338
return -EINVAL;
339339
}
340340
//Start a new name
341-
rtapi_strxcpy(name, "");
341+
nameptr = name;
342+
*nameptr = 0;
342343
//move to the next string
343344
format++;
344345
}
345346
else
346347
{
347-
strncat(name, format++, 1);
348+
// Not a % format, append name
349+
*nameptr++ = *format++;
350+
*nameptr = 0;
348351
}
349352
}
350353
return 0;

src/hal/drivers/mesa-hostmot2/hm2_eth.c

Lines changed: 32 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949

5050
struct kvlist {
5151
struct rtapi_list_head list;
52-
char key[16];
52+
char key[16+1];
5353
int value;
5454
};
5555

@@ -63,7 +63,7 @@ static int *kvlist_lookup(struct rtapi_list_head *head, const char *name) {
6363
if(strncmp(name, ent->key, sizeof(ent->key)) == 0) return &ent->value;
6464
}
6565
struct kvlist *ent = rtapi_kzalloc(sizeof(struct kvlist), RTAPI_GPF_KERNEL);
66-
strncpy(ent->key, name, sizeof(ent->key));
66+
strncpy(ent->key, name, sizeof(ent->key)-1);
6767
rtapi_list_add(&ent->list, head);
6868
return &ent->value;
6969
}
@@ -1054,8 +1054,8 @@ static int hm2_eth_probe(hm2_eth_t *board) {
10541054
lbp16_cmd_addr read_packet;
10551055

10561056
int ret, send, recv;
1057-
char board_name[16] = {0, };
1058-
char llio_name[16] = {0, };
1057+
char board_name[16] = {};
1058+
char llio_name[16] = {};
10591059

10601060
LBP16_INIT_PACKET4(read_packet, CMD_READ_BOARD_INFO_ADDR16_INCR(16/2), 0);
10611061
send = eth_socket_send(board->sockfd, (void*) &read_packet, sizeof(read_packet), 0);
@@ -1075,8 +1075,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
10751075
board->llio.split_read = true;
10761076

10771077
if (strncmp(board_name, "7I80DB-16", 9) == 0) {
1078-
strncpy(llio_name, board_name, 4);
1079-
llio_name[1] = tolower(llio_name[1]);
1078+
memcpy(llio_name, board_name, 4);
10801079

10811080
board->llio.num_ioport_connectors = 4;
10821081
board->llio.pins_per_connector = 17;
@@ -1087,8 +1086,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
10871086
board->llio.fpga_part_number = "XC6SLX16";
10881087
board->llio.num_leds = 4;
10891088
} else if (strncmp(board_name, "7I80DB-25", 9) == 0) {
1090-
strncpy(llio_name, board_name, 4);
1091-
llio_name[1] = tolower(llio_name[1]);
1089+
memcpy(llio_name, board_name, 4);
10921090

10931091
board->llio.num_ioport_connectors = 4;
10941092
board->llio.pins_per_connector = 17;
@@ -1099,8 +1097,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
10991097
board->llio.fpga_part_number = "XC6SLX25";
11001098
board->llio.num_leds = 4;
11011099
} else if (strncmp(board_name, "7I80HD-16", 9) == 0) {
1102-
strncpy(llio_name, board_name, 4);
1103-
llio_name[1] = tolower(llio_name[1]);
1100+
memcpy(llio_name, board_name, 4);
11041101

11051102
board->llio.num_ioport_connectors = 3;
11061103
board->llio.pins_per_connector = 24;
@@ -1110,8 +1107,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
11101107
board->llio.fpga_part_number = "XC6SLX16";
11111108
board->llio.num_leds = 4;
11121109
} else if (strncmp(board_name, "7I80HD-25", 9) == 0) {
1113-
strncpy(llio_name, board_name, 4);
1114-
llio_name[1] = tolower(llio_name[1]);
1110+
memcpy(llio_name, board_name, 4);
11151111

11161112
board->llio.num_ioport_connectors = 3;
11171113
board->llio.pins_per_connector = 24;
@@ -1121,8 +1117,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
11211117
board->llio.fpga_part_number = "XC6SLX25";
11221118
board->llio.num_leds = 4;
11231119
} else if (strncmp(board_name, "7I80HDT", 7) == 0) {
1124-
strncpy(llio_name, board_name, 4);
1125-
llio_name[1] = tolower(llio_name[1]);
1120+
memcpy(llio_name, board_name, 4);
11261121

11271122
board->llio.num_ioport_connectors = 3;
11281123
board->llio.pins_per_connector = 24;
@@ -1132,9 +1127,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
11321127
board->llio.fpga_part_number = "T20F256";
11331128
board->llio.num_leds = 4;
11341129
} else if (strncmp(board_name, "7I76E-16", 8) == 0) {
1135-
strncpy(llio_name, board_name, 5);
1136-
llio_name[1] = tolower(llio_name[1]);
1137-
llio_name[4] = tolower(llio_name[4]);
1130+
memcpy(llio_name, board_name, 5);
11381131

11391132
board->llio.num_ioport_connectors = 3;
11401133
board->llio.pins_per_connector = 17;
@@ -1144,9 +1137,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
11441137
board->llio.fpga_part_number = "XC6SLX16";
11451138
board->llio.num_leds = 4;
11461139
} else if (strncmp(board_name, "7I76EU", 8) == 0) {
1147-
strncpy(llio_name, board_name, 5);
1148-
llio_name[1] = tolower(llio_name[1]);
1149-
llio_name[4] = tolower(llio_name[4]);
1140+
memcpy(llio_name, board_name, 5);
11501141

11511142
board->llio.num_ioport_connectors = 3;
11521143
board->llio.pins_per_connector = 17;
@@ -1156,8 +1147,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
11561147
board->llio.fpga_part_number = "T20F256";
11571148
board->llio.num_leds = 4;
11581149
} else if (strncmp(board_name, "7I92", 4) == 0) {
1159-
strncpy(llio_name, board_name, 4);
1160-
llio_name[1] = tolower(llio_name[1]);
1150+
memcpy(llio_name, board_name, 4);
11611151

11621152
board->llio.num_ioport_connectors = 2;
11631153
board->llio.pins_per_connector = 17;
@@ -1166,8 +1156,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
11661156
board->llio.fpga_part_number = "XC6SLX9";
11671157
board->llio.num_leds = 4;
11681158
} else if (strncmp(board_name, "7I92T", 5) == 0) {
1169-
strncpy(llio_name, board_name, 4);
1170-
llio_name[1] = tolower(llio_name[1]);
1159+
memcpy(llio_name, board_name, 4);
11711160

11721161
board->llio.num_ioport_connectors = 2;
11731162
board->llio.pins_per_connector = 17;
@@ -1177,8 +1166,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
11771166
board->llio.num_leds = 4;
11781167

11791168
} else if (strncmp(board_name, "7I93", 4) == 0) {
1180-
strncpy(llio_name, board_name, 4);
1181-
llio_name[1] = tolower(llio_name[1]);
1169+
memcpy(llio_name, board_name, 4);
11821170
board->llio.num_ioport_connectors = 2;
11831171
board->llio.pins_per_connector = 24;
11841172
board->llio.ioport_connector_name[0] = "P2";
@@ -1187,8 +1175,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
11871175
board->llio.num_leds = 4;
11881176

11891177
} else if (strncmp(board_name, "7I94", 8) == 0) {
1190-
strncpy(llio_name, board_name, 8);
1191-
llio_name[1] = tolower(llio_name[1]);
1178+
memcpy(llio_name, board_name, 4);
11921179
board->llio.num_ioport_connectors = 2;
11931180
board->llio.pins_per_connector = 21;
11941181
board->llio.io_connector_pin_names = hm2_7i94_pin_names;
@@ -1208,8 +1195,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
12081195
board->llio.fpga_part_number = "6slx9tqg144";
12091196
board->llio.num_leds = 4;
12101197
} else if (strncmp(board_name, "7I94T", 8) == 0) {
1211-
strncpy(llio_name, board_name, 4);
1212-
llio_name[1] = tolower(llio_name[1]);
1198+
memcpy(llio_name, board_name, 4);
12131199
board->llio.num_ioport_connectors = 2;
12141200
board->llio.pins_per_connector = 21;
12151201
board->llio.io_connector_pin_names = hm2_7i94_pin_names;
@@ -1230,8 +1216,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
12301216
board->llio.num_leds = 4;
12311217

12321218
} else if (strncmp(board_name, "7I95", 8) == 0) {
1233-
strncpy(llio_name, board_name, 4);
1234-
llio_name[1] = tolower(llio_name[1]);
1219+
memcpy(llio_name, board_name, 4);
12351220
board->llio.num_ioport_connectors = 2;
12361221
board->llio.pins_per_connector = 29;
12371222
board->llio.io_connector_pin_names = hm2_7i95_pin_names;
@@ -1261,8 +1246,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
12611246
board->llio.num_leds = 4;
12621247

12631248
} else if (strncmp(board_name, "7I95T", 8) == 0) {
1264-
strncpy(llio_name, board_name, 4);
1265-
llio_name[1] = tolower(llio_name[1]);
1249+
memcpy(llio_name, board_name, 4);
12661250
board->llio.num_ioport_connectors = 2;
12671251
board->llio.pins_per_connector = 29;
12681252
board->llio.io_connector_pin_names = hm2_7i95_pin_names;
@@ -1292,8 +1276,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
12921276
board->llio.num_leds = 4;
12931277

12941278
} else if (strncmp(board_name, "7I96", 8) == 0) {
1295-
strncpy(llio_name, board_name, 8);
1296-
llio_name[1] = tolower(llio_name[1]);
1279+
memcpy(llio_name, board_name, 4);
12971280
board->llio.num_ioport_connectors = 3;
12981281
board->llio.pins_per_connector = 17;
12991282
board->llio.io_connector_pin_names = hm2_7i96_pin_names;
@@ -1314,10 +1297,8 @@ static int hm2_eth_probe(hm2_eth_t *board) {
13141297
board->llio.num_leds = 4;
13151298

13161299
} else if (strncmp(board_name, "7I96S", 8) == 0) {
1317-
strncpy(llio_name, board_name, 8);
1318-
llio_name[1] = tolower(llio_name[1]);
1319-
llio_name[4] = tolower(llio_name[4]);
1320-
board->llio.num_ioport_connectors = 3;
1300+
memcpy(llio_name, board_name, 5);
1301+
board->llio.num_ioport_connectors = 3;
13211302
board->llio.pins_per_connector = 17;
13221303
board->llio.io_connector_pin_names = hm2_7i96_pin_names;
13231304

@@ -1337,8 +1318,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
13371318
board->llio.num_leds = 4;
13381319

13391320
} else if (strncmp(board_name, "7I97", 8) == 0) {
1340-
strncpy(llio_name, board_name, 8);
1341-
llio_name[1] = tolower(llio_name[1]);
1321+
memcpy(llio_name, board_name, 4);
13421322
board->llio.num_ioport_connectors = 3;
13431323
board->llio.pins_per_connector = 17;
13441324
board->llio.io_connector_pin_names = hm2_7i97_pin_names;
@@ -1365,8 +1345,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
13651345
board->llio.num_leds = 4;
13661346

13671347
} else if (strncmp(board_name, "7I97T", 8) == 0) {
1368-
strncpy(llio_name, board_name, 4);
1369-
llio_name[1] = tolower(llio_name[1]);
1348+
memcpy(llio_name, board_name, 4);
13701349
board->llio.num_ioport_connectors = 3;
13711350
board->llio.pins_per_connector = 17;
13721351
board->llio.io_connector_pin_names = hm2_7i97_pin_names;
@@ -1394,8 +1373,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
13941373

13951374

13961375
} else if (strncmp(board_name, "7I98", 4) == 0) {
1397-
strncpy(llio_name, board_name, 4);
1398-
llio_name[1] = tolower(llio_name[1]);
1376+
memcpy(llio_name, board_name, 4);
13991377
board->llio.num_ioport_connectors = 3;
14001378
board->llio.pins_per_connector = 17;
14011379
board->llio.ioport_connector_name[0] = "P1";
@@ -1406,8 +1384,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
14061384

14071385

14081386
} else if (strncmp(board_name, "MC04", 4) == 0) {
1409-
strncpy(llio_name, board_name, 4);
1410-
llio_name[1] = tolower(llio_name[1]);
1387+
memcpy(llio_name, board_name, 4);
14111388
board->llio.num_ioport_connectors = 2;
14121389
board->llio.pins_per_connector = 30;
14131390
board->llio.ioport_connector_name[0] = "P1";
@@ -1420,8 +1397,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
14201397

14211398

14221399
} else if (strncmp(board_name, "8CSS", 4) == 0) {
1423-
strncpy(llio_name, board_name, 4);
1424-
llio_name[1] = tolower(llio_name[1]);
1400+
memcpy(llio_name, board_name, 4);
14251401
board->llio.num_ioport_connectors = 2;
14261402
board->llio.pins_per_connector = 30;
14271403
board->llio.ioport_connector_name[0] = "P1";
@@ -1434,8 +1410,7 @@ static int hm2_eth_probe(hm2_eth_t *board) {
14341410

14351411
} else {
14361412
LL_PRINT("Unrecognized ethernet board found: %.16s -- port names will be wrong\n", board_name);
1437-
strncpy(llio_name, board_name, 4);
1438-
llio_name[1] = tolower(llio_name[1]);
1413+
memcpy(llio_name, board_name, 4);
14391414

14401415
// this is a layering violation. it would be nice if special values
14411416
// (such as 0 or -1) could be passed here and the layer which can
@@ -1457,6 +1432,11 @@ static int hm2_eth_probe(hm2_eth_t *board) {
14571432
board->llio.num_leds = 0;
14581433
}
14591434

1435+
// Make llio_name lower case
1436+
for(char *cptr = llio_name; *cptr; cptr++) {
1437+
*cptr = tolower(*cptr);
1438+
}
1439+
14601440
LL_PRINT("discovered %.*s\n", 16, board_name);
14611441

14621442
rtapi_snprintf(board->llio.name, sizeof(board->llio.name), "hm2_%.*s.%d", (int)strlen(llio_name), llio_name, llio_idx(llio_name));

src/hal/drivers/mesa-hostmot2/hostmot2.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,9 @@ int hm2_fabs_parse(hostmot2_t *hm2, char *token, int gtag){
370370
}
371371
def->gtag = gtag;
372372
def->index = i;
373-
strncpy(def->string, ++token, MAX_ABSENC_LEN);
373+
// MAX_ABS_LENGTH-1 because this string, in a fixed size buffer, must be
374+
// NUL-terminated. It is used as such in abs_encoder.c.
375+
strncpy(def->string, ++token, MAX_ABSENC_LEN-1);
374376
rtapi_list_add(&def->list, &hm2->config.absenc_formats);
375377
return 0;
376378
}

src/hal/drivers/mesa-hostmot2/ioport.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,12 @@ static int do_alias(const char *orig_base, const char *alias_base,
204204
const char *suffix, int (*funct)(const char *, const char *)) {
205205
char orig_name[HAL_NAME_LEN];
206206
char alias_name[HAL_NAME_LEN];
207-
snprintf(orig_name, sizeof(orig_name), "%s%s", orig_base, suffix);
208-
snprintf(alias_name, sizeof(alias_name), "%s%s", alias_base, suffix);
207+
// Take ncpy/ncat tour. Using snprintf() causes warning about possible
208+
// trunctation, which in practice never happens.
209+
strncpy(orig_name, orig_base, sizeof(orig_name)-1);
210+
strncat(orig_name, suffix, sizeof(orig_name)-1);
211+
strncpy(alias_name, alias_base, sizeof(alias_name)-1);
212+
strncat(alias_name, suffix, sizeof(alias_name)-1);
209213
return funct(orig_name, alias_name);
210214
}
211215

0 commit comments

Comments
 (0)