Skip to content

Commit 937a2e2

Browse files
committed
Initialize array without dropping uninitialized contents, fixes CI
1 parent 9e79cfe commit 937a2e2

File tree

1 file changed

+37
-30
lines changed

1 file changed

+37
-30
lines changed

src/index.rs

+37-30
Original file line numberDiff line numberDiff line change
@@ -96,19 +96,22 @@ fn try_raw_entries<const N: usize>(
9696
let mut paths: [Option<CString>; N] = unsafe {
9797
std::mem::MaybeUninit::uninit().assume_init()
9898
};
99-
for (idx, entry) in entries.iter().enumerate() {
100-
paths[idx] = if let Some(entry) = entry {
99+
for (path, entry) in paths.iter_mut().zip(entries.iter()) {
100+
let c_path = if let Some(entry) = entry {
101101
Some(CString::new(&entry.path[..])?)
102102
} else {
103103
None
104-
}
104+
};
105+
106+
let path_ptr: *mut Option<CString> = path;
107+
unsafe { path_ptr.write(c_path); }
105108
}
106109

107110
let mut raw_entries: [Option<raw::git_index_entry>; N] = unsafe {
108111
std::mem::MaybeUninit::uninit().assume_init()
109112
};
110-
for (idx, (entry, path)) in entries.iter().zip(&paths).enumerate() {
111-
raw_entries[idx] = if let Some(entry) = entry {
113+
for (raw_entry, (entry, path)) in raw_entries.iter_mut().zip(entries.iter().zip(&paths)) {
114+
let c_raw_entry = if let Some(entry) = entry {
112115
// libgit2 encodes the length of the path in the lower bits of the
113116
// `flags` entry, so mask those out and recalculate here to ensure we
114117
// don't corrupt anything.
@@ -120,38 +123,42 @@ fn try_raw_entries<const N: usize>(
120123
flags |= raw::GIT_INDEX_ENTRY_NAMEMASK;
121124
}
122125

123-
unsafe {
124-
Some(raw::git_index_entry {
125-
dev: entry.dev,
126-
ino: entry.ino,
127-
mode: entry.mode,
128-
uid: entry.uid,
129-
gid: entry.gid,
130-
file_size: entry.file_size,
131-
id: *entry.id.raw(),
132-
flags,
133-
flags_extended: entry.flags_extended,
134-
path: path.as_ref().unwrap().as_ptr(),
135-
mtime: raw::git_index_time {
136-
seconds: entry.mtime.seconds(),
137-
nanoseconds: entry.mtime.nanoseconds(),
138-
},
139-
ctime: raw::git_index_time {
140-
seconds: entry.ctime.seconds(),
141-
nanoseconds: entry.ctime.nanoseconds(),
142-
},
143-
})
144-
}
126+
Some(raw::git_index_entry {
127+
dev: entry.dev,
128+
ino: entry.ino,
129+
mode: entry.mode,
130+
uid: entry.uid,
131+
gid: entry.gid,
132+
file_size: entry.file_size,
133+
id: unsafe { *entry.id.raw() },
134+
flags,
135+
flags_extended: entry.flags_extended,
136+
path: path.as_ref().unwrap().as_ptr(),
137+
mtime: raw::git_index_time {
138+
seconds: entry.mtime.seconds(),
139+
nanoseconds: entry.mtime.nanoseconds(),
140+
},
141+
ctime: raw::git_index_time {
142+
seconds: entry.ctime.seconds(),
143+
nanoseconds: entry.ctime.nanoseconds(),
144+
},
145+
})
145146
} else {
146147
None
147-
}
148+
};
149+
150+
let raw_entry_ptr: *mut Option<raw::git_index_entry> = raw_entry;
151+
unsafe { raw_entry_ptr.write(c_raw_entry); }
148152
}
149153

150154
let mut raw_entry_ptrs: [*const raw::git_index_entry; N] = unsafe {
151155
std::mem::MaybeUninit::uninit().assume_init()
152156
};
153-
for (idx, entry) in raw_entries.iter().enumerate() {
154-
raw_entry_ptrs[idx] = entry.as_ref().map_or_else(std::ptr::null, |ptr| ptr);
157+
for (raw_entry_ptr, raw_entry) in raw_entry_ptrs.iter_mut().zip(raw_entries.iter()) {
158+
let c_raw_entry_ptr = raw_entry.as_ref().map_or_else(std::ptr::null, |ptr| ptr);
159+
160+
let raw_entry_ptr_ptr: *mut *const raw::git_index_entry = raw_entry_ptr;
161+
unsafe { raw_entry_ptr_ptr.write(c_raw_entry_ptr); }
155162
}
156163

157164
cb(&raw_entry_ptrs)

0 commit comments

Comments
 (0)