Use the default file permissions when writing
static libraries with ar_archive_writer Fixes #107495
This commit is contained in:
parent
66a73f0c20
commit
297fceb9ac
3 changed files with 29 additions and 9 deletions
|
@ -13,7 +13,7 @@ use object::read::macho::FatArch;
|
||||||
use tempfile::Builder as TempFileBuilder;
|
use tempfile::Builder as TempFileBuilder;
|
||||||
|
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::fs::File;
|
use std::fs::{self, File};
|
||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
|
@ -280,12 +280,21 @@ impl<'a> ArArchiveBuilder<'a> {
|
||||||
// This prevents programs (including rustc) from attempting to read a partial archive.
|
// This prevents programs (including rustc) from attempting to read a partial archive.
|
||||||
// It also enables writing an archive with the same filename as a dependency on Windows as
|
// It also enables writing an archive with the same filename as a dependency on Windows as
|
||||||
// required by a test.
|
// required by a test.
|
||||||
let mut archive_tmpfile = TempFileBuilder::new()
|
// The tempfile crate currently uses 0o600 as mode for the temporary files and directories
|
||||||
|
// it creates. We need it to be the default mode for back compat reasons however. (See
|
||||||
|
// #107495) To handle this we are telling tempfile to create a temporary directory instead
|
||||||
|
// and then inside this directory create a file using File::create.
|
||||||
|
let archive_tmpdir = TempFileBuilder::new()
|
||||||
.suffix(".temp-archive")
|
.suffix(".temp-archive")
|
||||||
.tempfile_in(output.parent().unwrap_or_else(|| Path::new("")))
|
.tempdir_in(output.parent().unwrap_or_else(|| Path::new("")))
|
||||||
.map_err(|err| io_error_context("couldn't create a temp file", err))?;
|
.map_err(|err| {
|
||||||
|
io_error_context("couldn't create a directory for the temp file", err)
|
||||||
|
})?;
|
||||||
|
let archive_tmpfile_path = archive_tmpdir.path().join("tmp.a");
|
||||||
|
let mut archive_tmpfile = File::create_new(&archive_tmpfile_path)
|
||||||
|
.map_err(|err| io_error_context("couldn't create the temp file", err))?;
|
||||||
|
|
||||||
write_archive_to_stream(archive_tmpfile.as_file_mut(), &entries, archive_kind, false)?;
|
write_archive_to_stream(&mut archive_tmpfile, &entries, archive_kind, false)?;
|
||||||
|
|
||||||
let any_entries = !entries.is_empty();
|
let any_entries = !entries.is_empty();
|
||||||
drop(entries);
|
drop(entries);
|
||||||
|
@ -293,9 +302,11 @@ impl<'a> ArArchiveBuilder<'a> {
|
||||||
// output archive to the same location as an input archive on Windows.
|
// output archive to the same location as an input archive on Windows.
|
||||||
drop(self.src_archives);
|
drop(self.src_archives);
|
||||||
|
|
||||||
archive_tmpfile
|
fs::rename(archive_tmpfile_path, output)
|
||||||
.persist(output)
|
.map_err(|err| io_error_context("failed to rename archive file", err))?;
|
||||||
.map_err(|err| io_error_context("failed to rename archive file", err.error))?;
|
archive_tmpdir
|
||||||
|
.close()
|
||||||
|
.map_err(|err| io_error_context("failed to remove temporary directory", err))?;
|
||||||
|
|
||||||
Ok(any_entries)
|
Ok(any_entries)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
|
// Empty
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
#![feature(rustc_private)]
|
||||||
|
|
||||||
|
#[cfg(unix)]
|
||||||
|
extern crate libc;
|
||||||
extern crate run_make_support;
|
extern crate run_make_support;
|
||||||
|
|
||||||
use run_make_support::{aux_build, tmp_dir};
|
use run_make_support::{aux_build, tmp_dir};
|
||||||
|
@ -7,6 +11,11 @@ use std::os::unix::fs::PermissionsExt;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
#[cfg(unix)]
|
||||||
|
unsafe {
|
||||||
|
libc::umask(0o002);
|
||||||
|
}
|
||||||
|
|
||||||
aux_build().arg("foo.rs").run();
|
aux_build().arg("foo.rs").run();
|
||||||
verify(&tmp_dir().join("libfoo.rlib"));
|
verify(&tmp_dir().join("libfoo.rlib"));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue