Skip to content

Commit d04e2ae

Browse files
asg017claude
andcommitted
Fix remaining fuzzer issues: leaks and macOS SDK headers
sqlite-vec.c: - vec0_free: add loops to free partition, auxiliary, and metadata column names (previously leaked on error paths) - vec0_init: update pNew->numXxxColumns incrementally in the parse loop so vec0_free sees correct counts on early goto-error paths (previously the counts were only written after the loop, so vec0_free would loop 0 times and leak names allocated inside the loop) fuzz.yaml: - macOS: pass -isysroot $(xcrun --sdk macosx --show-sdk-path) so Xcode clang can find system headers (stdio.h, assert.h, etc.) - Fix artifact upload paths: libFuzzer writes crash-*/leak-* to the cwd (repo root), not tests/fuzz/ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent e4b1e26 commit d04e2ae

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

.github/workflows/fuzz.yaml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ jobs:
5555
with:
5656
name: fuzz-crashes-linux
5757
path: |
58-
tests/fuzz/crash-*
59-
tests/fuzz/leak-*
60-
tests/fuzz/timeout-*
58+
crash-*
59+
leak-*
60+
timeout-*
6161
6262
fuzz-macos:
6363
runs-on: macos-14
@@ -70,9 +70,10 @@ jobs:
7070
run: make sqlite-vec.h
7171
- name: Build fuzz targets
7272
run: |
73+
SDK=$(xcrun --sdk macosx --show-sdk-path)
7374
make -C tests/fuzz all \
7475
FUZZ_CC=$(xcrun -f clang) \
75-
FUZZ_LDFLAGS=""
76+
FUZZ_LDFLAGS="-isysroot $SDK"
7677
- name: Run fuzz targets
7778
run: |
7879
DURATION=${{ github.event.inputs.duration || '60' }}
@@ -100,9 +101,9 @@ jobs:
100101
with:
101102
name: fuzz-crashes-macos
102103
path: |
103-
tests/fuzz/crash-*
104-
tests/fuzz/leak-*
105-
tests/fuzz/timeout-*
104+
crash-*
105+
leak-*
106+
timeout-*
106107
107108
fuzz-windows:
108109
# Best-effort: libFuzzer works on Windows via LLVM but ASAN/UBSAN

sqlite-vec.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3659,6 +3659,21 @@ void vec0_free(vec0_vtab *p) {
36593659
sqlite3_free(p->vector_columns[i].name);
36603660
p->vector_columns[i].name = NULL;
36613661
}
3662+
3663+
for (int i = 0; i < p->numPartitionColumns; i++) {
3664+
sqlite3_free(p->paritition_columns[i].name);
3665+
p->paritition_columns[i].name = NULL;
3666+
}
3667+
3668+
for (int i = 0; i < p->numAuxiliaryColumns; i++) {
3669+
sqlite3_free(p->auxiliary_columns[i].name);
3670+
p->auxiliary_columns[i].name = NULL;
3671+
}
3672+
3673+
for (int i = 0; i < p->numMetadataColumns; i++) {
3674+
sqlite3_free(p->metadata_columns[i].name);
3675+
p->metadata_columns[i].name = NULL;
3676+
}
36623677
}
36633678

36643679
int vec0_num_defined_user_columns(vec0_vtab *p) {
@@ -4742,6 +4757,7 @@ static int vec0_init(sqlite3 *db, void *pAux, int argc, const char *const *argv,
47424757
pNew->user_column_idxs[user_column_idx] = numVectorColumns;
47434758
memcpy(&pNew->vector_columns[numVectorColumns], &vecColumn, sizeof(vecColumn));
47444759
numVectorColumns++;
4760+
pNew->numVectorColumns = numVectorColumns;
47454761
user_column_idx++;
47464762

47474763
continue;
@@ -4770,6 +4786,7 @@ static int vec0_init(sqlite3 *db, void *pAux, int argc, const char *const *argv,
47704786
pNew->user_column_idxs[user_column_idx] = numPartitionColumns;
47714787
memcpy(&pNew->paritition_columns[numPartitionColumns], &partitionColumn, sizeof(partitionColumn));
47724788
numPartitionColumns++;
4789+
pNew->numPartitionColumns = numPartitionColumns;
47734790
user_column_idx++;
47744791
continue;
47754792
}
@@ -4815,6 +4832,7 @@ static int vec0_init(sqlite3 *db, void *pAux, int argc, const char *const *argv,
48154832
pNew->user_column_idxs[user_column_idx] = numAuxiliaryColumns;
48164833
memcpy(&pNew->auxiliary_columns[numAuxiliaryColumns], &auxColumn, sizeof(auxColumn));
48174834
numAuxiliaryColumns++;
4835+
pNew->numAuxiliaryColumns = numAuxiliaryColumns;
48184836
user_column_idx++;
48194837
continue;
48204838
}
@@ -4842,6 +4860,7 @@ static int vec0_init(sqlite3 *db, void *pAux, int argc, const char *const *argv,
48424860
pNew->user_column_idxs[user_column_idx] = numMetadataColumns;
48434861
memcpy(&pNew->metadata_columns[numMetadataColumns], &metadataColumn, sizeof(metadataColumn));
48444862
numMetadataColumns++;
4863+
pNew->numMetadataColumns = numMetadataColumns;
48454864
user_column_idx++;
48464865
continue;
48474866
}

0 commit comments

Comments
 (0)