diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-10-14 08:55:43 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-10-14 08:55:43 +0100 |
commit | 17af1d38f3932511dd74e0e301aabf5f7a38bc0c (patch) | |
tree | 4406b4f0a95fe4895390c90f2efbadc48a6ff5b4 /extras | |
parent | fda49f9b3fbb29f2ed9e143bb77d74e76cede6a2 (diff) | |
download | xen-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.c | 18 |
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); } |