Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make sure filter_pattern can fit in test_filter #42

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

ihilt
Copy link

@ihilt ihilt commented Jan 2, 2025

Discovered an issue while compiling with cmake -DCMAKE_BUILD_TYPE=Release,

In function ‘strncpy’,
    inlined from ‘parse_args’ at /rktest/include/rktest/rktest.h:929:4,
    inlined from ‘initialize’ at /rktest/include/rktest/rktest.h:981:27,
/rktest/include/rktest/rktest.h:1188:27:
/usr/include/x86_64-linux-gnu/bits/string_fortified.h:95:10: error: ‘__builtin___strncpy_chk’ specified bound depends on the length of the source argument [-Werror=stringop-truncation]
   95 |   return __builtin___strncpy_chk (__dest, __src, __len,
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   96 |                                   __glibc_objsize (__dest));
      |                                   ~~~~~~~~~~~~~~~~~~~~~~~~~

The third parameter was being determined by the length on the source, which is what this error is complaining about. Since strncpy will copy up to the first NULL byte in the source, copying to the destination size is safer, and I think expected by strncpy.

This also means we should only copy up to one less than the destination size since strncpy won't NULL-terminate the destination for us if the source doesn't have one. I handle this by adding a local variable that is one less than RKTEST_MAX_FILTER_LENGTH.

Copy link
Owner

@Warwolt Warwolt left a comment

Choose a reason for hiding this comment

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

Thanks for the pull request! I think we can probably keep it pretty succinct.

Comment on lines +924 to +926
const size_t max_filter_len = RKTEST_MAX_FILTER_LENGTH - 1;
if (filter_len > max_filter_len) {
fprintf(stderr, "Error: filter pattern too long. Max length is (%lu)", max_filter_len);
Copy link
Owner

@Warwolt Warwolt Feb 9, 2025

Choose a reason for hiding this comment

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

Suggested change
const size_t max_filter_len = RKTEST_MAX_FILTER_LENGTH - 1;
if (filter_len > max_filter_len) {
fprintf(stderr, "Error: filter pattern too long. Max length is (%lu)", max_filter_len);
if (strlen(filter_pattern) > RKTEST_MAX_FILTER_LENGTH - 1) {
fprintf(stderr, "Error: filter pattern too long. Max length is (%lu)", RKTEST_MAX_FILTER_LENGTH - 1));

Comment on lines +930 to +946
// strncpy will copy all bytes up to a NULL in the source or until it
// reaches the size in the third param.
//
// This means if the source string is equal to or greater than the length,
// it will not add a NULL to the end of the destination.
//
// Examples from the strncpy man page are useful,
//
// strncpy(buf, "1", 5); // { '1', 0, 0, 0, 0 }
// strncpy(buf, "1234", 5); // { '1', '2', '3', '4', 0 }
// strncpy(buf, "12345", 5); // { '1', '2', '3', '4', '5' }
// strncpy(buf, "123456", 5); // { '1', '2', '3', '4', '5' }
//
// So if test_filter is a char[256], then max_filter_len will be 255 and if
// filter_pattern is also 255, then it will have one character left which
// strncpy will make a NULL.
strncpy(config.test_filter, filter_pattern, max_filter_len);
Copy link
Owner

@Warwolt Warwolt Feb 9, 2025

Choose a reason for hiding this comment

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

Suggested change
// strncpy will copy all bytes up to a NULL in the source or until it
// reaches the size in the third param.
//
// This means if the source string is equal to or greater than the length,
// it will not add a NULL to the end of the destination.
//
// Examples from the strncpy man page are useful,
//
// strncpy(buf, "1", 5); // { '1', 0, 0, 0, 0 }
// strncpy(buf, "1234", 5); // { '1', '2', '3', '4', 0 }
// strncpy(buf, "12345", 5); // { '1', '2', '3', '4', '5' }
// strncpy(buf, "123456", 5); // { '1', '2', '3', '4', '5' }
//
// So if test_filter is a char[256], then max_filter_len will be 255 and if
// filter_pattern is also 255, then it will have one character left which
// strncpy will make a NULL.
strncpy(config.test_filter, filter_pattern, max_filter_len);
strncpy(config.test_filter, filter_pattern, RKTEST_MAX_FILTER_LENGTH - 1);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants