Potentially overflowing call to snprintf (alerts 11, 12)#3750
Merged
rhc54 merged 1 commit intoopenpmix:masterfrom Dec 25, 2025
Merged
Potentially overflowing call to snprintf (alerts 11, 12)#3750rhc54 merged 1 commit intoopenpmix:masterfrom
rhc54 merged 1 commit intoopenpmix:masterfrom
Conversation
Per Copilot autofix:
In general, when using snprintf in a loop to build up a string, you must check each call’s return value before using it: if the return value is negative or greater than or equal to the remaining buffer size, you should stop writing and handle the error, rather than unconditionally adding the return value to your running length. This prevents len from being corrupted by a “would-have-written” size that is larger than the remaining space.
For this specific function, the safest fix with minimal functional change is:
Track the remaining space explicitly (remaining = max_ranks_len;) and always pass remaining as the size argument.
After each snprintf, if n < 0 or n >= remaining, treat it as failure: free the buffer, set *ranks = NULL, optionally log the error, and return early.
Only if n is valid, subtract it from remaining and increment len by n.
Because we are now checking after each call, the final if (len >= max_ranks_len - 1) becomes unnecessary, but we can keep a light sanity check if desired. To minimize changes, we can retain len and the final check, but make sure we never let len exceed max_ranks_len during the loop.
Concretely, in fill_seq_ranks_array in test/test_server.c, we will:
Introduce an int n; and a int remaining = max_ranks_len;.
Replace the two snprintf calls to:
Call snprintf(*ranks + len, remaining, ...).
Check if (n < 0 || n >= remaining) { free(*ranks); *ranks = NULL; TEST_ERROR(...); return; }.
Update len += n; remaining -= n;.
Keep allocations and the if (0 >= nprocs) early-return logic unchanged.
No new methods or external libraries are required; we only reuse malloc, free, snprintf, and the existing TEST_ERROR macro.
Signed-off-by: Ralph Castain <rhc@pmix.org>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Per Copilot autofix:
In general, when using snprintf in a loop to build up a string, you must check each call’s return value before using it: if the return value is negative or greater than or equal to the remaining buffer size, you should stop writing and handle the error, rather than unconditionally adding the return value to your running length. This prevents len from being corrupted by a “would-have-written” size that is larger than the remaining space.
For this specific function, the safest fix with minimal functional change is:
Concretely, in fill_seq_ranks_array in test/test_server.c, we will:
No new methods or external libraries are required; we only reuse malloc, free, snprintf, and the existing TEST_ERROR macro.