From 5495faa8003b47bf185d74a041b671e99cb3eeaa Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 7 Apr 2019 22:28:03 +1000 Subject: [PATCH] Show a warning instead of crashing with 'String too big into StringsBuffer' when loading options.txt/fontscache.txt Also fix makefile again --- src/Makefile | 94 ++++++++++++++++++++++++---------------------------- src/String.c | 4 +-- src/String.h | 3 ++ src/Utils.c | 8 +++++ 4 files changed, 55 insertions(+), 54 deletions(-) diff --git a/src/Makefile b/src/Makefile index bdab41ad7..8fff15c22 100644 --- a/src/Makefile +++ b/src/Makefile @@ -4,6 +4,9 @@ COMMITSHA=$(shell git rev-parse --short HEAD) ENAME=ClassiCube DEL=rm JOBS=1 +CC=gcc +CFLAGS=-w -g -pipe -rdynamic +LDFLAGS=-g -rdynamic ifndef $(PLAT) ifeq ($(OS),Windows_NT) @@ -13,48 +16,51 @@ ifndef $(PLAT) endif endif -CC_web=emcc -OEXT_web=.html -CFLAGS_web=-w -g -LDFLAGS_web=-s WASM=1 -s NO_EXIT_RUNTIME=1 -s FETCH=1 --preload-file texpacks/default.zip@texpacks/default.zip +ifeq ($(PLAT),web) +CC=emcc +OEXT=.html +CFLAGS=-w -g +LDFLAGS=-s WASM=1 -s NO_EXIT_RUNTIME=1 -s FETCH=1 --preload-file texpacks/default.zip@texpacks/default.zip +endif -CC_mingw=gcc -LIBS_mingw=-mwindows -lws2_32 -lwininet -lwinmm -limagehlp -lcrypt32 -ld3d9 -OEXT_mingw=.exe -CFLAGS_mingw=-w -g -pipe +ifeq ($(PLAT),mingw) +OEXT=.exe +CFLAGS=-w -g -pipe +LDFLAGS=-g +LIBS=-mwindows -lws2_32 -lwininet -lwinmm -limagehlp -lcrypt32 -ld3d9 +endif -CC_linux=gcc -LIBS_linux=-lX11 -lpthread -lGL -lm -lopenal -ldl -lcurl -CFLAGS_linux=-w -g -pipe -rdynamic +ifeq ($(PLAT),linux) +LIBS=-lX11 -lpthread -lGL -lm -lopenal -ldl -lcurl +endif -CC_sunos=gcc -LIBS_sunos=-lm -lsocket -lX11 -lGL -lcurl -lopenal -CFLAGS_sunos=-w -g -pipe -rdynamic +ifeq ($(PLAT),sunos) +LIBS=-lm -lsocket -lX11 -lGL -lcurl -lopenal +endif -CC_darwin=gcc -LIBS_darwin=-lcurl -LDFLAGS_darwin=-framework Carbon -framework AGL -framework OpenAL -framework OpenGL -CFLAGS_darwin=-w -g -pipe -rdynamic +ifeq ($(PLAT),darwin) +LIBS=-lcurl +LDFLAGS=-rdynamic -framework Carbon -framework AGL -framework OpenAL -framework OpenGL +endif -BSDLIBS=-lcurl -lexecinfo -lopenal -lGL -lX11 +ifeq ($(PLAT),freebsd) +CC=clang +CFLAGS=-w -g -pipe -rdynamic -I /usr/local/include +LDFLAGS=-L /usr/local/lib +LIBS=-lcurl -lexecinfo -lopenal -lGL -lX11 -lm -lpthread +endif -CC_freebsd=clang -LIBS_freebsd=$(BSDLIBS) -lm -lpthread -INCDIRS_freebsd=-I /usr/local/include -LDFLAGS_freebsd=-L /usr/local/lib -CFLAGS_freebsd=-w -g -pipe -rdynamic +ifeq ($(PLAT),openbsd) +CFLAGS=-w -g -pipe -rdynamic -I /usr/X11R6/include -I /usr/local/include +LDFLAGS=-L /usr/X11R6/lib -L /usr/local/lib +LIBS=-lcurl -lexecinfo -lopenal -lGL -lX11 +endif -CC_openbsd=gcc -LIBS_openbsd=$(BSDLIBS) -INCDIRS_openbsd=-isystem /usr/X11R6/include -isystem /usr/local/include -LDFLAGS_openbsd=-L /usr/X11R6/lib -L /usr/local/lib -CFLAGS_openbsd=-w -g -pipe -rdynamic - -CC_netbsd=gcc -LIBS_netbsd=$(BSDLIBS) -INCDIRS_netbsd=-I /usr/X11R7/include -I /usr/pkg/include -LDFLAGS_netbsd=-L /usr/X11R7/lib -L /usr/pkg/lib -CFLAGS_netbsd=-w -g -pipe -rdynamic +ifeq ($(PLAT),netbsd) +CFLAGS=-w -g -pipe -rdynamic -I /usr/X11R7/include -I /usr/pkg/include +LDFLAGS=-L /usr/X11R7/lib -L /usr/pkg/lib +LIBS=-lcurl -lexecinfo -lopenal -lGL -lX11 +endif ifeq ($(OS),Windows_NT) DEL=del @@ -64,40 +70,26 @@ default: $(PLAT) web: $(MAKE) $(ENAME) PLAT=web -j$(JOBS) - linux: $(MAKE) $(ENAME) PLAT=linux -j$(JOBS) - mingw: $(MAKE) $(ENAME) PLAT=mingw -j$(JOBS) - solaris: $(MAKE) $(ENAME) PLAT=sunos -j$(JOBS) - osx: $(MAKE) $(ENAME) PLAT=darwin -j$(JOBS) - freebsd: $(MAKE) $(ENAME) PLAT=freebsd -j$(JOBS) - openbsd: $(MAKE) $(ENAME) PLAT=openbsd -j$(JOBS) - netbsd: $(MAKE) $(ENAME) PLAT=netbsd -j$(JOBS) - + clean: $(DEL) $(OBJECTS) -CC=$(CC_$(PLAT)) -LIBS=$(LIBS_$(PLAT)) -OEXT=$(OEXT_$(PLAT)) -CFLAGS=$(CFLAGS_$(PLAT)) -LDFLAGS=$(LDFLAGS_$(PLAT)) -INCDIRS=$(INCDIRS_$(PLAT)) - $(ENAME): $(OBJECTS) $(CC) $(LDFLAGS) -o $@$(OEXT) $(OBJECTS) $(LIBS) $(OBJECTS): %.o : %.c - $(CC) $(CFLAGS) $(INCDIRS) -DCC_COMMIT_SHA=\"$(COMMITSHA)\" -c $< -o $@ + $(CC) $(CFLAGS) -DCC_COMMIT_SHA=\"$(COMMITSHA)\" -c $< -o $@ diff --git a/src/String.c b/src/String.c index 0d5a6c2a5..9f86c7c81 100644 --- a/src/String.c +++ b/src/String.c @@ -752,8 +752,6 @@ bool Convert_ParseBool(const String* str, bool* value) { /*########################################################################################################################* *------------------------------------------------------StringsBuffer------------------------------------------------------* *#########################################################################################################################*/ -#define STRINGSBUFFER_LEN_SHIFT 9 -#define STRINGSBUFFER_LEN_MASK 0x1FFUL #define STRINGSBUFFER_BUFFER_EXPAND_SIZE 8192 CC_NOINLINE static void StringsBuffer_Init(StringsBuffer* buffer) { @@ -791,7 +789,7 @@ String StringsBuffer_UNSAFE_Get(StringsBuffer* buffer, int i) { void StringsBuffer_Add(StringsBuffer* buffer, const String* str) { int textOffset; /* StringsBuffer hasn't been initalised yet, do it here */ - if (!buffer->_FlagsBufferSize) { StringsBuffer_Init(buffer); } + if (!buffer->_FlagsBufferSize) StringsBuffer_Init(buffer); if (buffer->Count == buffer->_FlagsBufferSize) { buffer->FlagsBuffer = Utils_Resize(buffer->FlagsBuffer, &buffer->_FlagsBufferSize, diff --git a/src/String.h b/src/String.h index 412f65a30..461f7ebe5 100644 --- a/src/String.h +++ b/src/String.h @@ -200,6 +200,9 @@ CC_API bool Convert_ParseBool(const String* str, bool* value); #define STRINGSBUFFER_BUFFER_DEF_SIZE 4096 #define STRINGSBUFFER_FLAGS_DEF_ELEMS 256 +#define STRINGSBUFFER_LEN_SHIFT 9 +#define STRINGSBUFFER_LEN_MASK 0x1FFUL + typedef struct StringsBuffer_ { char* TextBuffer; /* Raw characters of all entries */ uint32_t* FlagsBuffer; /* Private flags for each entry */ diff --git a/src/Utils.c b/src/Utils.c index c326ac522..c6701d044 100644 --- a/src/Utils.c +++ b/src/Utils.c @@ -310,6 +310,14 @@ void EntryList_Load(struct EntryList* list, EntryList_Filter filter) { if (!entry.length) continue; if (filter && !filter(&entry)) continue; + /* Sometimes file becomes corrupted and replaced with NULL */ + /* If don't prevent this here, client aborts in StringsBuffer_Add */ + if (entry.length > STRINGSBUFFER_LEN_MASK) { + entry.length = 0; + String_Format1(&entry, "Skipping extremely long line in %c, file may have been corrupted", list->Filename); + Logger_WarnFunc(&entry); continue; + } + String_UNSAFE_Separate(&entry, list->Separator, &key, &value); EntryList_Set(list, &key, &value); }