use rename() if the underlying filesystem doesn't support link()

sigsegv_dump
Greg Alexander 5 years ago
parent bb8753a5a6
commit 80bb4d95c9

@ -143,10 +143,11 @@ int signkey_generate(enum signkey_type keytype, int bits, const char* filename,
if (link(fn_temp, filename) < 0) { if (link(fn_temp, filename) < 0) {
/* If generating keys on connection (skipexist) it's OK to get EEXIST /* If generating keys on connection (skipexist) it's OK to get EEXIST
- we probably just lost a race with another connection to generate the key */ - we probably just lost a race with another connection to generate the key */
if (!(skip_exist && errno == EEXIST)) { /* fallback to rename() if the fs doesn't support link() */
if ((!(skip_exist && errno == EEXIST)) &&
(rename(fn_temp, filename) < 0)) {
dropbear_log(LOG_ERR, "Failed moving key file to %s: %s", filename, dropbear_log(LOG_ERR, "Failed moving key file to %s: %s", filename,
strerror(errno)); strerror(errno));
/* XXX fallback to non-atomic copy for some filesystems? */
ret = DROPBEAR_FAILURE; ret = DROPBEAR_FAILURE;
goto out; goto out;
} }

Loading…
Cancel
Save