Skip to content

Commit bd9ab62

Browse files
committed
fix: validate log level before setting logger configuration
1 parent b651e35 commit bd9ab62

File tree

1 file changed

+42
-16
lines changed

1 file changed

+42
-16
lines changed

datadog-log-ffi/src/lib.rs

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,34 @@ use datadog_log::logger;
55
use datadog_log::logger::{logger_configure, logger_set_log_level};
66
use ddcommon_ffi::{CharSlice, Error};
77

8+
/// Validates that the log level is within the valid range (0 to 4).
9+
fn validate_log_level(level: logger::LogEventLevel) -> Result<(), Error> {
10+
let level_value = level as i8;
11+
if level_value >= 0 && level_value <= logger::LogEventLevel::Error as i8 {
12+
Ok(())
13+
} else {
14+
Err(Error::from(format!(
15+
"Invalid log level: {} (must be between 0 and 4)",
16+
level_value
17+
)))
18+
}
19+
}
20+
821
/// Sets the global log level.
922
///
1023
/// # Arguments
1124
/// * `log_level` - The minimum level for events to be logged
1225
///
1326
/// # Errors
14-
/// Returns an error if the log level cannot be set.
27+
/// Returns an error if the log level cannot be set or if the level is invalid.
1528
#[no_mangle]
1629
pub extern "C" fn ddog_logger_set_log_level(
1730
log_level: logger::LogEventLevel,
1831
) -> Option<Box<Error>> {
19-
logger_set_log_level(log_level).err().map(Box::new)
32+
validate_log_level(log_level)
33+
.and_then(|_| logger_set_log_level(log_level))
34+
.err()
35+
.map(Box::new)
2036
}
2137

2238
/// Disables logging by configuring a no-op logger.
@@ -45,14 +61,19 @@ pub struct StdoutConfig {
4561
/// * `config` - Configuration for stdout logging including log level
4662
///
4763
/// # Errors
48-
/// Returns an error if the logger cannot be configured.
64+
/// Returns an error if the logger cannot be configured or if the log level is invalid.
4965
#[no_mangle]
5066
pub extern "C" fn ddog_logger_configure_stdout(config: StdoutConfig) -> Option<Box<Error>> {
51-
let logger_config = logger::LoggerConfig {
52-
level: config.level,
53-
writer: logger::WriterConfig::Stdout,
54-
};
55-
logger_configure(logger_config).err().map(Box::new)
67+
validate_log_level(config.level)
68+
.and_then(|_| {
69+
let logger_config = logger::LoggerConfig {
70+
level: config.level,
71+
writer: logger::WriterConfig::Stdout,
72+
};
73+
logger_configure(logger_config)
74+
})
75+
.err()
76+
.map(Box::new)
5677
}
5778

5879
/// Configuration for file output.
@@ -70,14 +91,19 @@ pub struct FileConfig<'a> {
7091
/// * `config` - Configuration for file logging including path and log level
7192
///
7293
/// # Errors
73-
/// Returns an error if the logger cannot be configured.
94+
/// Returns an error if the logger cannot be configured or if the log level is invalid.
7495
#[no_mangle]
7596
pub extern "C" fn ddog_logger_configure_file(config: FileConfig) -> Option<Box<Error>> {
76-
let logger_config = logger::LoggerConfig {
77-
level: config.level,
78-
writer: logger::WriterConfig::File(logger::FileConfig {
79-
path: config.path.to_string(),
80-
}),
81-
};
82-
logger_configure(logger_config).err().map(Box::new)
97+
validate_log_level(config.level)
98+
.and_then(|_| {
99+
let logger_config = logger::LoggerConfig {
100+
level: config.level,
101+
writer: logger::WriterConfig::File(logger::FileConfig {
102+
path: config.path.to_string(),
103+
}),
104+
};
105+
logger_configure(logger_config)
106+
})
107+
.err()
108+
.map(Box::new)
83109
}

0 commit comments

Comments
 (0)