77 *
88 */
99
10+ #include "base_alloc_global.h"
11+ #include "umf/base.h"
1012#ifdef _WIN32
1113#include <windows.h>
1214#else
@@ -66,11 +68,11 @@ typedef struct {
6668 utils_log_level_t level ;
6769 utils_log_level_t flushLevel ;
6870 FILE * output ;
69- const char * file_name ;
71+ char file_name [ MAX_FILE_PATH ] ;
7072} utils_log_config_t ;
7173
7274utils_log_config_t loggerConfig = {false, false, LOG_ERROR ,
73- LOG_ERROR , NULL , NULL };
75+ LOG_ERROR , NULL , "" };
7476
7577static const char * level_to_str (utils_log_level_t l ) {
7678 switch (l ) {
@@ -257,10 +259,10 @@ void utils_log_init(void) {
257259 const char * arg ;
258260 if (utils_parse_var (envVar , "output:stdout" , NULL )) {
259261 loggerConfig .output = stdout ;
260- loggerConfig .file_name = "stdout" ;
262+ strncpy ( loggerConfig .file_name , "stdout" , MAX_FILE_PATH ) ;
261263 } else if (utils_parse_var (envVar , "output:stderr" , NULL )) {
262264 loggerConfig .output = stderr ;
263- loggerConfig .file_name = "stderr" ;
265+ strncpy ( loggerConfig .file_name , "stderr" , MAX_FILE_PATH ) ;
264266 } else if (utils_parse_var (envVar , "output:file" , & arg )) {
265267 loggerConfig .output = NULL ;
266268 const char * argEnd = strstr (arg , ";" );
@@ -289,7 +291,7 @@ void utils_log_init(void) {
289291 loggerConfig .output = NULL ;
290292 return ;
291293 }
292- loggerConfig .file_name = file ;
294+ strncpy ( loggerConfig .file_name , file , MAX_FILE_PATH ) ;
293295 } else {
294296 loggerConfig .output = stderr ;
295297 LOG_ERR ("Logging output not set - logging disabled (UMF_LOG = \"%s\")" ,
@@ -506,17 +508,29 @@ static umf_result_t CTL_READ_HANDLER(output)(void *ctx,
506508 /* suppress unused-parameter errors */
507509 (void )source , (void )indexes , (void )ctx ;
508510
509- const char * * arg_out = (const char * * )arg ;
510- if (arg_out == NULL || size < sizeof ( const char * ) ) {
511+ char * arg_out = (char * )arg ;
512+ if (arg_out == NULL ) {
511513 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
512514 }
513515
514516 if (loggerConfig .output == NULL ) {
515- * arg_out = "disabled" ;
517+ const char disabled [] = "disabled" ;
518+ if (size < sizeof (disabled )) {
519+ LOG_ERR ("Invalid output argument size: %zu, expected at least %zu" ,
520+ size , sizeof (disabled ));
521+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
522+ }
523+
524+ strncpy (arg_out , disabled , size );
516525 return UMF_RESULT_SUCCESS ;
517526 }
527+ if (size < strlen (loggerConfig .file_name )) {
528+ LOG_ERR ("Invalid output argument size: %zu, expected at least %zu" ,
529+ size , strlen (loggerConfig .file_name ));
530+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
531+ }
518532
519- * arg_out = loggerConfig .file_name ;
533+ strncpy ( arg_out , loggerConfig .file_name , size ) ;
520534 return UMF_RESULT_SUCCESS ;
521535}
522536
@@ -525,16 +539,13 @@ static umf_result_t CTL_WRITE_HANDLER(output)(void *ctx,
525539 void * arg , size_t size ,
526540 umf_ctl_index_utlist_t * indexes ) {
527541 /* suppress unused-parameter errors */
528- (void )source , (void )indexes , (void )ctx ;
542+ (void )source , (void )indexes , (void )ctx , ( void ) size ;
529543
530- const char * arg_in = * (const char * * )arg ;
531- if (size < sizeof (const char * )) {
532- return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
533- }
544+ const char * arg_in = (const char * )arg ;
534545
535546 FILE * oldHandle = loggerConfig .output ;
536547 const char * oldName =
537- loggerConfig .file_name ? loggerConfig .file_name : "disabled" ;
548+ * loggerConfig .file_name == '\0' ? loggerConfig .file_name : "disabled" ;
538549
539550 if (arg_in == NULL ) {
540551 if (loggerConfig .output ) {
@@ -543,7 +554,7 @@ static umf_result_t CTL_WRITE_HANDLER(output)(void *ctx,
543554 fclose (oldHandle );
544555 }
545556 loggerConfig .output = NULL ;
546- loggerConfig .file_name = NULL ;
557+ loggerConfig .file_name [ 0 ] = '\0' ;
547558 }
548559 return UMF_RESULT_SUCCESS ;
549560 }
@@ -552,16 +563,18 @@ static umf_result_t CTL_WRITE_HANDLER(output)(void *ctx,
552563
553564 if (strcmp (arg_in , "stdout" ) == 0 ) {
554565 newHandle = stdout ;
555- loggerConfig .file_name = "stdout" ;
566+ strncpy ( loggerConfig .file_name , "stdout" , MAX_FILE_PATH ) ;
556567 } else if (strcmp (arg_in , "stderr" ) == 0 ) {
557568 newHandle = stderr ;
558- loggerConfig .file_name = "stderr" ;
569+ strncpy ( loggerConfig .file_name , "stderr" , MAX_FILE_PATH ) ;
559570 } else {
560571 newHandle = fopen (arg_in , "a" );
561572 if (!newHandle ) {
562573 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
563574 }
564- loggerConfig .file_name = arg_in ;
575+ strncpy (loggerConfig .file_name , arg_in , MAX_FILE_PATH - 1 );
576+ loggerConfig .file_name [MAX_FILE_PATH - 1 ] =
577+ '\0' ; // ensure null-termination
565578 }
566579
567580 loggerConfig .output = newHandle ;
0 commit comments