summaryrefslogtreecommitdiff
path: root/riscos/window.c
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2006-01-22 17:25:30 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2006-01-22 17:25:30 +0000
commit15a14599dbc321fbcdd4c865e22c27280676427d (patch)
tree10693bd489de55c2a910054fc07814e1ab914087 /riscos/window.c
parent0a3489c9c26c0b6dae1a682c0dcd346072693d6b (diff)
downloadnetsurf-15a14599dbc321fbcdd4c865e22c27280676427d.tar.gz
netsurf-15a14599dbc321fbcdd4c865e22c27280676427d.tar.bz2
[project @ 2006-01-22 17:25:30 by jmb]
Convert local files to UTF-8 when dragged in (assumes they're encoded in the system local encoding). Fix potential buffer overflow in utf8_from_local_encoding svn path=/import/netsurf/; revision=2025
Diffstat (limited to 'riscos/window.c')
-rw-r--r--riscos/window.c39
1 files changed, 32 insertions, 7 deletions
diff --git a/riscos/window.c b/riscos/window.c
index c25b6c909..b8ca42456 100644
--- a/riscos/window.c
+++ b/riscos/window.c
@@ -1437,9 +1437,9 @@ bool ro_gui_status_click(wimp_pointer *pointer)
struct gui_window *g = ro_gui_status_lookup(pointer->w);
wimp_drag drag;
os_error *error;
-
+
assert(g);
-
+
switch (pointer->i) {
case ICON_STATUS_RESIZE:
gui_current_drag_type = GUI_DRAG_STATUS_RESIZE;
@@ -2209,11 +2209,23 @@ bool ro_gui_window_dataload(struct gui_window *g, wimp_message *message)
return false;
if (file_box) {
+ utf8_convert_ret ret;
+ char *utf8_fn;
+
+ ret = utf8_from_local_encoding(
+ message->data.data_xfer.file_name, 0,
+ &utf8_fn);
+ if (ret != UTF8_CONVERT_OK) {
+ /* A bad encoding should never happen */
+ assert(ret != UTF8_CONVERT_BADENC);
+ LOG(("utf8_from_local_encoding failed"));
+ /* Load was for us - just no memory */
+ return true;
+ }
/* Found: update form input. */
free(file_box->gadget->value);
- file_box->gadget->value =
- strdup(message->data.data_xfer.file_name);
+ file_box->gadget->value = utf8_fn;
/* Redraw box. */
box_coords(file_box, &x, &y);
@@ -2754,8 +2766,9 @@ bool ro_gui_window_import_text(struct gui_window *g, const char *filename,
{
fileswitch_object_type obj_type;
os_error *error;
- char *buf;
+ char *buf, *utf8_buf;
int size;
+ utf8_convert_ret ret;
error = xosfile_read_stamped(filename, &obj_type, NULL, NULL,
&size, NULL, NULL);
@@ -2782,10 +2795,20 @@ bool ro_gui_window_import_text(struct gui_window *g, const char *filename,
return true;
}
+ ret = utf8_from_local_encoding(buf, size + 1, &utf8_buf);
+ if (ret != UTF8_CONVERT_OK) {
+ /* bad encoding shouldn't happen */
+ assert(ret != UTF8_CONVERT_BADENC);
+ LOG(("utf8_from_local_encoding failed"));
+ free(buf);
+ warn_user("NoMemory", NULL);
+ return true;
+ }
+
if (toolbar) {
const char *ep = buf + size;
const char *sp;
- char *p = buf;
+ char *p = utf8_buf;
/* skip leading whitespace */
while (p < ep && isspace(*p)) p++;
@@ -2801,8 +2824,10 @@ bool ro_gui_window_import_text(struct gui_window *g, const char *filename,
ro_gui_window_launch_url(g, sp);
}
else
- browser_window_paste_text(g->bw, buf, size, true);
+ browser_window_paste_text(g->bw, utf8_buf,
+ strlen(utf8_buf), true);
free(buf);
+ free(utf8_buf);
return true;
}