<pre style='margin:0'>
Clemens Lang (neverpanic) pushed a commit to branch master
in repository macports-base.
</pre>
<p><a href="https://github.com/macports/macports-base/commit/19468ac56d9635bcf08a5dd5b6647cc0a61c6f13">https://github.com/macports/macports-base/commit/19468ac56d9635bcf08a5dd5b6647cc0a61c6f13</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'> new 19468ac5 cregistry: Avoid segfault on extended result codes
</span>19468ac5 is described below
<span style='display:block; white-space:pre;color:#808000;'>commit 19468ac56d9635bcf08a5dd5b6647cc0a61c6f13
</span>Author: Clemens Lang <cal@macports.org>
AuthorDate: Wed Apr 7 20:34:27 2021 +0200
<span style='display:block; white-space:pre;color:#404040;'> cregistry: Avoid segfault on extended result codes
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> When an SQLite call returned one of the extended result codes (see
</span><span style='display:block; white-space:pre;color:#404040;'> https://sqlite.org/rescode.html#extended_result_code_list), the existing
</span><span style='display:block; white-space:pre;color:#404040;'> switch/case did not handle that, errPtr remained uninitialized, and
</span><span style='display:block; white-space:pre;color:#404040;'> following code crashed with a segmentation fault.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Avoid this by handling the extended result codes just like we're
</span><span style='display:block; white-space:pre;color:#404040;'> handling SQLITE_ERROR. Additionally, default-initialize the errPtr
</span><span style='display:block; white-space:pre;color:#404040;'> structure to avoid crashes in the future.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> This manifested itself when attempting to uninstall ports from
</span><span style='display:block; white-space:pre;color:#404040;'> a database that returned SQLITE_CORRUPT_INDEX (779).
</span>---
src/cregistry/entry.c | 11 +++++++++++
1 file changed, 11 insertions(+)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/cregistry/entry.c b/src/cregistry/entry.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 017c181f..f1bf289a 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/cregistry/entry.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/cregistry/entry.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -251,6 +251,11 @@ reg_entry* reg_entry_open(reg_registry* reg, char* name, char* version,
</span> int reg_entry_delete(reg_entry* entry, reg_error* errPtr) {
reg_registry* reg = entry->reg;
int result = 0;
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errPtr->code = REG_SQLITE_ERROR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errPtr->description = "an unknown sqlite error occurred";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errPtr->free = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> sqlite3_stmt* ports = NULL;
sqlite3_stmt* files = NULL;
sqlite3_stmt* dependencies = NULL;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -293,6 +298,7 @@ int reg_entry_delete(reg_entry* entry, reg_error* errPtr) {
</span> case SQLITE_BUSY:
break;
case SQLITE_ERROR:
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ default:
</span> reg_sqlite_error(reg->db,
errPtr, NULL);
break;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -302,6 +308,7 @@ int reg_entry_delete(reg_entry* entry, reg_error* errPtr) {
</span> case SQLITE_BUSY:
break;
case SQLITE_ERROR:
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ default:
</span> reg_sqlite_error(reg->db,
errPtr, NULL);
break;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -311,6 +318,7 @@ int reg_entry_delete(reg_entry* entry, reg_error* errPtr) {
</span> case SQLITE_BUSY:
break;
case SQLITE_ERROR:
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ default:
</span> reg_sqlite_error(reg->db, errPtr, NULL);
break;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -325,6 +333,7 @@ int reg_entry_delete(reg_entry* entry, reg_error* errPtr) {
</span> case SQLITE_BUSY:
break;
case SQLITE_ERROR:
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ default:
</span> reg_sqlite_error(reg->db, errPtr, NULL);
break;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1137,6 +1146,7 @@ int reg_entry_activate(reg_entry* entry, char** files, char** as_files,
</span> case SQLITE_BUSY:
break;
case SQLITE_ERROR:
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ default:
</span> reg_sqlite_error(reg->db, errPtr,
update_query);
result = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1147,6 +1157,7 @@ int reg_entry_activate(reg_entry* entry, char** files, char** as_files,
</span> case SQLITE_BUSY:
break;
case SQLITE_ERROR:
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ default:
</span> reg_sqlite_error(reg->db, errPtr, select_query);
result = 0;
break;
</pre><pre style='margin:0'>
</pre>