aboutsummaryrefslogtreecommitdiffstats
path: root/extras
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-10-14 08:55:43 +0100
committerKeir Fraser <keir.fraser@citrix.com>2009-10-14 08:55:43 +0100
commit17af1d38f3932511dd74e0e301aabf5f7a38bc0c (patch)
tree4406b4f0a95fe4895390c90f2efbadc48a6ff5b4 /extras
parentfda49f9b3fbb29f2ed9e143bb77d74e76cede6a2 (diff)
downloadxen-17af1d38f3932511dd74e0e301aabf5f7a38bc0c.tar.gz
xen-17af1d38f3932511dd74e0e301aabf5f7a38bc0c.tar.bz2
xen-17af1d38f3932511dd74e0e301aabf5f7a38bc0c.zip
minios: fix minios console
MiniOS' console_print tries to expand '\n' into "\n\r" in place, causing page faults if the string resides in text. Use a duplicate of the string instead. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Diffstat (limited to 'extras')
-rw-r--r--extras/mini-os/console/console.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/extras/mini-os/console/console.c b/extras/mini-os/console/console.c
index 1bd0405f4a..94cc9deb73 100644
--- a/extras/mini-os/console/console.c
+++ b/extras/mini-os/console/console.c
@@ -79,6 +79,8 @@ void xencons_tx(void)
void console_print(struct consfront_dev *dev, char *data, int length)
{
char *curr_char, saved_char;
+ char copied_str[length];
+ char *copied_ptr;
int part_len;
int (*ring_send_fn)(struct consfront_dev *dev, const char *data, unsigned length);
@@ -86,24 +88,26 @@ void console_print(struct consfront_dev *dev, char *data, int length)
ring_send_fn = xencons_ring_send_no_notify;
else
ring_send_fn = xencons_ring_send;
-
- for(curr_char = data; curr_char < data+length-1; curr_char++)
+
+ copied_ptr = copied_str;
+ memcpy(copied_ptr, data, length);
+ for(curr_char = copied_ptr; curr_char < copied_ptr+length-1; curr_char++)
{
if(*curr_char == '\n')
{
saved_char = *(curr_char+1);
*(curr_char+1) = '\r';
- part_len = curr_char - data + 2;
- ring_send_fn(dev, data, part_len);
+ part_len = curr_char - copied_ptr + 2;
+ ring_send_fn(dev, copied_ptr, part_len);
*(curr_char+1) = saved_char;
- data = curr_char+1;
+ copied_ptr = curr_char+1;
length -= part_len - 1;
}
}
- ring_send_fn(dev, data, length);
+ ring_send_fn(dev, copied_ptr, length);
- if(data[length-1] == '\n')
+ if(copied_ptr[length-1] == '\n')
ring_send_fn(dev, "\r", 1);
}