Skip to content

Commit c45606e

Browse files
committed
strbuf: set the proper character when creating new nodes
Commit 82501b3 added an early break when a terminal node is found to incorrect place -- before setting c. This caused trie to be built that does not correspond to what it points to in buffer, causing incorrect deduplications: # cat /etc/udev/rules.d/99-bug.rules ENV{FOO}=="0" ENV{xx0}=="BAR" ENV{BAZ}=="00" # udevadm test * RULE /etc/udev/rules.d/99-bug.rules:1, token: 0, count: 2, label: '' M ENV match 'FOO' '0'(plain) * RULE /etc/udev/rules.d/99-bug.rules:2, token: 2, count: 2, label: '' M ENV match 'xx0' 'BAR'(plain) * RULE /etc/udev/rules.d/99-bug.rules:3, token: 4, count: 2, label: '' M ENV match 'BAZ' 'x0'(plain) * END The addition of "xx0" following "0" will cause a trie like this to be created: c=\0 c=0 "0" c=0 "xx0" <-- note the c is incorrect here, causing "00" to be c=O "FOO" deduplicated to it c=R "BAR" This in effect caused the usb_modeswitch rule for Huawei modems to never match and this never be switched to serial mode from mass storage.
1 parent fa39430 commit c45606e

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

src/basic/strbuf.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,13 @@ ssize_t strbuf_add_string(struct strbuf *str, const char *s, size_t len) {
156156
return off;
157157
}
158158

159+
c = s[len - 1 - depth];
160+
159161
/* bsearch is not allowed on a NULL sequence */
160162
if (node->children_count == 0)
161163
break;
162164

163165
/* lookup child node */
164-
c = s[len - 1 - depth];
165166
search.c = c;
166167
child = bsearch(&search, node->children, node->children_count,
167168
sizeof(struct strbuf_child_entry),

0 commit comments

Comments
 (0)