Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .jules/sentinel.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@
**Vulnerability:** Raw `stop()` and `warning()` calls without `call. = FALSE` in `llcont.R` and `vuongtest.R` exposed execution stack/call details when raised.
**Learning:** While some instances of `stop()` inside `tryCatch()` were previously fixed to hide the call stack, other standalone exceptions and warnings still leaked call context. Security must be consistently applied across the entire codebase.
**Prevention:** Always set `call. = FALSE` when using `stop()` or `warning()` to enforce a secure-by-default boundary and prevent internal execution paths from being disclosed to the end user.
## 2024-05-18 - Missing Input Validation in Exported Functions
**Vulnerability:** User inputs passed to exported functions like `vuongtest` and `icci` lacked strict type and length validation (e.g., `nested=c(TRUE, FALSE)`).
**Learning:** R's lazy evaluation and conditional structures (like `if`) can cause raw errors (e.g., "condition has length > 1") deep inside the logic when unvalidated inputs are processed, bypassing top-level `stop(..., call. = FALSE)` safeguards and leaking internal execution context.
**Prevention:** Always strictly validate the type, length, and bounds of user inputs at the very beginning of exported functions using `stop(..., call. = FALSE)` to ensure a secure boundary and prevent information disclosure.
4 changes: 4 additions & 0 deletions R/icci.R
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@
#' @export
icci <- function(object1, object2, conf.level=.95, ll1=llcont, ll2=llcont) {

if (length(conf.level) != 1 || !is.numeric(conf.level) || is.na(conf.level) || conf.level <= 0 || conf.level >= 1) {
stop("The 'conf.level' argument must be a single numeric value between 0 and 1.", call. = FALSE)
}
Comment on lines +68 to +70

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Validation change omitted from changelog

The new exported argument errors change user-visible behavior, but NEWS contains no entry. Repository conventions require one.

Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.


## check objects, issue warnings/errors, get classes/calls
obinfo <- check.obj(object1, object2)
callA <- obinfo$callA; classA <- obinfo$classA
Expand Down
7 changes: 7 additions & 0 deletions R/vuongtest.R
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,13 @@
#' @export
vuongtest <- function(object1, object2, nested=FALSE, adj="none", ll1=llcont, ll2=llcont, score1=NULL, score2=NULL, vc1=vcov, vc2=vcov) {

if (length(nested) != 1 || !is.logical(nested) || is.na(nested)) {
stop("The 'nested' argument must be a single logical value (TRUE or FALSE).", call. = FALSE)
}
if (length(adj) != 1 || !is.character(adj) || !(adj %in% c("none", "aic", "bic"))) {
stop("The 'adj' argument must be a single string ('none', 'aic', or 'bic').", call. = FALSE)
}
Comment on lines +101 to +106

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Validation lacks regression coverage

No tests exercise the new scalar, missing-value, membership, or boundary checks. Later changes can silently weaken these exported input guarantees.

Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.


## check objects, issue warnings/errors, get classes/calls
obinfo <- check.obj(object1, object2)
callA <- obinfo$callA; classA <- obinfo$classA
Expand Down
Loading