@@ -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
let pkg_path_in_vcs = None ;
199
200
@@ -366,12 +367,7 @@ pub fn add_dependencies(
366
367
Ok ( git_deps)
367
368
}
368
369
369
- fn verify_tarball (
370
- krate : & Crate ,
371
- vers : & semver:: Version ,
372
- tarball : & [ u8 ] ,
373
- max_unpack : u64 ,
374
- ) -> AppResult < ( ) > {
370
+ fn verify_tarball ( pkg_name : & str , tarball : & [ u8 ] , max_unpack : u64 ) -> AppResult < ( ) > {
375
371
// All our data is currently encoded with gzip
376
372
let decoder = GzDecoder :: new ( tarball) ;
377
373
@@ -381,7 +377,6 @@ fn verify_tarball(
381
377
382
378
// Use this I/O object now to take a peek inside
383
379
let mut archive = tar:: Archive :: new ( decoder) ;
384
- let prefix = format ! ( "{}-{}" , krate. name, vers) ;
385
380
for entry in archive. entries ( ) ? {
386
381
let entry = entry. map_err ( |err| {
387
382
err. chain ( cargo_err (
@@ -394,7 +389,7 @@ fn verify_tarball(
394
389
// upload a tarball that contains both `foo-0.1.0/` source code as well
395
390
// as `bar-0.1.0/` source code, and this could overwrite other crates in
396
391
// the registry!
397
- if !entry. path ( ) ?. starts_with ( & prefix ) {
392
+ if !entry. path ( ) ?. starts_with ( & pkg_name ) {
398
393
return Err ( cargo_err ( "invalid tarball uploaded" ) ) ;
399
394
}
400
395
0 commit comments