git.strcat.st

/strcat/minitox.git/ - summarytreelogarchive

subject
validate tox id format before calling tox_friend_add
commit
e75e2cb5fa18e3d61f8662a138b536c46f9ccf7d
date
2026-04-17T20:48:36Z
message
diff
 minitox.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/minitox.c b/minitox.c
index 6fc05ca..569c9d8 100644
--- a/minitox.c
+++ b/minitox.c
@@ -202,6 +202,19 @@ bool str2uint(char *str, uint32_t *num) {
     return true;
 }
 
+bool hex2bin_fixed(const char *hex, uint8_t *bin, size_t bin_size) {
+    if (!hex || !bin) return false;
+    if (strlen(hex) != bin_size * 2) return false;
+
+    for (size_t i = 0; i < bin_size; ++i) {
+        unsigned int v;
+        if (sscanf(hex + (i * 2), "%2x", &v) != 1) return false;
+        bin[i] = (uint8_t)v;
+    }
+
+    return true;
+}
+
 char* genmsg(struct ChatHist **pp, const char *fmt, ...) {
     va_list va;
     va_start(va, fmt);
@@ -913,10 +926,14 @@ void command_add(int narg, char **args) {
     char *msg = "";
     if (narg > 1) msg = args[1];
 
-    uint8_t *bin_id = hex2bin(hex_id);
+    uint8_t bin_id[TOX_ADDRESS_SIZE];
+    if (!hex2bin_fixed(hex_id, bin_id, sizeof(bin_id))) {
+        ERROR("! invalid tox id, expected %zu hex chars", sizeof(bin_id) * 2);
+        return;
+    }
+
     TOX_ERR_FRIEND_ADD err;
     uint32_t friend_num = tox_friend_add(tox, bin_id, (uint8_t*)msg, strlen(msg), &err);
-    free(bin_id);
 
     if (err != TOX_ERR_FRIEND_ADD_OK) {
         ERROR("! add friend failed, errcode:%d",err);