From c70efcea4d824e064d25d063ba7d91fd270a9d22 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Wed, 18 Sep 2013 13:58:03 -0700 Subject: [PATCH] Handle other write flags, log and handler read/write errors. --- src/protocols/rdp/guac_rdpdr/rdpdr_fs.c | 5 +++-- src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages.c | 8 +++++++- src/protocols/rdp/guac_rdpdr/rdpdr_messages.h | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_fs.c b/src/protocols/rdp/guac_rdpdr/rdpdr_fs.c index 6cb772ea..2fa0dfa2 100644 --- a/src/protocols/rdp/guac_rdpdr/rdpdr_fs.c +++ b/src/protocols/rdp/guac_rdpdr/rdpdr_fs.c @@ -140,9 +140,10 @@ int guac_rdpdr_fs_open(guac_rdpdr_device* device, /* Translate access into mode */ if (access & ACCESS_GENERIC_ALL) mode = O_RDWR; - else if (access & (ACCESS_GENERIC_WRITE | ACCESS_GENERIC_READ)) + else if ((access & (ACCESS_GENERIC_WRITE | ACCESS_FILE_WRITE_DATA)) + && (access & (ACCESS_GENERIC_READ | ACCESS_FILE_READ_DATA))) mode = O_RDWR; - else if (access & ACCESS_GENERIC_WRITE) + else if (access & (ACCESS_GENERIC_WRITE | ACCESS_FILE_WRITE_DATA)) mode = O_WRONLY; else mode = O_RDONLY; diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages.c b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages.c index f62848d8..a39721d0 100644 --- a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages.c +++ b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages.c @@ -42,6 +42,7 @@ #endif #include +#include #include "rdpdr_fs.h" #include "rdpdr_fs_messages.h" @@ -184,6 +185,8 @@ void guac_rdpdr_fs_process_read(guac_rdpdr_device* device, /* If error, return invalid parameter */ if (bytes_read < 0) { + guac_client_log_error(device->rdpdr->client, + "Unable to read from file: %s", strerror(errno)); Stream_Write_UINT32(output_stream, STATUS_INVALID_PARAMETER); Stream_Write_UINT32(output_stream, 0); /* Length */ } @@ -249,7 +252,10 @@ void guac_rdpdr_fs_process_write(guac_rdpdr_device* device, /* If error, return invalid parameter */ if (bytes_written < 0) { - Stream_Write_UINT32(output_stream, STATUS_INVALID_PARAMETER); + guac_client_log_error(device->rdpdr->client, + "Unable to write to file %i: %s", file->fd, + strerror(errno)); + Stream_Write_UINT32(output_stream, STATUS_ACCESS_DENIED); Stream_Write_UINT32(output_stream, 0); /* Length */ } diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h b/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h index 7480533c..79bccfe4 100644 --- a/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h +++ b/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h @@ -207,6 +207,7 @@ #define STATUS_INVALID_PARAMETER 0xC000000D #define STATUS_NO_SUCH_FILE 0xC000000F #define STATUS_END_OF_FILE 0xC0000011 +#define STATUS_ACCESS_DENIED 0xC0000022 #define STATUS_FILE_INVALID 0xC0000098 #define STATUS_FILE_IS_A_DIRECTORY 0xC00000BA #define STATUS_TOO_MANY_OPENED_FILES 0xC000011F