diff options
author | Adrian Lees <adrian@aemulor.com> | 2005-09-01 20:29:59 +0000 |
---|---|---|
committer | Adrian Lees <adrian@aemulor.com> | 2005-09-01 20:29:59 +0000 |
commit | 4a372d76d1567be0c89efeeb7de58dbf741fdcd2 (patch) | |
tree | ec8d687666d0b347022576e5d9cf8d844b884a38 | |
parent | d66f9c2fbd371c44239c3de84b1207cdf85e8b5f (diff) | |
download | netsurf-4a372d76d1567be0c89efeeb7de58dbf741fdcd2.tar.gz netsurf-4a372d76d1567be0c89efeeb7de58dbf741fdcd2.tar.bz2 |
[project @ 2005-09-01 20:29:59 by adrianl]
Tolerate incorrectly terminated and unterminated data xfer filenames
svn path=/import/netsurf/; revision=1860
-rw-r--r-- | riscos/gui.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/riscos/gui.c b/riscos/gui.c index 7cf4d35df..1d1845f03 100644 --- a/riscos/gui.c +++ b/riscos/gui.c @@ -218,6 +218,7 @@ static char *ro_gui_uri_file_parse(const char *file_name, char **uri_title); static bool ro_gui_uri_file_parse_line(FILE *fp, char *b); static char *ro_gui_url_file_parse(const char *file_name); static char *ro_gui_ieurl_file_parse(const char *file_name); +static void ro_msg_terminate_filename(wimp_full_message_data_xfer *message); static void ro_msg_datasave(wimp_message *message); static void ro_msg_datasave_ack(wimp_message *message); static void ro_msg_dataopen(wimp_message *block); @@ -1218,6 +1219,8 @@ void ro_gui_user_message(wimp_event_no event, wimp_message *message) break; case message_DATA_LOAD: + ro_msg_terminate_filename((wimp_full_message_data_xfer*)message); + if (event == wimp_USER_MESSAGE_ACKNOWLEDGE) { #ifdef WITH_PRINT if (print_current_window) @@ -1354,6 +1357,26 @@ void ro_gui_user_message(wimp_event_no event, wimp_message *message) /** + * Ensure that the filename in a data transfer message is NUL terminated + * (some applications, especially BASIC programs use CR) + * + * \param message message to be corrected + */ + +void ro_msg_terminate_filename(wimp_full_message_data_xfer *message) +{ + const char *ep = (char*)message + message->size; + char *p = message->file_name; + + if ((size_t)message->size >= sizeof(*message)) + ep = (char*)message + sizeof(*message) - 1; + + while (p < ep && *p >= ' ') p++; + *p = '\0'; +} + + +/** * Handle Message_DataLoad (file dragged in). */ @@ -1679,6 +1702,8 @@ void ro_msg_datasave(wimp_message *message) { wimp_full_message_data_xfer *dataxfer = (wimp_full_message_data_xfer*)message; + ro_msg_terminate_filename(dataxfer); + switch (dataxfer->file_type) { case FILETYPE_ACORN_URI: case FILETYPE_ANT_URL: @@ -1718,6 +1743,8 @@ void ro_msg_datasave(wimp_message *message) void ro_msg_datasave_ack(wimp_message *message) { + ro_msg_terminate_filename((wimp_full_message_data_xfer*)message); + #ifdef WITH_PRINT if (print_ack(message)) return; |