mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-10-27 18:55:09 +03:00
fsck: copy out device argument from argv[] before forking
We nowadays rename our child processes, hence argv[] will be clobbered,
let's hence copy the device path to dynamic memory before forking.
This is fall-out from 60ffa37a65
since we
now a lot more often end up overriding the argv[] buffer than before,
simple because we know what to override.
These kind of bugs kinda suck. THere are only two options here: stop
overriding argv[] for all cases (or just these cases) or explicitly
copying out everything we need in child processes before forking. With
this patch I opt for the latter, though I am not 100% convinced this is
a great solution. Just a better solution than everything else, i.e.
allowing argv[] to remain out of sync with what others see.
Fixes: #12135
This commit is contained in:
parent
7232c1f9da
commit
bd169c2be0
@ -265,6 +265,7 @@ static int fsck_progress_socket(void) {
|
||||
static int run(int argc, char *argv[]) {
|
||||
_cleanup_close_pair_ int progress_pipe[2] = { -1, -1 };
|
||||
_cleanup_(sd_device_unrefp) sd_device *dev = NULL;
|
||||
_cleanup_free_ char *dpath = NULL;
|
||||
const char *device, *type;
|
||||
bool root_directory;
|
||||
struct stat st;
|
||||
@ -290,7 +291,11 @@ static int run(int argc, char *argv[]) {
|
||||
return 0;
|
||||
|
||||
if (argc > 1) {
|
||||
device = argv[1];
|
||||
dpath = strdup(argv[1]);
|
||||
if (!dpath)
|
||||
return log_oom();
|
||||
|
||||
device = dpath;
|
||||
|
||||
if (stat(device, &st) < 0)
|
||||
return log_error_errno(errno, "Failed to stat %s: %m", device);
|
||||
|
Loading…
Reference in New Issue
Block a user