Open Saxomania opened 5 days ago
I can reproduce this.
Creates and leaves an empty key.pub
file on the intended network folder.
I suspect the problem is that this fdopen()
call fails if path
is on a network drive:
int fd, oerrno;
FILE *f = NULL;
int r = SSH_ERR_INTERNAL_ERROR;
if ((fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1)
return SSH_ERR_SYSTEM_ERROR;
if ((f = fdopen(fd, "w")) == NULL) {
r = SSH_ERR_SYSTEM_ERROR;
close(fd);
goto fail;
}
May be too much paranoid Unix-specific file-opening trickery for Windows libc to handle on a network drive?
It looks like this has previously been noted elsewhere, judging from e.g. this comment in auth2-pubkeyfile.c:
#ifdef WINDOWS
/* Windows POSIX adapter does not support fdopen() on open(file)*/
if ((f = fopen(file, "r")) == NULL) {
[...]
#else /* !WINDOWS */
if ((fd = open(file, O_RDONLY|O_NONBLOCK)) == -1) {
I guess the thing to do is to review all uses of fdopen() after open(), and then introduce a proper abstraction for what they actually try to achieve.
I don't really understand why upstream isn't simply using
if ((f = fopen(fd, "w")) == NULL)
return SSH_ERR_SYSTEM_ERROR;
here.
It's not about the flags bits, because according to the Linux fopen() man page and the POSIX standard:
The file descriptor associated with the stream is opened as if by a call to open(2) with the following flags: | w │ O_WRONLY | O_CREAT | O_TRUNC |
I suspect this is merely done to mask out u+x,go+wx
permissions.
Prerequisites
Steps to reproduce
Windows: creating pub/priv key file works on default folder (if you dont enter any path) and for example on D drive (just a local volume) will work but will not work on a mapped network share.
Write rights are there so this should not be problem otherwise it couldnt write into my userprofile folder as well
Expected behavior
Actual behavior
Error details
Environment data
Version
9.8.1.0
Visuals
No response