Skip to content

Commit 0c1cfd1

Browse files
committed
Use strncmp instead of strcmp
1 parent 3a95505 commit 0c1cfd1

2 files changed

Lines changed: 44 additions & 36 deletions

File tree

c_src/sqlite3_nif.c

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1453,108 +1453,109 @@ action_code_from_atom(ErlNifEnv* env, ERL_NIF_TERM atom)
14531453
// can safely ignore it here and avoid the pesky signed integer UB
14541454

14551455
char buf[32];
1456-
if (!enif_get_atom(env, atom, buf, sizeof(buf), ERL_NIF_LATIN1)) {
1456+
const size_t buffsize = sizeof(buf);
1457+
if (!enif_get_atom(env, atom, buf, buffsize, ERL_NIF_LATIN1)) {
14571458
return 0;
14581459
}
1459-
buf[31] = 0;
1460+
buf[buffsize - 1] = 0;
14601461

1461-
if (strcmp(buf, "create_index") == 0) {
1462+
if (strncmp(buf, "create_index", buffsize) == 0) {
14621463
return SQLITE_CREATE_INDEX;
14631464
}
1464-
if (strcmp(buf, "create_table") == 0) {
1465+
if (strncmp(buf, "create_table", buffsize) == 0) {
14651466
return SQLITE_CREATE_TABLE;
14661467
}
1467-
if (strcmp(buf, "create_temp_index") == 0) {
1468+
if (strncmp(buf, "create_temp_index", buffsize) == 0) {
14681469
return SQLITE_CREATE_TEMP_INDEX;
14691470
}
1470-
if (strcmp(buf, "create_temp_table") == 0) {
1471+
if (strncmp(buf, "create_temp_table", buffsize) == 0) {
14711472
return SQLITE_CREATE_TEMP_TABLE;
14721473
}
1473-
if (strcmp(buf, "create_temp_trigger") == 0) {
1474+
if (strncmp(buf, "create_temp_trigger", buffsize) == 0) {
14741475
return SQLITE_CREATE_TEMP_TRIGGER;
14751476
}
1476-
if (strcmp(buf, "create_temp_view") == 0) {
1477+
if (strncmp(buf, "create_temp_view", buffsize) == 0) {
14771478
return SQLITE_CREATE_TEMP_VIEW;
14781479
}
1479-
if (strcmp(buf, "create_trigger") == 0) {
1480+
if (strncmp(buf, "create_trigger", buffsize) == 0) {
14801481
return SQLITE_CREATE_TRIGGER;
14811482
}
1482-
if (strcmp(buf, "create_view") == 0) {
1483+
if (strncmp(buf, "create_view", buffsize) == 0) {
14831484
return SQLITE_CREATE_VIEW;
14841485
}
1485-
if (strcmp(buf, "delete") == 0) {
1486+
if (strncmp(buf, "delete", buffsize) == 0) {
14861487
return SQLITE_DELETE;
14871488
}
1488-
if (strcmp(buf, "drop_index") == 0) {
1489+
if (strncmp(buf, "drop_index", buffsize) == 0) {
14891490
return SQLITE_DROP_INDEX;
14901491
}
1491-
if (strcmp(buf, "drop_table") == 0) {
1492+
if (strncmp(buf, "drop_table", buffsize) == 0) {
14921493
return SQLITE_DROP_TABLE;
14931494
}
1494-
if (strcmp(buf, "drop_temp_index") == 0) {
1495+
if (strncmp(buf, "drop_temp_index", buffsize) == 0) {
14951496
return SQLITE_DROP_TEMP_INDEX;
14961497
}
1497-
if (strcmp(buf, "drop_temp_table") == 0) {
1498+
if (strncmp(buf, "drop_temp_table", buffsize) == 0) {
14981499
return SQLITE_DROP_TEMP_TABLE;
14991500
}
1500-
if (strcmp(buf, "drop_temp_trigger") == 0) {
1501+
if (strncmp(buf, "drop_temp_trigger", buffsize) == 0) {
15011502
return SQLITE_DROP_TEMP_TRIGGER;
15021503
}
1503-
if (strcmp(buf, "drop_temp_view") == 0) {
1504+
if (strncmp(buf, "drop_temp_view", buffsize) == 0) {
15041505
return SQLITE_DROP_TEMP_VIEW;
15051506
}
1506-
if (strcmp(buf, "drop_trigger") == 0) {
1507+
if (strncmp(buf, "drop_trigger", buffsize) == 0) {
15071508
return SQLITE_DROP_TRIGGER;
15081509
}
1509-
if (strcmp(buf, "drop_view") == 0) {
1510+
if (strncmp(buf, "drop_view", buffsize) == 0) {
15101511
return SQLITE_DROP_VIEW;
15111512
}
1512-
if (strcmp(buf, "insert") == 0) {
1513+
if (strncmp(buf, "insert", buffsize) == 0) {
15131514
return SQLITE_INSERT;
15141515
}
1515-
if (strcmp(buf, "pragma") == 0) {
1516+
if (strncmp(buf, "pragma", buffsize) == 0) {
15161517
return SQLITE_PRAGMA;
15171518
}
1518-
if (strcmp(buf, "read") == 0) {
1519+
if (strncmp(buf, "read", buffsize) == 0) {
15191520
return SQLITE_READ;
15201521
}
1521-
if (strcmp(buf, "select") == 0) {
1522+
if (strncmp(buf, "select", buffsize) == 0) {
15221523
return SQLITE_SELECT;
15231524
}
1524-
if (strcmp(buf, "transaction") == 0) {
1525+
if (strncmp(buf, "transaction", buffsize) == 0) {
15251526
return SQLITE_TRANSACTION;
15261527
}
1527-
if (strcmp(buf, "update") == 0) {
1528+
if (strncmp(buf, "update", buffsize) == 0) {
15281529
return SQLITE_UPDATE;
15291530
}
1530-
if (strcmp(buf, "attach") == 0) {
1531+
if (strncmp(buf, "attach", buffsize) == 0) {
15311532
return SQLITE_ATTACH;
15321533
}
1533-
if (strcmp(buf, "detach") == 0) {
1534+
if (strncmp(buf, "detach", buffsize) == 0) {
15341535
return SQLITE_DETACH;
15351536
}
1536-
if (strcmp(buf, "alter_table") == 0) {
1537+
if (strncmp(buf, "alter_table", buffsize) == 0) {
15371538
return SQLITE_ALTER_TABLE;
15381539
}
1539-
if (strcmp(buf, "reindex") == 0) {
1540+
if (strncmp(buf, "reindex", buffsize) == 0) {
15401541
return SQLITE_REINDEX;
15411542
}
1542-
if (strcmp(buf, "analyze") == 0) {
1543+
if (strncmp(buf, "analyze", buffsize) == 0) {
15431544
return SQLITE_ANALYZE;
15441545
}
1545-
if (strcmp(buf, "create_vtable") == 0) {
1546+
if (strncmp(buf, "create_vtable", buffsize) == 0) {
15461547
return SQLITE_CREATE_VTABLE;
15471548
}
1548-
if (strcmp(buf, "drop_vtable") == 0) {
1549+
if (strncmp(buf, "drop_vtable", buffsize) == 0) {
15491550
return SQLITE_DROP_VTABLE;
15501551
}
1551-
if (strcmp(buf, "function") == 0) {
1552+
if (strncmp(buf, "function", buffsize) == 0) {
15521553
return SQLITE_FUNCTION;
15531554
}
1554-
if (strcmp(buf, "savepoint") == 0) {
1555+
if (strncmp(buf, "savepoint", buffsize) == 0) {
15551556
return SQLITE_SAVEPOINT;
15561557
}
1557-
if (strcmp(buf, "recursive") == 0) {
1558+
if (strncmp(buf, "recursive", buffsize) == 0) {
15581559
return SQLITE_RECURSIVE;
15591560
}
15601561

@@ -1603,7 +1604,8 @@ exqlite_set_authorizer(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
16031604
// Validate all atoms before mutating state — a bad atom in the list
16041605
// should not clear an existing authorizer as a side effect.
16051606
int new_deny[AUTHORIZER_DENY_SIZE] = {0};
1606-
ERL_NIF_TERM head, tail = argv[1];
1607+
ERL_NIF_TERM head;
1608+
ERL_NIF_TERM tail = argv[1];
16071609
while (enif_get_list_cell(env, tail, &head, &tail)) {
16081610
unsigned int code = action_code_from_atom(env, head);
16091611
if (code == 0) {

test/exqlite/sqlite3_test.exs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -854,6 +854,12 @@ defmodule Exqlite.Sqlite3Test do
854854
)
855855
end
856856

857+
test "ensure long atoms are handled", context do
858+
assert_raise ArgumentError, fn ->
859+
Sqlite3.set_authorizer(context.conn, [:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbb])
860+
end
861+
end
862+
857863
test "denies all action codes at once without segfault", context do
858864
all_actions = [
859865
:create_index,

0 commit comments

Comments
 (0)