From 714cbcd099fd69c0653891460ea880d3296de218 Mon Sep 17 00:00:00 2001 From: Peter Kallden Date: Mon, 23 Feb 2004 09:58:16 +0000 Subject: [PATCH] better error handling in rdpdr and disk.c - partial merge of Volker Mildes patch. git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@611 423420c4-83ab-492f-b58f-81f9feb106b5 --- constants.h | 2 ++ disk.c | 13 +++++++++++-- rdpdr.c | 31 +++++++++++++++++++++++++++++-- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/constants.h b/constants.h index 17cb075..5077f46 100644 --- a/constants.h +++ b/constants.h @@ -240,6 +240,7 @@ enum RDP_INPUT_DEVICE #define RDP_LOGON_NORMAL 0x33 #define RDP_LOGON_AUTO 0x8 #define RDP_LOGON_BLOB 0x100 +#define RDP_COMPRESSION 0x80 /* Keymap flags */ #define MapRightShiftMask (1<<0) @@ -326,6 +327,7 @@ enum RDP_INPUT_DEVICE #define STATUS_PENDING 0x00000103 #define STATUS_CANCELLED 0xc0000120 #define STATUS_TIMEOUT 0xc0000102 +#define STATUS_OBJECT_NAME_COLLISION 0xc0000035 /* RDPDR constants */ #define RDPDR_MAX_DEVICES 0x10 diff --git a/disk.c b/disk.c index 7cfd857..1a85aa2 100644 --- a/disk.c +++ b/disk.c @@ -137,7 +137,6 @@ struct fileinfo } g_fileinfo[MAX_OPEN_FILES]; - time_t get_create_time(struct stat *st) { @@ -182,7 +181,7 @@ convert_1970_to_filetime(uint32 high, uint32 low) /* Enumeration of devices from rdesktop.c */ /* returns numer of units found and initialized. */ -/* optarg looks like ':h:=/mnt/floppy,b:=/mnt/usbdevice1' */ +/* optarg looks like ':h=/mnt/floppy,b=/mnt/usbdevice1' */ /* when it arrives to this function. */ int disk_enum_devices(uint32 * id, char *optarg) @@ -341,6 +340,9 @@ disk_create(uint32 device_id, uint32 accessmask, uint32 sharemode, uint32 create case ENOENT: return STATUS_NO_SUCH_FILE; + case EEXIST: + + return STATUS_OBJECT_NAME_COLLISION; default: perror("open"); @@ -547,6 +549,7 @@ disk_set_information(HANDLE handle, uint32 info_class, STREAM in, STREAM out) struct stat filestat; time_t write_time, change_time, access_time, mod_time; struct utimbuf tvs; + struct STATFS_T stat_fs; pfinfo = &(g_fileinfo[handle]); @@ -629,6 +632,12 @@ disk_set_information(HANDLE handle, uint32 info_class, STREAM in, STREAM out) if (fchmod(handle, mode)) return STATUS_ACCESS_DENIED; + + /* prevents start of writing if not enough space left on device */ + if (STATFS_FN(g_rdpdr_device[pfinfo->device_id].local_path, &stat_fs) == 0) + if (stat_fs.f_bsize * stat_fs.f_bfree < length) + return STATUS_DISK_FULL; + break; case 10: /* FileRenameInformation */ diff --git a/rdpdr.c b/rdpdr.c index 12b660c..d277b50 100644 --- a/rdpdr.c +++ b/rdpdr.c @@ -89,6 +89,8 @@ add_async_iorequest(uint32 device, uint32 file, uint32 id, uint32 major, uint32 if (g_iorequest == NULL) { g_iorequest = (struct async_iorequest *) xmalloc(sizeof(struct async_iorequest)); + if (!g_iorequest) + return False; g_iorequest->fd = 0; g_iorequest->next = NULL; } @@ -102,6 +104,8 @@ add_async_iorequest(uint32 device, uint32 file, uint32 id, uint32 major, uint32 { iorq->next = (struct async_iorequest *) xmalloc(sizeof(struct async_iorequest)); + if (!iorq->next) + return False; iorq->next->fd = 0; iorq->next->next = NULL; } @@ -388,6 +392,11 @@ rdpdr_process_irp(STREAM s) if (rw_blocking) // Complete read immediately { buffer = (uint8 *) xrealloc((void *) buffer, length); + if (!buffer) + { + status = STATUS_CANCELLED; + break; + } status = fns->read(file, buffer, length, offset, &result); buffer_len = result; break; @@ -395,6 +404,11 @@ rdpdr_process_irp(STREAM s) // Add request to table pst_buf = (uint8 *) xmalloc(length); + if (!pst_buf) + { + status = STATUS_CANCELLED; + break; + } serial_get_timeout(file, length, &total_timeout, &interval_timeout); if (add_async_iorequest (device, file, id, major, length, fns, total_timeout, interval_timeout, @@ -430,6 +444,12 @@ rdpdr_process_irp(STREAM s) // Add to table pst_buf = (uint8 *) xmalloc(length); + if (!pst_buf) + { + status = STATUS_CANCELLED; + break; + } + in_uint8a(s, pst_buf, length); if (add_async_iorequest @@ -553,6 +573,12 @@ rdpdr_process_irp(STREAM s) in_uint8s(s, 0x14); buffer = (uint8 *) xrealloc((void *) buffer, bytes_out + 0x14); + if (!buffer) + { + status = STATUS_CANCELLED; + break; + } + out.data = out.p = buffer; out.size = sizeof(buffer); status = fns->device_control(file, request, s, &out); @@ -568,8 +594,9 @@ rdpdr_process_irp(STREAM s) { rdpdr_send_completion(device, id, status, result, buffer, buffer_len); } - xfree(buffer); - + if (buffer) + xfree(buffer); + buffer = NULL; } void