diff --git a/contrib/win32/openssh/config.h.vs b/contrib/win32/openssh/config.h.vs index 6e37bf6..f2854a5 100644 --- a/contrib/win32/openssh/config.h.vs +++ b/contrib/win32/openssh/config.h.vs @@ -1664,9 +1664,6 @@ #define BROKEN_SYS_TERMIO_H -#define strerror strerror_win32 - -#define strerror strerror_win32 // PRAGMA SYS PORT #define WITH_OPENSSL 1 diff --git a/contrib/win32/win32compat/fileio.c b/contrib/win32/win32compat/fileio.c index 63c8106..1315304 100644 --- a/contrib/win32/win32compat/fileio.c +++ b/contrib/win32/win32compat/fileio.c @@ -223,8 +223,8 @@ createFile_flags_setup(int flags, int mode, struct createFile_flags* cf_flags) { if (c_s_flags & O_EXCL) cf_flags->dwCreationDisposition = CREATE_NEW; else - cf_flags->dwCreationDisposition = OPEN_ALWAYS; - } + cf_flags->dwCreationDisposition = CREATE_ALWAYS; + } if (c_s_flags & O_APPEND) cf_flags->dwDesiredAccess = FILE_APPEND_DATA; @@ -301,7 +301,7 @@ VOID CALLBACK ReadCompletionRoutine( /* initiate an async read */ /* TODO: make this a void func, store error in context */ int -fileio_ReadFileEx(struct w32_io* pio) { +fileio_ReadFileEx(struct w32_io* pio, unsigned int bytes_requested) { debug2("ReadFileEx io:%p", pio); if (pio->read_details.buf == NULL) { @@ -311,9 +311,13 @@ fileio_ReadFileEx(struct w32_io* pio) { debug2("ReadFileEx - ERROR: %d, io:%p", errno, pio); return -1; } - pio->read_details.buf_size = READ_BUFFER_SIZE; } + if (FILETYPE(pio) == FILE_TYPE_DISK) + pio->read_details.buf_size = min(bytes_requested, READ_BUFFER_SIZE); + else + pio->read_details.buf_size = READ_BUFFER_SIZE; + if (ReadFileEx(WINHANDLE(pio), pio->read_details.buf, pio->read_details.buf_size, &pio->read_overlapped, &ReadCompletionRoutine)) pio->read_details.pending = TRUE; @@ -353,7 +357,7 @@ fileio_read(struct w32_io* pio, void *dst, unsigned int max) { return -1; } else { - if (-1 == fileio_ReadFileEx(pio)) { + if (-1 == fileio_ReadFileEx(pio, max)) { if ((FILETYPE(pio) == FILE_TYPE_PIPE) && (errno == ERROR_BROKEN_PIPE)) { /* write end of the pipe closed */ @@ -560,8 +564,8 @@ fileio_lseek(struct w32_io* pio, long offset, int origin) { return -1; } - //NO-OP as we automatically move file pointer in async io callbacks for files - //assert current postion in overlapped struct + pio->read_overlapped.Offset = offset; + pio->write_overlapped.Offset = offset; return 0; } @@ -625,7 +629,7 @@ fileio_on_select(struct w32_io* pio, BOOL rd) { } } else { - if (fileio_ReadFileEx(pio) != 0) { + if (fileio_ReadFileEx(pio, INT_MAX) != 0) { pio->read_details.error = errno; errno = 0; return; diff --git a/sftp-server.c b/sftp-server.c index 2cfbf8e..e6dd029 100644 --- a/sftp-server.c +++ b/sftp-server.c @@ -1320,7 +1320,7 @@ process_rmdir(u_int32_t id) static void process_realpath(u_int32_t id) { - char resolvedname[PATH_MAX]; + char resolvedname[PATH_MAX+ 1]; char *path; int r; //#ifdef WIN32_FIXME