Commit f0319748 authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

s390/sclp: always stay within bounds of the early sccb

Make sure the _sclp_print_lm function stays within bounds of the early
sccb, even if the passed string is very long.  If the string is too
long, the remaining characters will be dropped.
Suggested-by: default avatarPeter Oberparleiter <oberpar@linux.vnet.ibm.com>
Reviewed-by: default avatarPeter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 742dc577
...@@ -132,16 +132,21 @@ static void _sclp_print_lm(const char *str) ...@@ -132,16 +132,21 @@ static void _sclp_print_lm(const char *str)
0x10, 0x00, /* 4 */ 0x10, 0x00, /* 4 */
0x00, 0x00, 0x00, 0x00 /* 6 */ 0x00, 0x00, 0x00, 0x00 /* 6 */
}; };
unsigned char *ptr, ch; unsigned char *ptr, *end_ptr, ch;
unsigned int count; unsigned int count;
memcpy(_sclp_work_area, write_head, sizeof(write_head)); memcpy(_sclp_work_area, write_head, sizeof(write_head));
ptr = _sclp_work_area + sizeof(write_head); ptr = _sclp_work_area + sizeof(write_head);
end_ptr = _sclp_work_area + sizeof(_sclp_work_area) - 1;
do { do {
if (ptr + sizeof(write_mto) > end_ptr)
break;
memcpy(ptr, write_mto, sizeof(write_mto)); memcpy(ptr, write_mto, sizeof(write_mto));
for (count = sizeof(write_mto); (ch = *str++) != 0; count++) { for (count = sizeof(write_mto); (ch = *str++) != 0; count++) {
if (ch == 0x0a) if (ch == 0x0a)
break; break;
if (ptr > end_ptr)
break;
ptr[count] = _ascebc[ch]; ptr[count] = _ascebc[ch];
} }
/* Update length fields in mto, mdb, evbuf and sccb */ /* Update length fields in mto, mdb, evbuf and sccb */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment