Replaced strncat/strncpy with strlcat/strlcpy

The strncat/strncpy functions have dangerously counter-intuitive
semantics. They are meant to be used with fixed-width,
non-null-terminated strings, which is in, 99% cases, not what you want.

The strlcat/strlcpy ones are non-standard, however SDL provides its own
implementations on platforms that do not have them.
This commit is contained in:
Andrei "Akari" Alexeyev 2017-02-16 08:29:18 +02:00
parent 7e531092db
commit 8668021710
11 changed files with 41 additions and 40 deletions

View file

@ -32,7 +32,7 @@ void dadd_msg(Dialog *d, Side side, char *msg) {
d->messages = realloc(d->messages, (++d->count)*sizeof(DialogMessage));
d->messages[d->count-1].side = side;
d->messages[d->count-1].msg = malloc(strlen(msg) + 1);
strncpy(d->messages[d->count-1].msg, msg, strlen(msg) + 1);
strlcpy(d->messages[d->count-1].msg, msg, strlen(msg) + 1);
}
void delete_dialog(Dialog *d) {

View file

@ -166,4 +166,10 @@ enum {
EV_CHECK_DESYNC, // replay-only
};
#define strlcat SDL_strlcat
#define strlcpy SDL_strlcpy
#define strncat DO_NOT_USE_strncat_USE_strlcat
#define strncpy DO_NOT_USE_strncpy_USE_strlcpy
#endif

View file

@ -53,7 +53,7 @@ void draw_char_menu(MenuData *menu) {
char buf[128];
int i;
for(i = 0; i < menu->ecount; i++) {
strncpy(buf, menu->entries[i].name, sizeof(buf));
strlcpy(buf, menu->entries[i].name, sizeof(buf));
char *tex = strtok(buf,"|");
char *name = strtok(NULL, "|");
@ -84,7 +84,7 @@ void draw_char_menu(MenuData *menu) {
glColor4f(1,1,1,1-menu->entries[i].drawdata*3);
draw_text(AL_Center, 0, 70, title, _fonts.standard);
strncpy(buf, mod->entries[i].name, sizeof(buf));
strlcpy(buf, mod->entries[i].name, sizeof(buf));
char *mari = strtok(buf, "|");
char *youmu = strtok(NULL, "|");

View file

@ -15,9 +15,6 @@
#include "paths/native.h"
#include "taisei_err.h"
#define strlcat SDL_strlcat
#define strlcpy SDL_strlcpy
// --- Menu entry <-> config option binding stuff --- //
void bind_init(OptionBinding *bind) {

View file

@ -210,7 +210,7 @@ static void replayview_drawitem(void *n, int item, int cnt) {
case 1:
a = AL_Center;
strncpy(tmp, rpy->playername, 128);
strlcpy(tmp, rpy->playername, sizeof(tmp));
break;
case 2:

View file

@ -27,7 +27,7 @@ void save_rpy(void *a) {
char prepr[16], drepr[16];
plrmode_repr(prepr, 16, rpy->stages[0].plr_char, rpy->stages[0].plr_shot);
strncpy(drepr, difficulty_name(rpy->stages[0].diff), 16);
strlcpy(drepr, difficulty_name(rpy->stages[0].diff), 16);
drepr[0] += 'a' - 'A';
if(rpy->numstages > 1)

View file

@ -18,9 +18,9 @@ Animation *init_animation(char *filename) {
char *beg = strstr(filename, "gfx/") + 4;
char *end = strrchr(filename, '.');
char *name = malloc(end - beg + 1);
memset(name, 0, end - beg + 1);
strncpy(name, beg, end-beg);
int sz = end - beg + 1;
char *name = malloc(sz);
strlcpy(name, beg, sz);
char* tok;
strtok(name, "_");

View file

@ -131,9 +131,9 @@ Sound *load_sound_or_bgm(char *filename, Sound **dest, const char *res_directory
char *beg = strstr(filename, res_directory) + strlen(res_directory);
char *end = strrchr(filename, '.');
snd->name = malloc(end - beg + 1);
memset(snd->name, 0, end-beg + 1);
strncpy(snd->name, beg, end-beg);
int sz = end - beg + 1;
snd->name = malloc(sz);
strlcpy(snd->name, beg, sz);
printf("-- loaded '%s' as '%s', type %s\n", filename, snd->name, type);

View file

@ -125,10 +125,9 @@ Model *load_model(char *filename) {
char *beg = strstr(filename, "models/") + 7;
char *end = strrchr(filename, '.');
m->name = malloc(end - beg + 1);
memset(m->name, 0, end-beg + 1);
strncpy(m->name, beg, end-beg);
int sz = end - beg + 1;
m->name = malloc(sz);
strlcpy(m->name, beg, sz);
parse_obj(filename, &data);

View file

@ -75,8 +75,8 @@ char *copy_segment(char *text, char *delim, int *size) {
return NULL;
*size = end-beg;
seg = malloc(*size);
strncpy(seg, beg, *size);
seg = malloc(*size+1);
strlcpy(seg, beg, *size+1);
return seg;
}
@ -135,11 +135,11 @@ void load_shader_snippets(char *filename, char *prefix) {
memset(vtext, 0, vhsize + ssize + vfsize + 1);
memset(ftext, 0, fhsize + 1);
strncpy(vtext, vhead, vhsize);
strncpy(ftext, fhead, fhsize);
strlcpy(vtext, vhead, vhsize+1);
strlcpy(ftext, fhead, fhsize+1);
strncpy(vtext+vhsize, sec, ssize);
strncpy(vtext+vhsize+ssize, vfoot, vfsize);
strlcpy(vtext+vhsize, sec, ssize+1);
strlcpy(vtext+vhsize+ssize, vfoot, vfsize+1);
} else if(ffoot) {
ftext = malloc(fhsize + ssize + ffsize + 1);
@ -148,19 +148,19 @@ void load_shader_snippets(char *filename, char *prefix) {
memset(ftext, 0, fhsize + ssize + ffsize + 1);
memset(vtext, 0, vhsize + 1);
strncpy(ftext, fhead, fhsize);
strncpy(vtext, vhead, vhsize);
strlcpy(ftext, fhead, fhsize+1);
strlcpy(vtext, vhead, vhsize+1);
strncpy(ftext+fhsize, sec, ssize);
strncpy(ftext+fhsize+ssize, ffoot, ffsize);
strlcpy(ftext+fhsize, sec, ssize+1);
strlcpy(ftext+fhsize+ssize, ffoot, ffsize+1);
}
nbuf = malloc(nend-name+prefixlen+1);
strcpy(nbuf, prefix);
strncat(nbuf+prefixlen, name, nend-name);
strlcat(nbuf+prefixlen, name, nend-name+1);
nbuf[nend-name+prefixlen] = 0;
load_shader(vtext, ftext, nbuf, nend-name+prefixlen);
load_shader(vtext, ftext, nbuf, nend-name+prefixlen+1);
printf("--- loaded snippet as shader '%s'\n", nbuf);
free(nbuf);
@ -195,11 +195,11 @@ void load_shader_file(char *filename) {
beg = strstr(filename, "shader/") + 7;
end = strrchr(filename, '.');
name = malloc(end-beg + 1);
strncpy(name, beg, end-beg);
name[end-beg] = 0;
int sz = end - beg + 1;
name = malloc(sz);
strlcpy(name, beg, sz);
load_shader(vtext, ftext, name, end-beg);
load_shader(vtext, ftext, name, sz);
printf("-- loaded '%s' as '%s'\n", filename, name);
@ -237,9 +237,8 @@ void load_shader(char *vtext, char *ftext, char *name, int nsize) {
print_program_info_log(sha->prog);
sha->name = malloc(nsize + 1);
strncpy(sha->name, name, nsize);
sha->name[nsize] = 0;
sha->name = malloc(nsize);
strlcpy(sha->name, name, nsize);
cache_uniforms(sha);
}

View file

@ -86,9 +86,9 @@ Texture *load_texture(const char *filename) {
char *beg = strstr(filename, "gfx/") + 4;
char *end = strrchr(filename, '.');
texture->name = malloc(end - beg + 1);
memset(texture->name, 0, end-beg + 1);
strncpy(texture->name, beg, end-beg);
int sz = end - beg + 1;
texture->name = malloc(sz);
strlcpy(texture->name, beg, sz);
printf("-- loaded '%s' as '%s'\n", filename, texture->name);