Skip to content

Commit b4abc7d

Browse files
committed
Standardise string copying to a fixed-size buffer with a portable version of strlcpy
1 parent 9c1928e commit b4abc7d

File tree

5 files changed

+37
-23
lines changed

5 files changed

+37
-23
lines changed

src/cwlib/box.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <string.h>
3030

3131
#include "chadwick.h"
32+
#include "util.h"
3233

3334
/*
3435
* Create an initialize a batting statistic entry
@@ -279,8 +280,7 @@ cw_box_add_substitute(CWBoxscore *boxscore, CWGameIterator *gameiter)
279280
* Try to do something reasonable here.
280281
*/
281282
CWBoxPlayer *player = cw_box_player_create(sub->player_id, sub->name);
282-
strncpy(player->date, gameiter->state->date, 8);
283-
player->date[8] = '\0';
283+
CW_STRLCPY(player->date, gameiter->state->date);
284284
player->batting->g = 1;
285285
boxscore->slots[sub->slot][sub->team] = player;
286286
}
@@ -310,8 +310,7 @@ cw_box_add_substitute(CWBoxscore *boxscore, CWGameIterator *gameiter)
310310
else if (strcmp(sub->player_id,
311311
boxscore->slots[sub->slot][sub->team]->player_id) != 0) {
312312
CWBoxPlayer *player = cw_box_player_create(sub->player_id, sub->name);
313-
strncpy(player->date, gameiter->state->date, 8);
314-
player->date[8] = '\0';
313+
CW_STRLCPY(player->date, gameiter->state->date);
315314
player->batting->g = 1;
316315
boxscore->slots[sub->slot][sub->team]->next = player;
317316
player->prev = boxscore->slots[sub->slot][sub->team];

src/cwlib/game.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,7 @@ cw_game_read(FILE *file)
867867
batter = cw_strtok(NULL);
868868
bats = cw_strtok(NULL);
869869
if (batter && bats) {
870-
strncpy(batHandBatter, batter, 255);
870+
CW_STRLCPY(batHandBatter, batter);
871871
batHand = bats[0];
872872
}
873873
}
@@ -876,7 +876,7 @@ cw_game_read(FILE *file)
876876
pitcher = cw_strtok(NULL);
877877
throws = cw_strtok(NULL);
878878
if (pitcher && throws) {
879-
strncpy(pitHandPitcher, pitcher, 255);
879+
CW_STRLCPY(pitHandPitcher, pitcher);
880880
pitHand = throws[0];
881881
}
882882
}
@@ -899,7 +899,7 @@ cw_game_read(FILE *file)
899899
runner = cw_strtok(NULL);
900900
base = cw_strtok(NULL);
901901
if (runner && base) {
902-
strncpy(autoRunner, runner, 255);
902+
CW_STRLCPY(autoRunner, runner);
903903
autoBase = cw_atoi(base, NULL);
904904
}
905905
}
@@ -911,7 +911,7 @@ cw_game_read(FILE *file)
911911
if (pitcher && base_str) {
912912
base = cw_atoi(base_str, NULL);
913913
if (base >= 1 && base <= 3) {
914-
strncpy(presadj[base], pitcher, 255);
914+
CW_STRLCPY(presadj[base], pitcher);
915915
}
916916
else {
917917
cw_game_warn_invalid_record(game, line);

src/cwlib/gameiter.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ cw_gamestate_base_occupied(CWGameState *state, int base)
5151
static void
5252
cw_gamestate_place_runner(CWGameState *state, int base, char *runner)
5353
{
54-
strncpy(state->runners[base].runner, runner, 49);
55-
strncpy(state->runners[base].pitcher,
56-
state->fielders[1][1-state->batting_team], 49);
57-
strncpy(state->runners[base].catcher,
58-
state->fielders[2][1-state->batting_team], 49);
54+
CW_STRLCPY(state->runners[base].runner, runner);
55+
CW_STRLCPY(state->runners[base].pitcher,
56+
state->fielders[1][1-state->batting_team]);
57+
CW_STRLCPY(state->runners[base].catcher,
58+
state->fielders[2][1-state->batting_team]);
5959
state->runners[base].is_auto = 1;
6060
state->num_auto_runners[state->batting_team]++;
6161
}
@@ -67,18 +67,18 @@ cw_gamestate_place_runner(CWGameState *state, int base, char *runner)
6767
static void
6868
cw_gamestate_place_batter(CWGameState *state, char *batter, int event_type)
6969
{
70-
strncpy(state->runners[0].runner, batter, 49);
70+
CW_STRLCPY(state->runners[0].runner, batter);
7171
if ((event_type == CW_EVENT_WALK ||
7272
event_type == CW_EVENT_INTENTIONALWALK) &&
7373
state->walk_pitcher) {
7474
strcpy(state->runners[0].pitcher, state->walk_pitcher);
7575
}
7676
else {
77-
strncpy(state->runners[0].pitcher,
78-
state->fielders[1][1-state->batting_team], 49);
77+
CW_STRLCPY(state->runners[0].pitcher,
78+
state->fielders[1][1-state->batting_team]);
7979
}
80-
strncpy(state->runners[0].catcher,
81-
state->fielders[2][1-state->batting_team], 49);
80+
CW_STRLCPY(state->runners[0].catcher,
81+
state->fielders[2][1-state->batting_team]);
8282
state->runners[0].src_event = state->event_count;
8383
state->runners[0].is_auto = 0;
8484
}
@@ -90,7 +90,7 @@ cw_gamestate_place_batter(CWGameState *state, char *batter, int event_type)
9090
static void
9191
cw_gamestate_replace_runner(CWGameState *state, int base, char *runner)
9292
{
93-
strncpy(state->runners[base].runner, runner, 49);
93+
CW_STRLCPY(state->runners[base].runner, runner);
9494
}
9595

9696
static void
@@ -920,7 +920,7 @@ cw_gameiter_process_comments(CWGameIterator *gameiter)
920920
if (strstr(comment->text, "suspended,") == comment->text) {
921921
strtok(comment->text, ",");
922922
token = strtok(NULL, ",");
923-
strncpy(gameiter->state->date, token, 8);
923+
CW_STRLCPY(gameiter->state->date, token);
924924
}
925925
comment = comment->next;
926926
}
@@ -982,8 +982,8 @@ cw_gameiter_next(CWGameIterator *gameiter)
982982
if (gameiter->event) {
983983
for (base = 1; base <= 3; base++) {
984984
if (gameiter->event->presadj[base] != NULL) {
985-
strncpy(gameiter->state->runners[base].pitcher,
986-
gameiter->event->presadj[base], 49);
985+
CW_STRLCPY(gameiter->state->runners[base].pitcher,
986+
gameiter->event->presadj[base]);
987987
}
988988
}
989989
}

src/cwlib/parse.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <ctype.h>
2727

2828
#include "parse.h"
29+
#include "util.h"
2930

3031
/**************************************************************************
3132
* Data access on CWEventData objects
@@ -153,7 +154,7 @@ cw_event_rbi_on_play(CWEventData *event)
153154
void
154155
cw_event_set_play(CWEventData *event, int base, char *play)
155156
{
156-
strncpy(event->play[base], play, 20);
157+
CW_STRLCPY(event->play[base], play);
157158
}
158159

159160
/*

src/cwlib/util.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,17 @@
3636
dest = NULL; \
3737
}
3838

39+
40+
/* Utility macro to implement copying to a fixed-size array
41+
*/
42+
#define CW_STRLCPY(dst, src) \
43+
do { \
44+
if ((src) != NULL) { \
45+
strncpy((dst), (src), sizeof(dst) - 1); \
46+
(dst)[sizeof(dst) - 1] = '\0'; \
47+
} \
48+
else { \
49+
(dst)[0] = '\0'; \
50+
} \
51+
} while (0)
52+

0 commit comments

Comments
 (0)