* strncpy() refactor/fix

This commit is contained in:
Scott Powell
2025-02-22 19:41:24 +11:00
parent 4d8478de98
commit 37f4ceff85
6 changed files with 28 additions and 26 deletions

View File

@@ -497,11 +497,11 @@ public:
_prefs.airtime_factor = 1.0; // one half
_prefs.rx_delay_base = 0.0f; // turn off by default, was 10.0;
_prefs.tx_delay_factor = 0.5f; // was 0.25f
strncpy(_prefs.node_name, ADVERT_NAME, sizeof(_prefs.node_name)-1);
StrHelper::strncpy(_prefs.node_name, ADVERT_NAME, sizeof(_prefs.node_name));
_prefs.node_name[sizeof(_prefs.node_name)-1] = 0; // truncate if necessary
_prefs.node_lat = ADVERT_LAT;
_prefs.node_lon = ADVERT_LON;
strncpy(_prefs.password, ADMIN_PASSWORD, sizeof(_prefs.password)-1);
StrHelper::strncpy(_prefs.password, ADMIN_PASSWORD, sizeof(_prefs.password));
_prefs.password[sizeof(_prefs.password)-1] = 0; // truncate if necessary
_prefs.freq = LORA_FREQ;
_prefs.tx_power_dbm = LORA_TX_POWER;
@@ -598,8 +598,7 @@ public:
}
} else if (memcmp(command, "password ", 9) == 0) {
// change admin password
strncpy(_prefs.password, &command[9], sizeof(_prefs.password)-1);
_prefs.password[sizeof(_prefs.password)-1] = 0; // truncate if necesary
StrHelper::strncpy(_prefs.password, &command[9], sizeof(_prefs.password));
checkAdvertInterval();
savePrefs();
sprintf(reply, "password now: %s", _prefs.password); // echo back just to let admin know for sure!!
@@ -622,13 +621,11 @@ public:
strcpy(reply, "OK");
}
} else if (memcmp(config, "guest.password ", 15) == 0) {
strncpy(_prefs.guest_password, &config[15], sizeof(_prefs.guest_password)-1);
_prefs.guest_password[sizeof(_prefs.guest_password)-1] = 0; // truncate if necessary
StrHelper::strncpy(_prefs.guest_password, &config[15], sizeof(_prefs.guest_password));
savePrefs();
strcpy(reply, "OK");
} else if (memcmp(config, "name ", 5) == 0) {
strncpy(_prefs.node_name, &config[5], sizeof(_prefs.node_name)-1);
_prefs.node_name[sizeof(_prefs.node_name)-1] = 0; // truncate if nec
StrHelper::strncpy(_prefs.node_name, &config[5], sizeof(_prefs.node_name));
checkAdvertInterval();
savePrefs();
strcpy(reply, "OK");

View File

@@ -197,8 +197,7 @@ class MyMesh : public mesh::Mesh {
void addPost(ClientInfo* client, const char* postData) {
// TODO: suggested postData format: <title>/<descrption>
posts[next_post_idx].author = client->id; // add to cyclic queue
strncpy(posts[next_post_idx].text, postData, MAX_POST_TEXT_LEN);
posts[next_post_idx].text[MAX_POST_TEXT_LEN] = 0;
StrHelper::strncpy(posts[next_post_idx].text, postData, MAX_POST_TEXT_LEN);
posts[next_post_idx].post_timestamp = getRTCClock()->getCurrentTimeUnique();
next_post_idx = (next_post_idx + 1) % MAX_UNSYNCED_POSTS;
@@ -540,19 +539,16 @@ public:
_prefs.airtime_factor = 1.0; // one half
_prefs.rx_delay_base = 0.0f; // off by default, was 10.0
_prefs.tx_delay_factor = 0.5f; // was 0.25f;
strncpy(_prefs.node_name, ADVERT_NAME, sizeof(_prefs.node_name)-1);
_prefs.node_name[sizeof(_prefs.node_name)-1] = 0; // truncate if necessary
StrHelper::strncpy(_prefs.node_name, ADVERT_NAME, sizeof(_prefs.node_name));
_prefs.node_lat = ADVERT_LAT;
_prefs.node_lon = ADVERT_LON;
strncpy(_prefs.password, ADMIN_PASSWORD, sizeof(_prefs.password)-1);
_prefs.password[sizeof(_prefs.password)-1] = 0; // truncate if necessary
StrHelper::strncpy(_prefs.password, ADMIN_PASSWORD, sizeof(_prefs.password));
_prefs.freq = LORA_FREQ;
_prefs.tx_power_dbm = LORA_TX_POWER;
_prefs.disable_fwd = 1;
_prefs.advert_interval = 2; // default to 2 minutes for NEW installs
#ifdef ROOM_PASSWORD
strncpy(_prefs.guest_password, ROOM_PASSWORD, sizeof(_prefs.guest_password)-1);
_prefs.guest_password[sizeof(_prefs.guest_password)-1] = 0; // truncate if necessary
StrHelper::strncpy(_prefs.guest_password, ROOM_PASSWORD, sizeof(_prefs.guest_password));
#endif
num_clients = 0;
@@ -639,8 +635,7 @@ public:
}
} else if (memcmp(command, "password ", 9) == 0) {
// change admin password
strncpy(_prefs.password, &command[9], sizeof(_prefs.password)-1);
_prefs.password[sizeof(_prefs.password)-1] = 0; // truncate if necesary
StrHelper::strncpy(_prefs.password, &command[9], sizeof(_prefs.password));
savePrefs();
sprintf(reply, "password now: %s", _prefs.password); // echo back just to let admin know for sure!!
} else if (memcmp(command, "set ", 4) == 0) {
@@ -662,13 +657,11 @@ public:
strcpy(reply, "OK");
}
} else if (memcmp(config, "guest.password ", 15) == 0) {
strncpy(_prefs.guest_password, &config[15], sizeof(_prefs.guest_password)-1);
_prefs.guest_password[sizeof(_prefs.guest_password)-1] = 0; // truncate if necessary
StrHelper::strncpy(_prefs.guest_password, &config[15], sizeof(_prefs.guest_password));
savePrefs();
strcpy(reply, "OK");
} else if (memcmp(config, "name ", 5) == 0) {
strncpy(_prefs.node_name, &config[5], sizeof(_prefs.node_name)-1);
_prefs.node_name[sizeof(_prefs.node_name)-1] = 0; // truncate if nec
StrHelper::strncpy(_prefs.node_name, &config[5], sizeof(_prefs.node_name));
savePrefs();
strcpy(reply, "OK");
} else if (memcmp(config, "repeat ", 7) == 0) {

View File

@@ -466,8 +466,7 @@ public:
savePrefs();
Serial.println(" OK");
} else if (memcmp(config, "name ", 5) == 0) {
strncpy(_prefs.node_name, &config[5], sizeof(_prefs.node_name)-1);
_prefs.node_name[sizeof(_prefs.node_name)-1] = 0; // truncate if nec
StrHelper::strncpy(_prefs.node_name, &config[5], sizeof(_prefs.node_name));
savePrefs();
Serial.println(" OK");
} else if (memcmp(config, "lat ", 4) == 0) {

View File

@@ -55,8 +55,7 @@ void BaseChatMesh::onAdvertRecv(mesh::Packet* packet, const mesh::Identity& id,
putBlobByKey(id.pub_key, PUB_KEY_SIZE, temp_buf, plen);
// update
strncpy(from->name, parser.getName(), sizeof(from->name)-1);
from->name[sizeof(from->name)-1] = 0;
StrHelper::strncpy(from->name, parser.getName(), sizeof(from->name));
from->type = parser.getType();
if (parser.hasLatLon()) {
from->gps_lat = parser.getIntLat();

View File

@@ -0,0 +1,9 @@
#include "TxtDataHelpers.h"
void StrHelper::strncpy(char* dest, const char* src, size_t buf_sz) {
while (buf_sz > 1 && *src) {
*dest++ = *src++;
buf_sz--;
}
*dest = 0; // truncates if needed
}

View File

@@ -6,3 +6,8 @@
#define TXT_TYPE_PLAIN 0 // a plain text message
#define TXT_TYPE_CLI_DATA 1 // a CLI command
#define TXT_TYPE_SIGNED_PLAIN 2 // plain text, signed by sender
class StrHelper {
public:
static void strncpy(char* dest, const char* src, size_t buf_sz);
};