diff --git a/engine/client/snd_alsa.c b/engine/client/snd_alsa.c index 5903f32cc..4f9d2237e 100755 --- a/engine/client/snd_alsa.c +++ b/engine/client/snd_alsa.c @@ -39,6 +39,7 @@ static void *alsasharedobject; int (*psnd_pcm_open) (snd_pcm_t **pcm, const char *name, snd_pcm_stream_t stream, int mode); int (*psnd_pcm_close) (snd_pcm_t *pcm); +int (*psnd_config_update_free_global)(void); const char *(*psnd_strerror) (int errnum); int (*psnd_pcm_hw_params_any) (snd_pcm_t *pcm, snd_pcm_hw_params_t *params); int (*psnd_pcm_hw_params_set_access) (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t _access); @@ -179,6 +180,7 @@ static void ALSA_RW_Submit (soundcardinfo_t *sc, int start, int end) static void ALSA_Shutdown (soundcardinfo_t *sc) { psnd_pcm_close (sc->handle); + psnd_config_update_free_global(); //and try to reduce leaks if (sc->Submit == ALSA_RW_Submit) free(sc->sn.buffer); @@ -217,6 +219,7 @@ static qboolean Alsa_InitAlsa(void) psnd_pcm_open = dlsym(alsasharedobject, "snd_pcm_open"); psnd_pcm_close = dlsym(alsasharedobject, "snd_pcm_close"); + psnd_config_update_free_global = dlsym(alsasharedobject, "snd_config_update_free_global"); psnd_strerror = dlsym(alsasharedobject, "snd_strerror"); psnd_pcm_hw_params_any = dlsym(alsasharedobject, "snd_pcm_hw_params_any"); psnd_pcm_hw_params_set_access = dlsym(alsasharedobject, "snd_pcm_hw_params_set_access"); @@ -251,6 +254,7 @@ static qboolean Alsa_InitAlsa(void) alsaworks = psnd_pcm_open && psnd_pcm_close + && psnd_config_update_free_global && psnd_strerror && psnd_pcm_hw_params_any && psnd_pcm_hw_params_set_access diff --git a/engine/common/com_mesh.c b/engine/common/com_mesh.c index bcdabf434..448d7d7dd 100644 --- a/engine/common/com_mesh.c +++ b/engine/common/com_mesh.c @@ -2975,6 +2975,9 @@ void Mod_LoadAliasShaders(model_t *mod) if (r_loadbumpmapping) loadflags |= SHADER_HASNORMALMAP; mipdata[0] = f->texels; + mipdata[1] = NULL; + mipdata[2] = NULL; + mipdata[3] = NULL; R_BuildLegacyTexnums(f->shader, basename, alttexpath, loadflags, imageflags, skintranstype, s->skinwidth, s->skinheight, mipdata, host_basepal); } else diff --git a/engine/common/common.c b/engine/common/common.c index 8da12440d..443a92caf 100644 --- a/engine/common/common.c +++ b/engine/common/common.c @@ -93,17 +93,15 @@ anyway, the actual interface is the same. the old version might be slower, but w #endif /*end glibc workaround*/ -#define NUM_SAFE_ARGVS 6 - usercmd_t nullcmd; // guarenteed to be zero entity_state_t nullentitystate; //this is the default state -static const char *largv[MAX_NUM_ARGVS + NUM_SAFE_ARGVS + 1]; -static char *argvdummy = " "; +static char *safeargvs[] = + {"-stdvid", "-nolan", "-nosound", "-nocdaudio", "-nojoy", "-nomouse", "-nohome", "-window"}; -static char *safeargvs[NUM_SAFE_ARGVS] = - {"-stdvid", "-nolan", "-nosound", "-nocdaudio", "-nojoy", "-nomouse"}; +static const char *largv[MAX_NUM_ARGVS + countof(safeargvs) + 1]; +static char *argvdummy = " "; cvar_t registered = CVARD("registered","0","Set if quake's pak1.pak is available"); cvar_t gameversion = CVARFD("gameversion","", CVAR_SERVERINFO, "gamecode version for server browsers"); @@ -4709,7 +4707,7 @@ void COM_InitArgv (int argc, const char **argv) //not allowed to tprint { // force all the safe-mode switches. Note that we reserved extra space in // case we need to add these, so we don't need an overflow check - for (i=0 ; ihandshaking = true; if (file->session) + { qgnutls_bye (file->session, file->datagram?GNUTLS_SHUT_WR:GNUTLS_SHUT_RDWR); + qgnutls_deinit(file->session); + } file->session = NULL; if (file->stream) VFS_CLOSE(file->stream); file->stream = NULL; + Z_Free(file); return true; } @@ -952,10 +959,14 @@ qboolean SSL_InitGlobal(qboolean isserver) { static int initstatus[2]; isserver = !!isserver; + if (COM_CheckParm("-notls")) + return false; + Sys_LockMutex(com_resourcemutex); if (!initstatus[isserver]) { if (!Init_GNUTLS()) { + Sys_UnlockMutex(com_resourcemutex); Con_Printf("GnuTLS "GNUTLS_VERSION" library not available.\n"); return false; } @@ -980,6 +991,7 @@ qboolean SSL_InitGlobal(qboolean isserver) qgnutls_certificate_set_x509_trust_file (xcred[isserver], CAFILE, GNUTLS_X509_FMT_PEM); #endif + Sys_UnlockMutex(com_resourcemutex); if (isserver) { #if 1 @@ -1004,6 +1016,8 @@ qboolean SSL_InitGlobal(qboolean isserver) qgnutls_certificate_set_verify_function (xcred[isserver], SSL_CheckCert); #endif } + else + Sys_UnlockMutex(com_resourcemutex); if (initstatus[isserver] < 0) return false; diff --git a/engine/gl/gl_font.c b/engine/gl/gl_font.c index 7c2a30a36..a422b41de 100644 --- a/engine/gl/gl_font.c +++ b/engine/gl/gl_font.c @@ -2192,6 +2192,7 @@ struct font_s *Font_LoadFont(float vheight, const char *fontfilename) //removes a font from memory. void Font_Free(struct font_s *f) { + size_t i; struct charcache_s **link, *c, *valid; //kill the alt font first. @@ -2237,6 +2238,10 @@ void Font_Free(struct font_s *f) Z_Free(qface); } } + + for (i = 0; i < FONTBLOCKS; i++) + if (f->chars[i]) + Z_Free(f->chars[i]); Z_Free(f); } diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index e98010374..fe641531b 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -5642,11 +5642,11 @@ void QDECL R_BuildLegacyTexnums(shader_t *shader, const char *fallbackname, cons case TF_MIP4_SOLID8: case TF_SOLID8: imageflags |= IF_NOALPHA; - if (!mipdata[0] || !mipdata[1] || !mipdata[2] || !mipdata[3]) + if (!mipdata || !mipdata[0] || !mipdata[1] || !mipdata[2] || !mipdata[3]) basefmt = TF_SOLID8; break; default: - if (!mipdata[0] || !mipdata[1] || !mipdata[2] || !mipdata[3]) + if (!mipdata || !mipdata[0] || !mipdata[1] || !mipdata[2] || !mipdata[3]) basefmt = TF_SOLID8; break; } diff --git a/engine/gl/gl_vidlinuxglx.c b/engine/gl/gl_vidlinuxglx.c index 7357b2d77..ef4178609 100644 --- a/engine/gl/gl_vidlinuxglx.c +++ b/engine/gl/gl_vidlinuxglx.c @@ -3194,9 +3194,13 @@ qboolean X11VID_Init (rendererstate_t *info, unsigned char *palette, int psl) case PSL_GLX: if (!GLX_Init(info, fbconfig, visinfo)) { + if (visinfo != &vinfodef) + x11.pXFree(visinfo); GLVID_Shutdown(); return false; } + if (visinfo != &vinfodef) + x11.pXFree(visinfo); break; #ifdef USE_EGL case PSL_EGL: @@ -3441,7 +3445,7 @@ void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type for (i = 0; i < devs; i++) { if (!dev[i].enabled) - return; + continue; if (/*dev[i].use == XIMasterPointer ||*/ dev[i].use == XISlavePointer) { struct xidevinfo *devi = XI2_GetDeviceInfo(dev[i].deviceid); diff --git a/engine/qclib/initlib.c b/engine/qclib/initlib.c index be6974c7a..eba48fec7 100644 --- a/engine/qclib/initlib.c +++ b/engine/qclib/initlib.c @@ -746,6 +746,8 @@ eval_t *PDECL PR_FindGlobal(pubprogfuncs_t *ppf, const char *globname, progsnum_ unsigned int i; ddef16_t *var16; ddef32_t *var32; + if (type) + *type = ev_void; if (pnum == PR_CURRENT) pnum = prinst.pr_typecurrent; if (pnum == PR_ANY)