@@ -193,7 +193,8 @@ pub fn publish(req: &mut dyn RequestExt) -> EndpointResult {
193
193
let mut tarball = Vec :: new ( ) ;
194
194
LimitErrorReader :: new ( req. body ( ) , maximums. max_upload_size ) . read_to_end ( & mut tarball) ?;
195
195
let hex_cksum: String = Sha256 :: digest ( & tarball) . encode_hex ( ) ;
196
- verify_tarball ( & krate, vers, & tarball, maximums. max_unpack_size ) ?;
196
+ let pkg_name = format ! ( "{}-{}" , krate. name, vers) ;
197
+ verify_tarball ( & pkg_name, & tarball, maximums. max_unpack_size ) ?;
197
198
198
199
if let Some ( readme) = new_crate. readme {
199
200
render:: render_and_upload_readme (
@@ -363,12 +364,7 @@ pub fn add_dependencies(
363
364
Ok ( git_deps)
364
365
}
365
366
366
- fn verify_tarball (
367
- krate : & Crate ,
368
- vers : & semver:: Version ,
369
- tarball : & [ u8 ] ,
370
- max_unpack : u64 ,
371
- ) -> AppResult < ( ) > {
367
+ fn verify_tarball ( pkg_name : & str , tarball : & [ u8 ] , max_unpack : u64 ) -> AppResult < ( ) > {
372
368
// All our data is currently encoded with gzip
373
369
let decoder = GzDecoder :: new ( tarball) ;
374
370
@@ -378,7 +374,6 @@ fn verify_tarball(
378
374
379
375
// Use this I/O object now to take a peek inside
380
376
let mut archive = tar:: Archive :: new ( decoder) ;
381
- let prefix = format ! ( "{}-{}" , krate. name, vers) ;
382
377
for entry in archive. entries ( ) ? {
383
378
let entry = entry. map_err ( |err| {
384
379
err. chain ( cargo_err (
@@ -391,7 +386,7 @@ fn verify_tarball(
391
386
// upload a tarball that contains both `foo-0.1.0/` source code as well
392
387
// as `bar-0.1.0/` source code, and this could overwrite other crates in
393
388
// the registry!
394
- if !entry. path ( ) ?. starts_with ( & prefix ) {
389
+ if !entry. path ( ) ?. starts_with ( & pkg_name ) {
395
390
return Err ( cargo_err ( "invalid tarball uploaded" ) ) ;
396
391
}
397
392
0 commit comments