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,9 @@ 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 - 1 );
295+ loggerConfig .file_name [MAX_FILE_PATH - 1 ] =
296+ '\0' ; // ensure null-termination
293297 } else {
294298 loggerConfig .output = stderr ;
295299 LOG_ERR ("Logging output not set - logging disabled (UMF_LOG = \"%s\")" ,
@@ -506,17 +510,29 @@ static umf_result_t CTL_READ_HANDLER(output)(void *ctx,
506510 /* suppress unused-parameter errors */
507511 (void )source , (void )indexes , (void )ctx ;
508512
509- const char * * arg_out = (const char * * )arg ;
510- if (arg_out == NULL || size < sizeof ( const char * ) ) {
513+ char * arg_out = (char * )arg ;
514+ if (arg_out == NULL ) {
511515 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
512516 }
513517
514518 if (loggerConfig .output == NULL ) {
515- * arg_out = "disabled" ;
519+ const char disabled [] = "disabled" ;
520+ if (size < sizeof (disabled )) {
521+ LOG_ERR ("Invalid output argument size: %zu, expected at least %zu" ,
522+ size , sizeof (disabled ));
523+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
524+ }
525+
526+ strncpy (arg_out , disabled , size );
516527 return UMF_RESULT_SUCCESS ;
517528 }
529+ if (size < strlen (loggerConfig .file_name )) {
530+ LOG_ERR ("Invalid output argument size: %zu, expected at least %zu" ,
531+ size , strlen (loggerConfig .file_name ));
532+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
533+ }
518534
519- * arg_out = loggerConfig .file_name ;
535+ strncpy ( arg_out , loggerConfig .file_name , size ) ;
520536 return UMF_RESULT_SUCCESS ;
521537}
522538
@@ -525,16 +541,13 @@ static umf_result_t CTL_WRITE_HANDLER(output)(void *ctx,
525541 void * arg , size_t size ,
526542 umf_ctl_index_utlist_t * indexes ) {
527543 /* suppress unused-parameter errors */
528- (void )source , (void )indexes , (void )ctx ;
544+ (void )source , (void )indexes , (void )ctx , ( void ) size ;
529545
530- const char * arg_in = * (const char * * )arg ;
531- if (size < sizeof (const char * )) {
532- return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
533- }
546+ const char * arg_in = (const char * )arg ;
534547
535548 FILE * oldHandle = loggerConfig .output ;
536549 const char * oldName =
537- loggerConfig .file_name ? loggerConfig .file_name : "disabled" ;
550+ * loggerConfig .file_name == '\0' ? loggerConfig .file_name : "disabled" ;
538551
539552 if (arg_in == NULL ) {
540553 if (loggerConfig .output ) {
@@ -543,7 +556,7 @@ static umf_result_t CTL_WRITE_HANDLER(output)(void *ctx,
543556 fclose (oldHandle );
544557 }
545558 loggerConfig .output = NULL ;
546- loggerConfig .file_name = NULL ;
559+ loggerConfig .file_name [ 0 ] = '\0' ;
547560 }
548561 return UMF_RESULT_SUCCESS ;
549562 }
@@ -552,16 +565,18 @@ static umf_result_t CTL_WRITE_HANDLER(output)(void *ctx,
552565
553566 if (strcmp (arg_in , "stdout" ) == 0 ) {
554567 newHandle = stdout ;
555- loggerConfig .file_name = "stdout" ;
568+ strncpy ( loggerConfig .file_name , "stdout" , MAX_FILE_PATH ) ;
556569 } else if (strcmp (arg_in , "stderr" ) == 0 ) {
557570 newHandle = stderr ;
558- loggerConfig .file_name = "stderr" ;
571+ strncpy ( loggerConfig .file_name , "stderr" , MAX_FILE_PATH ) ;
559572 } else {
560573 newHandle = fopen (arg_in , "a" );
561574 if (!newHandle ) {
562575 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
563576 }
564- loggerConfig .file_name = arg_in ;
577+ strncpy (loggerConfig .file_name , arg_in , MAX_FILE_PATH - 1 );
578+ loggerConfig .file_name [MAX_FILE_PATH - 1 ] =
579+ '\0' ; // ensure null-termination
565580 }
566581
567582 loggerConfig .output = newHandle ;
0 commit comments