-
Notifications
You must be signed in to change notification settings - Fork 1.4k
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
[systemd-sonic-generator] Fix overlapping strings being passed to strcpy/strcat #13647
Conversation
…cpy/strcat Signed-off-by: Stepan Blyschak <[email protected]>
/azp run Azure.sonic-buildimage |
Azure Pipelines successfully started running 1 pipeline(s). |
/azpw run Azure.sonic-buildimage |
/AzurePipelines run Azure.sonic-buildimage |
Azure Pipelines successfully started running 1 pipeline(s). |
@@ -608,11 +608,14 @@ int ssg_main(int argc, char **argv) { | |||
for (int i = 0; i < num_unit_files; i++) { | |||
unit_instance = strdup(unit_files[i]); | |||
if ((num_asics == 1) && strstr(unit_instance, "@") != NULL) { | |||
prefix = strtok_r(unit_instance, "@", &saveptr); | |||
suffix = strtok_r(NULL, "@", &saveptr); | |||
prefix = strdup(strtok_r(unit_instance, "@", &saveptr)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@qiluo-msft This code has been already covered by UT. This bug is observed with -O2 -fstack-protector-strong but UT are not usually compiled with such flags. I think we need to run UT with some address sanitizer that can catch it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for the fix.
Is my understanding correc that the issue is because we are using unit_instance variable in strtok_r and also to copy and create final unit_instance string?
If that is the case, will it be better to create a new string final_unit_instance to avoid any issue?
#include<string.h>
#include<stdio.h>
int main(){
char unit_file[] = "[email protected]";
printf("\nunit_file=%s\n", unit_file);
char *unit_instance = strdup(unit_file);
char *prefix;
char *suffix;
char *save_ptr;
prefix = strtok_r(unit_instance, "@", &save_ptr);
printf("\nunit_instance = %s\n", unit_instance);
suffix = strtok_r(NULL, "\n", &save_ptr);
printf("\nprefix = %s\n", prefix);
printf("\nprefix=%s, suffix=%s\n", prefix, suffix);
printf("\nunit_instance=%s\n", unit_instance);
}
[email protected]
unit_instance = database
prefix = database
prefix=database, suffix=.service -> should we concatenate the two to a new string and use that string in next steps?
unit_instance=database
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@stepanblyschak strictly speaking, strdup
is not efficient in this use case. If we can use C++, do we have much better solution? I found a C++20 solution https://stackoverflow.com/a/69550517/2514803.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@theasianpianist as original owner of this file claims that there is no enforcement to stick with C language.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@stepanblyschak strictly speaking,
strdup
is not efficient in this use case. If we can use C++, do we have much better solution? I found a C++20 solution https://stackoverflow.com/a/69550517/2514803.
@qiluo-msft I didn't aim to improve efficiency. With the current approach taken to to remove @ from a string, the algorithm is - tokenize into prefix and suffix and concatenate both - that requires memory allocation. This is not the most efficient way to solve this, I agree, but this is a blocking issue for us, so instead of rewriting algorithm a fix for the originally intended algorithm was proposed to fix a bug.
…cpy/strcat (sonic-net#13647) #### Why I did it Fix an issue that services do not start automatically on first boot and start only after hostcfgd enables them. This is due to a bug in systemd-sonic-generator: ``` admin@arc-switch1004:~$ /usr/lib/systemd/system-generators/systemd-sonic-generator dir Failed to open file /usr/lib/systemd/system/database.servcee Error parsing targets for database.servcee Error parsing database.servcee Failed to open file /usr/lib/systemd/system/bgp.servcee Error parsing targets for bgp.servcee Error parsing bgp.servcee Failed to open file /usr/lib/systemd/system/lldp.servcee Error parsing targets for lldp.servcee Error parsing lldp.servcee Failed to open file /usr/lib/systemd/system/swss.servcee Error parsing targets for swss.servcee Error parsing swss.servcee Failed to open file /usr/lib/systemd/system/teamd.servcee Error parsing targets for teamd.servcee Error parsing teamd.servcee Failed to open file /usr/lib/systemd/system/syncd.servcee Error parsing targets for syncd.servcee Error parsing syncd.servcee ``` A wrong file name is generated (e.g database.**servcee**). #### How I did it Fixed overlapping strings being passed to strcpy/strcat that receive restirct* pointers (strings should not overlap). #### How to verify it Perform first boot and observe services start immidiatelly after boot.
Cherry-pick PR to 202211: #13891 |
…cpy/strcat (sonic-net#13647) #### Why I did it Fix an issue that services do not start automatically on first boot and start only after hostcfgd enables them. This is due to a bug in systemd-sonic-generator: ``` admin@arc-switch1004:~$ /usr/lib/systemd/system-generators/systemd-sonic-generator dir Failed to open file /usr/lib/systemd/system/database.servcee Error parsing targets for database.servcee Error parsing database.servcee Failed to open file /usr/lib/systemd/system/bgp.servcee Error parsing targets for bgp.servcee Error parsing bgp.servcee Failed to open file /usr/lib/systemd/system/lldp.servcee Error parsing targets for lldp.servcee Error parsing lldp.servcee Failed to open file /usr/lib/systemd/system/swss.servcee Error parsing targets for swss.servcee Error parsing swss.servcee Failed to open file /usr/lib/systemd/system/teamd.servcee Error parsing targets for teamd.servcee Error parsing teamd.servcee Failed to open file /usr/lib/systemd/system/syncd.servcee Error parsing targets for syncd.servcee Error parsing syncd.servcee ``` A wrong file name is generated (e.g database.**servcee**). #### How I did it Fixed overlapping strings being passed to strcpy/strcat that receive restirct* pointers (strings should not overlap). #### How to verify it Perform first boot and observe services start immidiatelly after boot.
Cherry-pick PR to 202205: #13892 |
…cpy/strcat (#13647) #### Why I did it Fix an issue that services do not start automatically on first boot and start only after hostcfgd enables them. This is due to a bug in systemd-sonic-generator: ``` admin@arc-switch1004:~$ /usr/lib/systemd/system-generators/systemd-sonic-generator dir Failed to open file /usr/lib/systemd/system/database.servcee Error parsing targets for database.servcee Error parsing database.servcee Failed to open file /usr/lib/systemd/system/bgp.servcee Error parsing targets for bgp.servcee Error parsing bgp.servcee Failed to open file /usr/lib/systemd/system/lldp.servcee Error parsing targets for lldp.servcee Error parsing lldp.servcee Failed to open file /usr/lib/systemd/system/swss.servcee Error parsing targets for swss.servcee Error parsing swss.servcee Failed to open file /usr/lib/systemd/system/teamd.servcee Error parsing targets for teamd.servcee Error parsing teamd.servcee Failed to open file /usr/lib/systemd/system/syncd.servcee Error parsing targets for syncd.servcee Error parsing syncd.servcee ``` A wrong file name is generated (e.g database.**servcee**). #### How I did it Fixed overlapping strings being passed to strcpy/strcat that receive restirct* pointers (strings should not overlap). #### How to verify it Perform first boot and observe services start immidiatelly after boot.
Related work items: sonic-net#276, sonic-net#305, sonic-net#332, sonic-net#338, sonic-net#339, sonic-net#1188, sonic-net#1192, sonic-net#1197, sonic-net#1206, sonic-net#1685, sonic-net#1690, sonic-net#1696, sonic-net#1699, sonic-net#1709, sonic-net#1727, sonic-net#1737, sonic-net#1741, sonic-net#1742, sonic-net#2511, sonic-net#2512, sonic-net#2532, sonic-net#2559, sonic-net#2626, sonic-net#2638, sonic-net#2645, sonic-net#2649, sonic-net#2660, sonic-net#2669, sonic-net#2670, sonic-net#2678, sonic-net#10084, sonic-net#11442, sonic-net#11873, sonic-net#12047, sonic-net#12110, sonic-net#12207, sonic-net#12529, sonic-net#12678, sonic-net#13235, sonic-net#13287, sonic-net#13372, sonic-net#13395, sonic-net#13456, sonic-net#13497, sonic-net#13522, sonic-net#13545, sonic-net#13547, sonic-net#13552, sonic-net#13569, sonic-net#13572, sonic-net#13578, sonic-net#13591, sonic-net#13611, sonic-net#13647, sonic-net#13649, sonic-net#13660, sonic-net#13710, sonic-net#13716, sonic-net#13724, sonic-net#13726, sonic-net#13732, sonic-net#13735, sonic-net#13739, sonic-net#13757, sonic-net#13786, sonic-net#13792, sonic-net#13800, sonic-net#13801, sonic-net#13802, sonic-net#13805, sonic-net#13806, sonic-net#13812, sonic-net#13814, sonic-net#13822, sonic-net#13831, sonic-net#13834, sonic-net#13847, sonic-net#13870, sonic-net#13882, sonic-net#13884, sonic-net#13885, sonic-net#13894, sonic-net#13895, sonic-net#13926, sonic-net#13932, sonic-net#13935, sonic-net#13942, sonic-net#13951, sonic-net#13953, sonic-net#13964
Signed-off-by: Stepan Blyschak [email protected]
Why I did it
Fix an issue that services do not start automatically on first boot and start only after hostcfgd enables them.
This is due to a bug in systemd-sonic-generator:
A wrong file name is generated (e.g database.servcee).
How I did it
Fixed overlapping strings being passed to strcpy/strcat that receive restirct* pointers (strings should not overlap).
How to verify it
Perform first boot and observe services start immidiatelly after boot.
Which release branch to backport (provide reason below if selected)
Description for the changelog
Ensure to add label/tag for the feature raised. example - PR#2174 under sonic-utilities repo. where, Generic Config and Update feature has been labelled as GCU.
Link to config_db schema for YANG module changes
A picture of a cute animal (not mandatory but encouraged)