Skip to content

Commit 0d1fde9

Browse files
authored
Merge pull request #1250 from DanielEScherzer/remote-empty-list
Fix `Remote::list()` with an empty list
2 parents 8cce71d + 241e629 commit 0d1fde9

1 file changed

Lines changed: 33 additions & 0 deletions

File tree

src/remote.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,18 @@ impl<'repo> Remote<'repo> {
384384
mem::size_of::<RemoteHead<'_>>(),
385385
mem::size_of::<*const raw::git_remote_head>()
386386
);
387+
if base.is_null() {
388+
// We cannot use slice::from_raw_parts() since that requires
389+
// that the pointer be non-null, but that is fine since the size
390+
// should be zero
391+
if size != 0 {
392+
return Err(Error::from_str(&format!(
393+
"git_remote_ls() set a null pointer for a list of size {}",
394+
size
395+
)));
396+
}
397+
return Ok(&[]);
398+
}
387399
let slice = slice::from_raw_parts(base as *const _, size as usize);
388400
Ok(mem::transmute::<
389401
&[*const raw::git_remote_head],
@@ -921,6 +933,27 @@ mod tests {
921933
drop(origin.clone());
922934
}
923935

936+
#[test]
937+
fn empty_remote_list() {
938+
// Regression tests for issue #1217
939+
let td = TempDir::new().unwrap();
940+
let repo = Repository::init(td.path()).unwrap();
941+
942+
let remote_dir = TempDir::new().unwrap();
943+
let _remote_repo = Repository::init_bare(remote_dir.path()).unwrap();
944+
let remote_url = if cfg!(unix) {
945+
format!("file://{}", remote_dir.path().display())
946+
} else {
947+
format!(
948+
"file:///{}",
949+
remote_dir.path().display().to_string().replace("\\", "/")
950+
)
951+
};
952+
let mut remote = repo.remote("origin", &remote_url).unwrap();
953+
remote.connect(Direction::Fetch).unwrap();
954+
assert_eq!(0, remote.list().unwrap().len());
955+
}
956+
924957
#[test]
925958
fn is_valid_name() {
926959
assert!(Remote::is_valid_name("foobar"));

0 commit comments

Comments
 (0)