@@ -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