summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2025-01-19 09:34:51 -0500
committerDavid Robillard <d@drobilla.net>2025-01-19 19:34:42 -0500
commit9f8519251a0d9f8459b0fd384a79675c8815d2f2 (patch)
tree23bfec85ab135c098bf3fb2029fd8fd5ef7320ef
parente37f70b72357dc01d24118746d2a0656fc90fb17 (diff)
downloadsratom-9f8519251a0d9f8459b0fd384a79675c8815d2f2.tar.gz
sratom-9f8519251a0d9f8459b0fd384a79675c8815d2f2.tar.bz2
sratom-9f8519251a0d9f8459b0fd384a79675c8815d2f2.zip
Avoid use of scanf when reading MIDI events
-rw-r--r--NEWS3
-rw-r--r--src/.clang-tidy1
-rw-r--r--src/sratom.c12
3 files changed, 11 insertions, 5 deletions
diff --git a/NEWS b/NEWS
index 930aa93..9baa077 100644
--- a/NEWS
+++ b/NEWS
@@ -1,8 +1,9 @@
sratom (0.6.19) unstable; urgency=medium
+ * Avoid use of scanf when reading MIDI events
* Improve code quality
- -- David Robillard <d@drobilla.net> Sun, 19 Jan 2025 14:23:37 +0000
+ -- David Robillard <d@drobilla.net> Sun, 19 Jan 2025 14:34:33 +0000
sratom (0.6.18) stable; urgency=medium
diff --git a/src/.clang-tidy b/src/.clang-tidy
index 2967334..33707f3 100644
--- a/src/.clang-tidy
+++ b/src/.clang-tidy
@@ -6,7 +6,6 @@ Checks: >
-*-narrowing-conversions,
-bugprone-easily-swappable-parameters,
-cert-err33-c,
- -cert-err34-c,
-clang-analyzer-unix.Malloc,
-hicpp-signed-bitwise,
-misc-no-recursion,
diff --git a/src/sratom.c b/src/sratom.c
index 882910c..9289a13 100644
--- a/src/sratom.c
+++ b/src/sratom.c
@@ -624,6 +624,12 @@ atom_size(const Sratom* sratom, uint32_t type_urid)
return 0;
}
+static inline uint8_t
+hex_digit_value(const uint8_t c)
+{
+ return (uint8_t)((c > '9') ? ((c & ~0x20) - 'A' + 10) : (c - '0'));
+}
+
static void
read_literal(Sratom* sratom, LV2_Atom_Forge* forge, const SordNode* node)
{
@@ -658,9 +664,9 @@ read_literal(Sratom* sratom, LV2_Atom_Forge* forge, const SordNode* node)
} else if (!strcmp(type_uri, LV2_MIDI__MidiEvent)) {
lv2_atom_forge_atom(forge, len / 2, sratom->midi_MidiEvent);
for (const char* s = str; s < str + len; s += 2) {
- unsigned num = 0U;
- sscanf(s, "%2X", &num);
- const uint8_t c = num;
+ const uint8_t hi = hex_digit_value(s[0]);
+ const uint8_t lo = hex_digit_value(s[1]);
+ const uint8_t c = (uint8_t)(((unsigned)hi << 4U) | lo);
lv2_atom_forge_raw(forge, &c, 1);
}
lv2_atom_forge_pad(forge, len / 2);