diff --git a/.codespellignore b/.codespellignore new file mode 100644 index 00000000..5530bfc9 --- /dev/null +++ b/.codespellignore @@ -0,0 +1,4 @@ +ede +edn +nd +tre \ No newline at end of file diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml new file mode 100644 index 00000000..8ee2a92d --- /dev/null +++ b/.github/workflows/codespell.yml @@ -0,0 +1,19 @@ +name: Codespell +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + +jobs: + spell-check: + if: github.event.pull_request.draft == false + runs-on: ubuntu-latest + steps: + - + name: Checkout repository + uses: actions/checkout@v3 + - + name: Spell-Checking + uses: codespell-project/actions-codespell@master + with: + ignore_words_file: .codespellignore + skip: ./src/database/sqlite3.c,./src/database/sqlite3.h,./src/database/shell.c,./src/lua,./src/dnsmasq,./src/tre-regex diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d94b0278..93317a31 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -147,7 +147,8 @@ set(sources shmem.h signals.c signals.h - static_assert.h + struct_size.c + struct_size.h timers.c timers.h vector.c diff --git a/src/FTL.h b/src/FTL.h index 71064383..002627fb 100644 --- a/src/FTL.h +++ b/src/FTL.h @@ -111,7 +111,7 @@ #define NUM_RECHECKS 3 // Use out own syscalls handling functions that will detect possible errors -// and report accordingly in the log. This will make debugging FTL crashs +// and report accordingly in the log. This will make debugging FTL crash // caused by insufficient memory or by code bugs (not properly dealing // with NULL pointers) much easier. #undef strdup // strdup() is a macro in itself, it needs special handling diff --git a/src/api/api.c b/src/api/api.c index 56739ae9..3b1ae78b 100644 --- a/src/api/api.c +++ b/src/api/api.c @@ -46,7 +46,7 @@ extern char *querystr(char *desc, unsigned short type); #define min(a,b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a < _b ? _a : _b; }) -/* qsort comparision function (count field), sort ASC */ +/* qsort comparison function (count field), sort ASC */ static int __attribute__((pure)) cmpasc(const void *a, const void *b) { const int *elem1 = (int*)a; @@ -551,7 +551,7 @@ void getUpstreamDestinations(const char *client_message, const int *sock) name = ip; if(totalqueries > 0) - // Whats the percentage of blocked queries on the total amount of queries? + // What's the percentage of blocked queries on the total amount of queries? percentage = 1e2f * blocked / totalqueries; } else if(i == -2) @@ -561,7 +561,7 @@ void getUpstreamDestinations(const char *client_message, const int *sock) name = ip; if(totalqueries > 0) - // Whats the percentage of cached queries on the total amount of queries? + // What's the percentage of cached queries on the total amount of queries? percentage = 1e2f * cached / totalqueries; } else if(i == -1) @@ -571,7 +571,7 @@ void getUpstreamDestinations(const char *client_message, const int *sock) name = ip; if(totalqueries > 0) - // Whats the percentage of cached queries on the total amount of queries? + // What's the percentage of cached queries on the total amount of queries? percentage = 1e2f * others / totalqueries; } else @@ -1165,7 +1165,7 @@ void getRecentBlocked(const char *client_message, const int *sock) else if(!pack_str32(*sock, domain)) return; - // Only count when sent succesfully + // Only count when sent successfully found++; } @@ -1238,12 +1238,12 @@ void getDBstats(const int *sock) unsigned long long int filesize = get_FTL_db_filesize(); char prefix[2] = { 0 }; - double formated = 0.0; - format_memory_size(prefix, filesize, &formated); + double formatted = 0.0; + format_memory_size(prefix, filesize, &formatted); if(istelnet[*sock]) ssend(*sock, "queries in database: %i\ndatabase filesize: %.2f %sB\nSQLite version: %s\n", - get_number_of_queries_in_DB(NULL), formated, prefix, get_sqlite3_version()); + get_number_of_queries_in_DB(NULL), formatted, prefix, get_sqlite3_version()); else { pack_int32(*sock, get_number_of_queries_in_DB(NULL)); pack_int64(*sock, filesize); diff --git a/src/args.c b/src/args.c index 64499f5b..823a9dab 100644 --- a/src/args.c +++ b/src/args.c @@ -354,6 +354,12 @@ void parse_args(int argc, char* argv[]) exit(EXIT_SUCCESS); } + // Return number of errors on this undocumented flag + if(strcmp(argv[i], "--check-structs") == 0) + { + exit(check_struct_sizes()); + } + // Complain if invalid options have been found if(!ok) { diff --git a/src/args.h b/src/args.h index d2cfd214..fe031f9e 100644 --- a/src/args.h +++ b/src/args.h @@ -24,4 +24,7 @@ const char *cli_done(void) __attribute__ ((const)); const char *cli_bold(void) __attribute__ ((const)); const char *cli_normal(void) __attribute__ ((const)); +// defined in dnsmasq_interface.c +int check_struct_sizes(void); + #endif //ARGS_H diff --git a/src/config.h b/src/config.h index 332d2a4a..356f00e6 100644 --- a/src/config.h +++ b/src/config.h @@ -17,10 +17,12 @@ #include // typedef uni32_t #include -// assert_sizeof -#include "static_assert.h" // struct in_addr, in6_addr #include +// type bool +#include +// type FILE +#include void init_config_mutex(void); void getLogFilePath(void); @@ -91,7 +93,6 @@ typedef struct { } ip_blocking; } reply_addr; } ConfigStruct; -ASSERT_SIZEOF(ConfigStruct, 112, 104, 104); typedef struct { const char* conf; diff --git a/src/daemon.c b/src/daemon.c index 1c2c77ee..4fc137b2 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -214,7 +214,7 @@ static void terminate_threads(void) if (clock_gettime(CLOCK_REALTIME, &ts) == -1) { - logg("Thread %s (%d) is busy, cancelling it (cannot set timout).", + logg("Thread %s (%d) is busy, cancelling it (cannot set timeout).", thread_names[i], i); pthread_cancel(threads[i]); continue; diff --git a/src/database/gravity-db.c b/src/database/gravity-db.c index 5a22b23f..ee328e65 100644 --- a/src/database/gravity-db.c +++ b/src/database/gravity-db.c @@ -659,7 +659,7 @@ static bool get_client_groupids(clientsData* client) } // We use the default group and return early here - // if aboves lookups didn't return any results + // if above lookups didn't return any results // (the client is not configured through the client table) if(chosen_match_id < 0) { @@ -1160,7 +1160,7 @@ static enum db_result domain_in_list(const char *domain, sqlite3_stmt *stmt, con // Bind domain to prepared statement // SQLITE_STATIC: Use the string without first duplicating it internally. // We can do this as domain has dynamic scope that exceeds that of the binding. - // We need to bind the domain onl once even to the prepared audit statement as: + // We need to bind the domain only once even to the prepared audit statement as: // When the same named SQL parameter is used more than once, second and // subsequent occurrences have the same index as the first occurrence. // (https://www.sqlite.org/c3ref/bind_blob.html) diff --git a/src/database/network-table.c b/src/database/network-table.c index 7363a33e..85c0b8d3 100644 --- a/src/database/network-table.c +++ b/src/database/network-table.c @@ -1256,7 +1256,7 @@ void parse_neighbor_cache(sqlite3* db) else text = "ERROR"; - // dbquery() above already logs the reson for why the query failed + // dbquery() above already logs the reason for why the query failed logg("%s: Storing devices in network table (\"%s\") failed", text, sql); pclose(arpfp); return; @@ -1448,7 +1448,7 @@ void parse_neighbor_cache(sqlite3* db) unmock_netDB_device(db, hwaddr, macVendor, dbID); // Host name, count and last query timestamp will be set in the next - // loop interation for the sake of simplicity + // loop iteration for the sake of simplicity } // Free allocated memory @@ -1545,7 +1545,7 @@ void parse_neighbor_cache(sqlite3* db) // Finally, loop over the available interfaces to ensure we list the // IP addresses correctly (local addresses are NOT contained in the - // ARP/neighor cache). + // ARP/neighbor cache). if(!add_local_interfaces_to_network_table(db, now, &additional_entries)) return; diff --git a/src/database/query-table.c b/src/database/query-table.c index 58999d65..6c7986ab 100644 --- a/src/database/query-table.c +++ b/src/database/query-table.c @@ -486,7 +486,7 @@ int DB_save_queries(sqlite3 *db) return DB_FAILED; } - // Store index for next loop interation round and update last time stamp + // Store index for next loop iteration round and update last time stamp // in the database only if all queries have been saved successfully if(saved > 0 && !error) { @@ -935,7 +935,7 @@ void DB_read_queries(void) } else if(status == QUERY_REGEX) { - // QUERY_REGEX: Set ID regex which was the reson for blocking + // QUERY_REGEX: Set ID regex which was the reason for blocking const int cacheID = findCacheID(query->domainID, query->clientID, query->type); DNSCacheData *cache = getDNSCache(cacheID, true); // Only load if diff --git a/src/datastructure.c b/src/datastructure.c index 763fea7f..d7bc1cfd 100644 --- a/src/datastructure.c +++ b/src/datastructure.c @@ -302,7 +302,7 @@ void change_clientcount(clientsData *client, int total, int blocked, int overTim if(overTimeIdx > -1 && overTimeIdx < OVERTIME_SLOTS) client->overTime[overTimeIdx] += overTimeMod; - // Also add counts to the conencted alias-client (if any) + // Also add counts to the connected alias-client (if any) if(client->flags.aliasclient) { logg("WARN: Should not add to alias-client directly (client \"%s\" (%s))!", diff --git a/src/datastructure.h b/src/datastructure.h index 5e43c4ab..ee997001 100644 --- a/src/datastructure.h +++ b/src/datastructure.h @@ -15,8 +15,9 @@ // enum privacy_level #include "enums.h" -// assert_sizeof -#include "static_assert.h" + +// Definitions like OVERTIME_SLOT +#include "FTL.h" extern const char *querytypes[TYPE_MAX]; @@ -51,9 +52,6 @@ typedef struct { } flags; } queriesData; -// ARM needs extra padding at the end -ASSERT_SIZEOF(queriesData, 56, 44, 44); - typedef struct { unsigned char magic; bool new; @@ -64,7 +62,6 @@ typedef struct { size_t namepos; time_t lastQuery; } upstreamsData; -ASSERT_SIZEOF(upstreamsData, 640, 624, 624); typedef struct { unsigned char magic; @@ -91,7 +88,6 @@ typedef struct { time_t lastQuery; time_t firstSeen; } clientsData; -ASSERT_SIZEOF(clientsData, 696, 668, 668); typedef struct { unsigned char magic; @@ -100,7 +96,6 @@ typedef struct { uint32_t domainhash; size_t domainpos; } domainsData; -ASSERT_SIZEOF(domainsData, 24, 20, 20); typedef struct { unsigned char magic; @@ -111,7 +106,6 @@ typedef struct { int clientID; int black_regex_idx; } DNSCacheData; -ASSERT_SIZEOF(DNSCacheData, 16, 16, 16); void strtolower(char *str); uint32_t hashStr(const char *s) __attribute__((const)); diff --git a/src/dhcp-discover.c b/src/dhcp-discover.c index b05fbf39..54713552 100644 --- a/src/dhcp-discover.c +++ b/src/dhcp-discover.c @@ -438,7 +438,7 @@ static void print_dhcp_offer(struct in_addr source, dhcp_packet_data *offer_pack unsigned int n = 0; for(unsigned int i = 1; n < optlen; i++) { - // Extract destionation descriptor + // Extract destination descriptor unsigned char cidr = offer_packet->options[x+n++]; unsigned char addr[4] = { 0 }; if(cidr > 0) diff --git a/src/dnsmasq_interface.c b/src/dnsmasq_interface.c index 0fca3c68..14473472 100644 --- a/src/dnsmasq_interface.c +++ b/src/dnsmasq_interface.c @@ -48,6 +48,10 @@ #include "api/api_helper.h" // logg_rate_limit_message() #include "database/message-table.h" +// type struct sqlite3_stmt_vec +#include "vector.h" +// check_one_struct() +#include "struct_size.h" // Private prototypes static void print_flags(const unsigned int flags); @@ -841,7 +845,7 @@ void _FTL_iface(struct irec *recviface, const union all_addr *addr, const sa_fam next_iface.name[0] = '-'; next_iface.name[1] = '\0'; - // Check if we need to identify the receving interface by its address + // Check if we need to identify the receiving interface by its address if(!recviface && addr && ((addrfamily == AF_INET && addr->addr4.s_addr != INADDR_ANY) || (addrfamily == AF_INET6 && !IN6_IS_ADDR_UNSPECIFIED(&addr->addr6)))) @@ -1723,7 +1727,7 @@ static void FTL_forwarded(const unsigned int flags, const char *name, const unio // up in a situation where dnsmasq can answer the first level of // the DNS result (the CNAME) from cache, hence the status of this // query is marked as "answered from cache" in FTLDNS. However, for - // server.a.com wit the much shorter TTL, we still have to forward + // server.a.com with the much shorter TTL, we still have to forward // something and ask the upstream server for the final IP address. // Correct reply timer if a response time has already been calculated @@ -1948,7 +1952,7 @@ static void FTL_reply(const unsigned int flags, const char *name, const union al } else if(rcode == SERVFAIL) { - // This happens on upstream destionation errors + // This happens on upstream destination errors answer = "SERVFAIL"; } } @@ -2071,7 +2075,7 @@ static void FTL_reply(const unsigned int flags, const char *name, const union al // Answered from local configuration, might be a wildcard or user-provided // Answered from a custom (user provided) cache file or because - // we're the authorative DNS server (e.g. DHCP server and this + // we're the authoritative DNS server (e.g. DHCP server and this // is our own domain) query_set_status(query, QUERY_CACHE); @@ -2771,7 +2775,7 @@ void FTL_fork_and_bind_sockets(struct passwd *ent_pw) // Add our PTR record to the end of the linked list if(daemon->ptr != NULL) { - // Interate to the last PTR entry in dnsmasq's structure + // Iterate to the last PTR entry in dnsmasq's structure struct ptr_record *ptr; for(ptr = daemon->ptr; ptr && ptr->next; ptr = ptr->next); @@ -3335,3 +3339,28 @@ static void _query_set_dnssec(queriesData *query, const enum dnssec_status dnsse // Set DNSSEC status query->dnssec = dnssec; } + +// Check sizes of all important in-memory objects. This routine returns the number of +// errors found (i.e., a return value of 0 is what we want and expect) +int check_struct_sizes(void) +{ + int result = 0; + result += check_one_struct("ConfigStruct", sizeof(ConfigStruct), 112, 104); + result += check_one_struct("queriesData", sizeof(queriesData), 56, 44); + result += check_one_struct("upstreamsData", sizeof(upstreamsData), 640, 624); + result += check_one_struct("clientsData", sizeof(clientsData), 696, 668); + result += check_one_struct("domainsData", sizeof(domainsData), 24, 20); + result += check_one_struct("DNSCacheData", sizeof(DNSCacheData), 16, 16); + result += check_one_struct("ednsData", sizeof(ednsData), 72, 72); + result += check_one_struct("overTimeData", sizeof(overTimeData), 32, 24); + result += check_one_struct("regexData", sizeof(regexData), 56, 44); + result += check_one_struct("SharedMemory", sizeof(SharedMemory), 24, 12); + result += check_one_struct("ShmSettings", sizeof(ShmSettings), 12, 12); + result += check_one_struct("countersStruct", sizeof(countersStruct), 244, 244); + result += check_one_struct("sqlite3_stmt_vec", sizeof(sqlite3_stmt_vec), 32, 16); + + if(result == 0) + printf("All okay\n"); + + return result; +} diff --git a/src/edns0.h b/src/edns0.h index e5eafd29..1ab2c9b4 100644 --- a/src/edns0.h +++ b/src/edns0.h @@ -10,9 +10,6 @@ #ifndef EDNS0_HEADER #define EDNS0_HEADER -// assert_sizeof -#include "static_assert.h" - typedef struct { bool client_set; bool mac_set; @@ -20,7 +17,6 @@ typedef struct { char mac_byte[6]; char mac_text[18]; } ednsData; -ASSERT_SIZEOF(ednsData, 72, 72, 72); void FTL_parse_pseudoheaders(struct dns_header *header, size_t n, union mysockaddr *peer, ednsData *edns); diff --git a/src/events.c b/src/events.c index 2051f810..b4e10b4d 100644 --- a/src/events.c +++ b/src/events.c @@ -26,7 +26,7 @@ static const char *eventtext(const enum events event); static volatile atomic_flag eventqueue[EVENTS_MAX] = { ATOMIC_FLAG_INIT }; // Set/Request event -// We set the events atomically to ensure no race collisons can happen. If an +// We set the events atomically to ensure no race collisions can happen. If an // event has already been requested, this has no consequences as event cannot be // added multiple times void _set_event(const enum events event, int line, const char *function, const char *file) diff --git a/src/files.c b/src/files.c index f8ae950f..b06604e9 100644 --- a/src/files.c +++ b/src/files.c @@ -138,11 +138,11 @@ void ls_dir(const char* path) st.st_mode & S_IXOTH ? "x":"-"); char prefix[2] = { 0 }; - double formated = 0.0; - format_memory_size(prefix, (unsigned long long)st.st_size, &formated); + double formatted = 0.0; + format_memory_size(prefix, (unsigned long long)st.st_size, &formatted); // Log output for this file - logg("%s %-15s %3.0f%s %s", permissions, usergroup, formated, prefix, filename); + logg("%s %-15s %3.0f%s %s", permissions, usergroup, formatted, prefix, filename); } logg("---------------------------------------------------"); @@ -171,17 +171,17 @@ int get_path_usage(const char *path, char buffer[64]) // Create human-readable total size char prefix_size[2] = { 0 }; - double formated_size = 0.0; - format_memory_size(prefix_size, size, &formated_size); + double formatted_size = 0.0; + format_memory_size(prefix_size, size, &formatted_size); // Generate human-readable "total used" size char prefix_used[2] = { 0 }; - double formated_used = 0.0; - format_memory_size(prefix_used, used, &formated_used); + double formatted_used = 0.0; + format_memory_size(prefix_used, used, &formatted_used); // Print result into buffer passed to this subroutine snprintf(buffer, 64, "%s: %.1f%sB used, %.1f%sB total", path, - formated_used, prefix_used, formated_size, prefix_size); + formatted_used, prefix_used, formatted_size, prefix_size); // Return percentage of used shared memory // Adding 1 avoids FPE if the size turns out to be zero diff --git a/src/log.c b/src/log.c index 2127cb14..a9b71b24 100644 --- a/src/log.c +++ b/src/log.c @@ -96,7 +96,7 @@ void _FTL_log(const bool newline, const bool debug, const char *format, ...) char idstr[42]; const int pid = getpid(); // Get the process ID of the calling process const int mpid = main_pid(); // Get the process ID of the main FTL process - const int tid = gettid(); // Get the thread ID of the callig process + const int tid = gettid(); // Get the thread ID of the calling process // There are four cases we have to differentiate here: if(pid == tid) @@ -197,16 +197,16 @@ void FTL_log_helper(const unsigned char n, ...) } void format_memory_size(char prefix[2], const unsigned long long int bytes, - double * const formated) + double * const formatted) { unsigned int i; - *formated = bytes; + *formatted = bytes; // Determine exponent for human-readable display for(i = 0; i < 7; i++) { - if(*formated <= 1e3) + if(*formatted <= 1e3) break; - *formated /= 1e3; + *formatted /= 1e3; } const char prefixes[8] = { ' ', 'K', 'M', 'G', 'T', 'P', 'E', '?' }; // Chose matching SI prefix @@ -345,7 +345,7 @@ const char __attribute__ ((const)) *get_ordinal_suffix(unsigned int number) // For example: 2nd, 7th, 20th, 23rd, 52nd, 135th, 301st BUT 311th (covered above) } -// Converts a buffer of specified lenth to ASCII representation as it was a C +// Converts a buffer of specified length to ASCII representation as it was a C // string literal. Returns how much bytes from source was processed // Inspired by https://stackoverflow.com/a/56123950 int binbuf_to_escaped_C_literal(const char *src_buf, size_t src_sz, diff --git a/src/log.h b/src/log.h index e7129e07..b6d25c57 100644 --- a/src/log.h +++ b/src/log.h @@ -16,7 +16,7 @@ void init_FTL_log(void); void log_counter_info(void); void format_memory_size(char prefix[2], unsigned long long int bytes, - double * const formated); + double * const formatted); void format_time(char buffer[42], unsigned long seconds, double milliseconds); const char *get_FTL_version(void) __attribute__ ((malloc)); void log_FTL_version(bool crashreport); diff --git a/src/overTime.h b/src/overTime.h index 4b337c43..55e4d34f 100644 --- a/src/overTime.h +++ b/src/overTime.h @@ -14,9 +14,6 @@ // TYPE_MAX #include "datastructure.h" -// assert_sizeof -#include "static_assert.h" - void initOverTime(void); #define getOverTimeID(timestamp) _getOverTimeID(timestamp, __FILE__, __LINE__) @@ -38,7 +35,6 @@ typedef struct { int forwarded; time_t timestamp; } overTimeData; -ASSERT_SIZEOF(overTimeData, 32, 24, 24); extern overTimeData *overTime; diff --git a/src/regex_r.h b/src/regex_r.h index 6ae8a6fc..6a44b4d5 100644 --- a/src/regex_r.h +++ b/src/regex_r.h @@ -24,9 +24,6 @@ extern const char *regextype[]; #include #endif -// assert_sizeof -#include "static_assert.h" - #include typedef struct { @@ -46,8 +43,6 @@ typedef struct { regex_t regex; } regexData; -ASSERT_SIZEOF(regexData, 56, 44, 44); - unsigned int get_num_regex(const enum regex_type regexid) __attribute__((pure)); int match_regex(const char *input, DNSCacheData* dns_cache, const int clientID, const enum regex_type regexid, const bool regextest); diff --git a/src/setupVars.c b/src/setupVars.c index 34c00f32..4f27f422 100644 --- a/src/setupVars.c +++ b/src/setupVars.c @@ -196,11 +196,11 @@ bool insetupVarsArray(const char * str) if(setupVarsArray[i][0] == '*') { // Copying strlen-1 chars into buffer of size strlen: OK - size_t lenght = strlen(setupVarsArray[i]); - char * domain = calloc(lenght, sizeof(char)); + size_t length = strlen(setupVarsArray[i]); + char * domain = calloc(length, sizeof(char)); if(domain == NULL) return false; // strncat() NULL-terminates the copied string (strncpy() doesn't!) - strncat(domain, setupVarsArray[i]+1, lenght-1); + strncat(domain, setupVarsArray[i]+1, length-1); if(strstr(str, domain) != NULL) { diff --git a/src/shmem.c b/src/shmem.c index 9f82f290..b0fcbc6a 100644 --- a/src/shmem.c +++ b/src/shmem.c @@ -117,12 +117,12 @@ static int get_dev_shm_usage(char buffer[64]) // Generate human-readable "used by FTL" size char prefix_FTL[2] = { 0 }; - double formated_FTL = 0.0; - format_memory_size(prefix_FTL, used_shmem, &formated_FTL); + double formatted_FTL = 0.0; + format_memory_size(prefix_FTL, used_shmem, &formatted_FTL); // Print result into buffer passed to this subroutine snprintf(buffer, 64, "%s, FTL uses %.1f%sB", - buffer2, formated_FTL, prefix_FTL); + buffer2, formatted_FTL, prefix_FTL); // Return percentage return percentage; @@ -561,14 +561,14 @@ bool init_shmem(bool create_new) return true; } -// CHOWN all shared memory objects to suppplied user/group +// CHOWN all shared memory objects to supplied user/group void chown_all_shmem(struct passwd *ent_pw) { for(unsigned int i = 0; i < NUM_SHMEM; i++) chown_shmem(sharedMemories[i], ent_pw); } -// Destory mutex and, subsequently, delete all shared memory objects +// Destroy mutex and, subsequently, delete all shared memory objects void destroy_shmem(void) { // First, we destroy the mutex diff --git a/src/shmem.h b/src/shmem.h index 93d07f83..9c59bed3 100644 --- a/src/shmem.h +++ b/src/shmem.h @@ -18,22 +18,17 @@ // TYPE_MAX #include "datastructure.h" -// assert_sizeof -#include "static_assert.h" - typedef struct { const char *name; size_t size; void *ptr; } SharedMemory; -ASSERT_SIZEOF(SharedMemory, 24, 12, 12); typedef struct { int version; unsigned int global_shm_counter; unsigned int next_str_pos; } ShmSettings; -ASSERT_SIZEOF(ShmSettings, 12, 12, 12); typedef struct { int queries; @@ -54,7 +49,6 @@ typedef struct { int status[QUERY_STATUS_MAX]; int reply[QUERY_REPLY_MAX]; } countersStruct; -ASSERT_SIZEOF(countersStruct, 244, 244, 244); extern countersStruct *counters; diff --git a/src/signals.c b/src/signals.c index 521c77af..0da81e32 100644 --- a/src/signals.c +++ b/src/signals.c @@ -51,7 +51,7 @@ static void print_addr2line(const char *symbol, const void *address, const int j if(strstr(symbol, BINARY_NAME) == NULL) return; - // Find first occurence of '(' or ' ' in the obtaned symbol string and + // Find first occurrence of '(' or ' ' in the obtaned symbol string and // assume everything before that is the file name. (Don't go beyond the // string terminator \0) int p = 0; @@ -185,7 +185,7 @@ static void __attribute__((noreturn)) signal_handler(int sig, siginfo_t *si, voi switch (si->si_code) { case BUS_ADRALN: logg(" with code: BUS_ADRALN (Invalid address alignment)"); break; - case BUS_ADRERR: logg(" with code: BUS_ADRERR (Non-existant physical address)"); break; + case BUS_ADRERR: logg(" with code: BUS_ADRERR (Non-existent physical address)"); break; case BUS_OBJERR: logg(" with code: BUS_OBJERR (Object specific hardware error)"); break; case BUS_MCEERR_AR: logg(" with code: BUS_MCEERR_AR (Hardware memory error: action required)"); break; case BUS_MCEERR_AO: logg(" with code: BUS_MCEERR_AO (Hardware memory error: action optional)"); break; diff --git a/src/static_assert.h b/src/static_assert.h deleted file mode 100644 index c70df718..00000000 --- a/src/static_assert.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Pi-hole: A black hole for Internet advertisements -* (c) 2021 Pi-hole, LLC (https://pi-hole.net) -* Network-wide ad blocking via your own hardware. -* -* FTL Engine -* Struct size assertion tool -* -* This file is copyright under the latest version of the EUPL. -* Please see LICENSE file for your rights under this license. */ - -#include - - -#define STATIC_ASSERT(OBJECT, EXPECTED) \ - static_assert(sizeof(OBJECT) == EXPECTED , "Expected size of " #OBJECT " is " #EXPECTED " on this architecture."); - -// Check based on detected architecture -#if defined(__x86_64__) || defined(__aarch64__) -#define ASSERT_SIZEOF(OBJECT, SIZE64, SIZE32, SIZEARM) \ - STATIC_ASSERT(OBJECT, SIZE64) -#elif defined(__i386__) || defined(__mips__) // issue #290 -#define ASSERT_SIZEOF(OBJECT, SIZE64, SIZE32, SIZEARM) \ - STATIC_ASSERT(OBJECT, SIZE32) -#elif defined(__arm__) -#define ASSERT_SIZEOF(OBJECT, SIZE64, SIZE32, SIZEARM) \ - STATIC_ASSERT(OBJECT, SIZEARM) -#endif diff --git a/src/struct_size.c b/src/struct_size.c new file mode 100644 index 00000000..ae640c14 --- /dev/null +++ b/src/struct_size.c @@ -0,0 +1,49 @@ + +/* Pi-hole: A black hole for Internet advertisements +* (c) 2022 Pi-hole, LLC (https://pi-hole.net) +* Network-wide ad blocking via your own hardware. +* +* FTL Engine +* Struct size checking routines +* +* This file is copyright under the latest version of the EUPL. +* Please see LICENSE file for your rights under this license. */ + +#include "struct_size.h" +#include + +int check_one_struct(const char *struct_name, const size_t found_size, const size_t size64, const size_t size32) +{ +#if defined(__x86_64__) + const size_t expected_size = size64; + const char *arch = "x86_64"; +#elif defined(__aarch64__) + const size_t expected_size = size64; + const char *arch = "aarch64"; +#elif defined(__i386__) + const size_t expected_size = size32; + const char *arch = "i386"; +#elif defined(__mips__) // issue #290 + const size_t expected_size = size32; + const char *arch = "mips"; +#elif defined(__arm__) + const size_t expected_size = size32; + const char *arch = "arm"; +#else + const size_t expected_size = 0; + const char *arch = NULL; +#endif + + // Check struct size meets expectation + if(found_size == expected_size) + return 0; + + // Size mismatch + if(arch) + printf("WARNING: sizeof(%s) should be %zu on %s but is %zu\n", + struct_name, expected_size, arch, found_size); + else + printf("WARNING: Unknown architecture, sizeof(%s) = %zu\n", + struct_name, found_size); + return 1; +} diff --git a/src/struct_size.h b/src/struct_size.h new file mode 100644 index 00000000..94c692c7 --- /dev/null +++ b/src/struct_size.h @@ -0,0 +1,18 @@ +/* Pi-hole: A black hole for Internet advertisements +* (c) 2022 Pi-hole, LLC (https://pi-hole.net) +* Network-wide ad blocking via your own hardware. +* +* FTL Engine +* Struct size checking prototypes +* +* This file is copyright under the latest version of the EUPL. +* Please see LICENSE file for your rights under this license. */ +#ifndef STRUCT_SIZE_HEADER +#define STRUCT_SIZE_HEADER + +// type size_t +#include + +int check_one_struct(const char *struct_name, const size_t found_size, const size_t size64, const size_t size32); + +#endif // STRUCT_SIZE_HEADER \ No newline at end of file diff --git a/src/syscalls/accept.c b/src/syscalls/accept.c index 5b9cdd94..535f18aa 100644 --- a/src/syscalls/accept.c +++ b/src/syscalls/accept.c @@ -26,7 +26,7 @@ int FTLaccept(int sockfd, struct sockaddr *addr, socklen_t *addrlen, const char // incoming signal while(ret < 0 && errno == EINTR); - // Final error checking (may have faild for some other reason then an + // Final error checking (may have failed for some other reason then an // EINTR = interrupted system call) if(ret < 0) logg("WARN: Could not accept() in %s() (%s:%i): %s", diff --git a/src/syscalls/fopen.c b/src/syscalls/fopen.c index 14a0cbe1..f11c4375 100644 --- a/src/syscalls/fopen.c +++ b/src/syscalls/fopen.c @@ -28,9 +28,9 @@ FILE *FTLfopen(const char *pathname, const char *mode, const char *file, const c // incoming signal while(file_ptr == NULL && errno == EINTR); - // Final error checking (may have faild for some other reason then an + // Final error checking (may have failed for some other reason then an // EINTR = interrupted system call) - // The already_writing coutner prevents a possible infinite loop + // The already_writing counter prevents a possible infinite loop if(file_ptr == NULL && (already_writing++) == 1) logg("WARN: Could not fopen(\"%s\", \"%s\") in %s() (%s:%i): %s", pathname, mode, func, file, line, strerror(errno)); diff --git a/src/syscalls/ftlallocate.c b/src/syscalls/ftlallocate.c index 39461419..91597cb7 100644 --- a/src/syscalls/ftlallocate.c +++ b/src/syscalls/ftlallocate.c @@ -27,7 +27,7 @@ int FTLfallocate(const int fd, const off_t offset, const off_t len, const char * // interruption by an incoming signal while(ret == EINTR); - // Final error checking (may have faild for some other reason then an + // Final error checking (may have failed for some other reason then an // EINTR = interrupted system call) if(ret > 0) logg("WARN: Could not fallocate() in %s() (%s:%i): %s", diff --git a/src/syscalls/pthread_mutex_lock.c b/src/syscalls/pthread_mutex_lock.c index da741764..2b6c942a 100644 --- a/src/syscalls/pthread_mutex_lock.c +++ b/src/syscalls/pthread_mutex_lock.c @@ -28,7 +28,7 @@ int FTLpthread_mutex_lock(pthread_mutex_t *__mutex, const char *file, const char // incoming signal while(ret < 0 && errno == EINTR); - // Final error checking (may have faild for some other reason then an + // Final error checking (may have failed for some other reason then an // EINTR = interrupted system call) if(ret < 0) logg("WARN: Could not pthread_mutex_lock() in %s() (%s:%i): %s", diff --git a/src/syscalls/recv.c b/src/syscalls/recv.c index 84f2d4bd..999edc4c 100644 --- a/src/syscalls/recv.c +++ b/src/syscalls/recv.c @@ -28,7 +28,7 @@ ssize_t FTLrecv(int sockfd, void *buf, size_t len, int flags, const char *file, // incoming signal while(ret < 0 && errno == EINTR); - // Final error checking (may have faild for some other reason then an + // Final error checking (may have failed for some other reason then an // EINTR = interrupted system call) if(ret < 0) logg("WARN: Could not recv() in %s() (%s:%i): %s", diff --git a/src/syscalls/recvfrom.c b/src/syscalls/recvfrom.c index f28c9066..322a9727 100644 --- a/src/syscalls/recvfrom.c +++ b/src/syscalls/recvfrom.c @@ -29,7 +29,7 @@ ssize_t FTLrecvfrom(int sockfd, void *buf, size_t len, int flags, struct sockadd // incoming signal while(ret < 0 && errno == EINTR); - // Final error checking (may have faild for some other reason then an + // Final error checking (may have failed for some other reason then an // EINTR = interrupted system call) if(ret < 0) logg("WARN: Could not recvfrom() in %s() (%s:%i): %s", diff --git a/src/syscalls/select.c b/src/syscalls/select.c index 5c26352d..41c384ca 100644 --- a/src/syscalls/select.c +++ b/src/syscalls/select.c @@ -28,7 +28,7 @@ int FTLselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, st // incoming signal while(ret < 0 && errno == EINTR); - // Final error checking (may have faild for some other reason then an + // Final error checking (may have failed for some other reason then an // EINTR = interrupted system call) if(ret < 0) logg("WARN: Could not select() in %s() (%s:%i): %s", diff --git a/src/syscalls/sendto.c b/src/syscalls/sendto.c index 9c0e165e..db5e4ff4 100644 --- a/src/syscalls/sendto.c +++ b/src/syscalls/sendto.c @@ -29,7 +29,7 @@ ssize_t FTLsendto(int sockfd, void *buf, size_t len, int flags, const struct soc // incoming signal while(ret < 0 && errno == EINTR); - // Final error checking (may have faild for some other reason then an + // Final error checking (may have failed for some other reason then an // EINTR = interrupted system call) if(ret < 0) logg("WARN: Could not sendto() in %s() (%s:%i): %s", diff --git a/src/syscalls/vfprintf.c b/src/syscalls/vfprintf.c index f2e65353..b945ae4f 100644 --- a/src/syscalls/vfprintf.c +++ b/src/syscalls/vfprintf.c @@ -152,7 +152,7 @@ int FTLvfprintf(FILE *stream, const char *file, const char *func, const int line // to an interruption by an incoming signal while(_buffer < buffer && errno == EINTR); - // Final error checking (may have faild for some other reason then an + // Final error checking (may have failed for some other reason then an // EINTR = interrupted system call) if(_buffer < buffer) { diff --git a/src/syscalls/write.c b/src/syscalls/write.c index b5787e89..fc7ee2f1 100644 --- a/src/syscalls/write.c +++ b/src/syscalls/write.c @@ -36,7 +36,7 @@ ssize_t FTLwrite(int fd, const void *buf, size_t total, const char *file, const // (b) the last write() call failed due to an interruption by an incoming signal while((written < total && errno == 0) || (ret < 0 && errno == EINTR)); - // Final error checking (may have faild for some other reason then an + // Final error checking (may have failed for some other reason then an // EINTR = interrupted system call) if(written < total) logg("WARN: Could not write() everything in %s() [%s:%i]: %s", diff --git a/src/vector.h b/src/vector.h index 84d1c91c..a3b77fd0 100644 --- a/src/vector.h +++ b/src/vector.h @@ -18,8 +18,6 @@ #include // type sqlite3_stmt #include "database/sqlite3.h" -// assert_sizeof -#include "static_assert.h" #define VEC_ALLOC_STEP 10u @@ -29,7 +27,6 @@ typedef struct sqlite3_stmt_vec { sqlite3_stmt *(*get)(struct sqlite3_stmt_vec *, unsigned int); void (*set)(struct sqlite3_stmt_vec *, unsigned int, sqlite3_stmt*); } sqlite3_stmt_vec; -ASSERT_SIZEOF(sqlite3_stmt_vec, 32, 16, 16); sqlite3_stmt_vec *new_sqlite3_stmt_vec(unsigned int initial_size); void set_sqlite3_stmt_vec(sqlite3_stmt_vec *v, unsigned int index, sqlite3_stmt* item); diff --git a/test/arch_test.sh b/test/arch_test.sh index 1a536e8f..e97bb7d5 100644 --- a/test/arch_test.sh +++ b/test/arch_test.sh @@ -56,7 +56,7 @@ check_FP_arch() { check_file() { filedetails="$(file -b pihole-FTL | sed "s/, BuildID[^,]*//g")" if [[ "${filedetails}" != "${1}" ]]; then - echo "Wrong binary clasification" + echo "Wrong binary classification" echo "Expected: ${1}" echo "Found: ${filedetails}" exit 1 diff --git a/test/dnsmasq.conf b/test/dnsmasq.conf index 722fd529..8a21c3b4 100644 --- a/test/dnsmasq.conf +++ b/test/dnsmasq.conf @@ -6,14 +6,14 @@ log-facility=/var/log/pihole.log dnssec trust-anchor=.,20326,8,2,E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D -# Explicity specify the local powerDNS recursor as forward destination for .ftl +# Explicitly specify the local powerDNS recursor as forward destination for .ftl # This ensures FTL knows that ftl. is a local zone for which no DNSSEC # validation should be done. Otherwise, we'd get BOGUS for everything as the # root servers would tell us that ftl. does not exist server=/ftl/127.0.0.1#5555 -# Send the HTTPS/SVCB queries to the authorative server without detour over the -# recursor because the latter returns SEVFAIL (connection between authorative +# Send the HTTPS/SVCB queries to the authoritative server without detour over the +# recursor because the latter returns SEVFAIL (connection between authoritative # server and recursor is not encrypted) server=/https.ftl/127.0.0.1#5554 server=/svcb.ftl/127.0.0.1#5554 diff --git a/test/pdns/pdns.conf b/test/pdns/pdns.conf index f556b763..ebe41ead 100644 --- a/test/pdns/pdns.conf +++ b/test/pdns/pdns.conf @@ -2,7 +2,7 @@ # (c) 2021 Pi-hole, LLC (https://pi-hole.net) # Network-wide ad blocking via your own hardware. # -# Pi-hole testing environment configuration (authorative server) +# Pi-hole testing environment configuration (authoritative server) # # This file is copyright under the latest version of the EUPL. # Please see LICENSE file for your rights under this license. diff --git a/test/pdns/recursor.conf b/test/pdns/recursor.conf index 2d2e136e..6919a556 100644 --- a/test/pdns/recursor.conf +++ b/test/pdns/recursor.conf @@ -10,5 +10,5 @@ # Local DNS address and port local-address=127.0.0.1:5555 -# Use authorative server for ftl. and arpa. zones +# Use authoritative server for ftl. and arpa. zones forward-zones=ftl=127.0.0.1:5554,168.192.in-addr.arpa=127.0.0.1:5554,ip6.arpa=127.0.0.1:5554 diff --git a/test/test_suite.bats b/test/test_suite.bats index 62e33f97..54b16d87 100644 --- a/test/test_suite.bats +++ b/test/test_suite.bats @@ -1097,6 +1097,12 @@ [[ ${lines[0]} == *"using ${compiler_version}"* ]] } +@test "Struct sizes are as expected" { + run bash -c './pihole-FTL --check-structs' + printf "%s\n" "${lines[@]}" + [[ $status == 0 ]] +} + @test "No errors on setting busy handlers for the databases" { run bash -c 'grep -c "Cannot set busy handler" /var/log/pihole-FTL.log' printf "%s\n" "${lines[@]}"