diff --git a/source/src/bot/bot_util.cpp b/source/src/bot/bot_util.cpp index 233a4329..5257d46a 100644 --- a/source/src/bot/bot_util.cpp +++ b/source/src/bot/bot_util.cpp @@ -95,7 +95,7 @@ float RandomFloat (float from, float to) if (to <= from) return (from); - return (from + (float) lrand () / (LRAND_MAX / (to - from))); + return (from + (float) lrand () / ((float) LRAND_MAX / (to - from))); } // End random functions diff --git a/source/src/server.cpp b/source/src/server.cpp index 841b1f5e..18b3c092 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -3569,7 +3569,7 @@ void process(ENetPacket *packet, int sender, int chan) } else { - strncpy(vi->text,text,MAXTRANS-1); + copystring(vi->text,text,MAXTRANS); vi->num1 = mode; vi->num2 = time; } @@ -3586,7 +3586,7 @@ void process(ENetPacket *packet, int sender, int chan) { vi->num1 = cn2boot = getint(p); getstring(text, p); - strncpy(vi->text,text,128); + copystring(vi->text,text,128); filtertext(text, text, FTXT__KICKBANREASON); trimtrailingwhitespace(text); vi->action = new kickaction(cn2boot, newstring(text, 128)); @@ -3597,7 +3597,7 @@ void process(ENetPacket *packet, int sender, int chan) { vi->num1 = cn2boot = getint(p); getstring(text, p); - strncpy(vi->text,text,128); + copystring(vi->text,text,128); filtertext(text, text, FTXT__KICKBANREASON); trimtrailingwhitespace(text); vi->action = new banaction(cn2boot, newstring(text, 128)); @@ -3635,7 +3635,7 @@ void process(ENetPacket *packet, int sender, int chan) break; case SA_SERVERDESC: getstring(text, p); - strncpy(vi->text,text,MAXTRANS-1); + copystring(vi->text,text,MAXTRANS); filtertext(text, text, FTXT__SERVDESC); vi->action = new serverdescaction(newstring(text), sender); break; diff --git a/source/src/serverfiles.h b/source/src/serverfiles.h index 294c25e1..4c5f7f4a 100644 --- a/source/src/serverfiles.h +++ b/source/src/serverfiles.h @@ -1204,8 +1204,8 @@ struct serverforbiddenlist : serverconfigfile char *c1 = s1, *c2 = s2; if (num < 100 && (n = sscanf(s,"%s %s",s1,s2)) > 0 ) // no warnings { - strncpy(entries[num][0],c1,FORBIDDENSIZE); - if ( n > 1 ) strncpy(entries[num][1],c2,FORBIDDENSIZE); + copystring(entries[num][0],c1,FORBIDDENSIZE); + if ( n > 1 ) copystring(entries[num][1],c2,FORBIDDENSIZE); else entries[num][1][0]='\0'; num++; } diff --git a/source/src/tools.h b/source/src/tools.h index d7545d61..fc454db6 100644 --- a/source/src/tools.h +++ b/source/src/tools.h @@ -117,7 +117,13 @@ inline int iabs(int n) { return labs(n); } typedef char string[MAXSTRLEN]; inline void vformatstring(char *d, const char *fmt, va_list v, int len = MAXSTRLEN) { _vsnprintf(d, len, fmt, v); d[len-1] = 0; } -inline char *copystring(char *d, const char *s, size_t len = MAXSTRLEN) { strncpy(d, s, len); d[len-1] = 0; return d; } +inline char *copystring(char *d, const char *s, size_t len = MAXSTRLEN) +{ + size_t slen = min(strlen(s), len-1); + memcpy(d, s, slen); + d[slen] = 0; + return d; +} inline char *concatstring(char *d, const char *s, size_t len = MAXSTRLEN) { size_t used = strlen(d); return used < len ? copystring(d+used, s, len-used) : d; } extern char *concatformatstring(char *d, const char *s, ...) PRINTFARGS(2, 3); diff --git a/source/src/vertmodel.h b/source/src/vertmodel.h index 31f79b9b..ac9e1bcd 100644 --- a/source/src/vertmodel.h +++ b/source/src/vertmodel.h @@ -721,7 +721,7 @@ struct vertmodel : model ntags[numtags].name = newstring(name); loopi(numframes) { - memcpy(&ntags[(numtags + 1)*i], &tags[numtags*i], numtags*sizeof(tag)); + memcpy((void *)&ntags[(numtags + 1)*i], (void *)&tags[numtags*i], numtags*sizeof(tag)); tag *t = &ntags[(numtags + 1)*i + numtags]; t->pos = m->verts[m->numverts*i + verts[0]]; diff --git a/source/src/worldio.cpp b/source/src/worldio.cpp index 75d09a0f..7100f882 100644 --- a/source/src/worldio.cpp +++ b/source/src/worldio.cpp @@ -634,7 +634,6 @@ void save_world(char *mname, bool skipoptimise, bool addcomfort) } // update (and fix) map header - strncpy(hdr.head, "ACMP", 4); // ensure map now declares itself as an AssaultCube map, even if imported as CUBE hdr.version = MAPVERSION; hdr.headersize = sizeof(header); hdr.timestamp = (int) time(NULL);