diff --git a/common/logstuff.cpp b/common/logstuff.cpp index e3aa6ca2b..71d02c3e1 100644 --- a/common/logstuff.cpp +++ b/common/logstuff.cpp @@ -493,12 +493,19 @@ static void InternalLogMail( const char *msgbuffer, unsigned int msglen, int /*f // a (va_list *) instead to avoid this problem void LogWithPointer( int loggingTo, const char *format, va_list *arglist ) { - char msgbuffer[1024]; //min 1024!!, but also think of other OSs stack!! + int scrwidth = ASSUMED_SCREEN_WIDTH; /* assume this for consistency */ + ConGetSize(&scrwidth,NULL); /* sets to 80 or does not touch if not supported */ + + char fixed_msgbuffer[1024]; //min 1024!!, but also think of other OSs stack!! + char *msgbuffer = &fixed_msgbuffer[0]; + + //the code below may insert some characters + unsigned extra_bytes = scrwidth > 4 ? scrwidth : 4; + unsigned int msglen = 0, sel; char *buffptr, *obuffptr; int old_loggingTo = loggingTo; - msgbuffer[0]=0; loggingTo &= (logstatics.loggingTo|LOGTO_RAWMODE); if ( !format || !*format ) @@ -506,10 +513,21 @@ void LogWithPointer( int loggingTo, const char *format, va_list *arglist ) if ( loggingTo != LOGTO_NONE ) { - if ( arglist == NULL ) - strcat( msgbuffer, format ); - else - vsprintf( msgbuffer, format, *arglist ); + if ( arglist == NULL ) { + const size_t len = strlen(format); + if (len >= sizeof(fixed_msgbuffer) - extra_bytes) { + msgbuffer = (char *)malloc(len + 1 + extra_bytes); + if (msgbuffer) { + memcpy(msgbuffer, format, len + 1); + } else { + msgbuffer = &fixed_msgbuffer[0]; + memcpy(msgbuffer, format, sizeof(fixed_msgbuffer) - 1 - extra_bytes); + msgbuffer[sizeof(fixed_msgbuffer) - 1 - extra_bytes] = 0; + } + } else + memcpy(msgbuffer, format, len + 1); + } else + vsnprintf(msgbuffer, sizeof(fixed_msgbuffer) - extra_bytes, format, *arglist); msglen = strlen( msgbuffer ); if ( msglen == 0 ) @@ -571,9 +589,6 @@ void LogWithPointer( int loggingTo, const char *format, va_list *arglist ) if (( loggingTo & LOGTO_SCREEN ) != 0) { - int scrwidth = ASSUMED_SCREEN_WIDTH; /* assume this for consistancy */ - ConGetSize(&scrwidth,NULL); /* gets set to 80 or untouched, if not supported */ - #ifdef ASSERT_WIDTH_80 //"show" where badly formatted lines are cropping up //if (logstatics.stdoutisatty) { @@ -645,6 +660,10 @@ void LogWithPointer( int loggingTo, const char *format, va_list *arglist ) } } + if (msgbuffer != &fixed_msgbuffer[0]) { + free(msgbuffer); + } + return; } @@ -716,6 +735,11 @@ void LogRaw( const char *format, ... ) return; } +void LogRawString( const char *str ) +{ + LogWithPointer( LOGTO_RAWMODE | LOGAS_LOG, str, NULL); +} + void LogTo( int towhat, const char *format, ... ) { va_list argptr; diff --git a/common/logstuff.h b/common/logstuff.h index 7c1deeb86..f42ecbbc9 100644 --- a/common/logstuff.h +++ b/common/logstuff.h @@ -50,6 +50,9 @@ extern void LogScreenRaw( const char *format, ... ) __CHKFMT_PRINTF; //Log to mail+file+screen. No adjustments. extern void LogRaw( const char *format, ... ) __CHKFMT_PRINTF; +//Log to mail+file+screen. No adjustments. Supports very long strings but not formatting. +extern void LogRawString( const char *str ); + //Log to LOGTO_* flags (RAW implies screen) extern void LogTo( int towhat, const char *format, ... ) __CHKFMT_LOGTO; diff --git a/rc5-72/opencl/ocl_common.cpp b/rc5-72/opencl/ocl_common.cpp index e45dda4af..f4a5a9acb 100644 --- a/rc5-72/opencl/ocl_common.cpp +++ b/rc5-72/opencl/ocl_common.cpp @@ -239,12 +239,14 @@ bool BuildCLProgram(ocl_context_t *cont, const char* programText, const char *ke free(decompressed_src); if (status == CL_SUCCESS) { - //status = clBuildProgram(cont->program, 1, &cont->deviceID, NULL, NULL, NULL); status = clBuildProgram(cont->program, 1, &cont->deviceID, "-cl-std=CL1.1", NULL, NULL); + //"-cl-std=CL1.1" does not work for some devices (e. g. Intel Xe Graphics family) + if (CL_BUILD_PROGRAM_FAILURE == status) { + status = clBuildProgram(cont->program, 1, &cont->deviceID, NULL, NULL, NULL); + } } if (ocl_diagnose(status, "building cl program", cont) != CL_SUCCESS) { - //static char buf[0x10001]={0}; size_t log_size; clGetProgramBuildInfo( cont->program, @@ -254,7 +256,12 @@ bool BuildCLProgram(ocl_context_t *cont, const char* programText, const char *ke NULL, &log_size ); - char *buf = (char *) malloc(log_size); + Log("Build log returned %ld bytes\n", (long)log_size); + char *buf = (char *) malloc(log_size + 1); + if (!buf) { + LogRaw("Unable to print build log (not enough memory)\n"); + return false; + } clGetProgramBuildInfo( cont->program, cont->deviceID, CL_PROGRAM_BUILD_LOG, @@ -262,10 +269,10 @@ bool BuildCLProgram(ocl_context_t *cont, const char* programText, const char *ke buf, NULL ); - buf[log_size - 1] = '\0'; - Log("Build log returned %ld bytes\n", (long)log_size); + buf[log_size - 1] = '\n'; + buf[log_size] = '\0'; LogRaw("Build Log:\n"); - LogRaw("%s\n", buf); + LogRawString(buf); free(buf);