summaryrefslogtreecommitdiff
path: root/kern/hvcall.c
diff options
context:
space:
mode:
authorHanjie Wu <hanjiew@andrew.cmu.edu>2023-04-24 03:51:54 -0400
committerHanjie Wu <hanjiew@andrew.cmu.edu>2023-04-24 03:55:02 -0400
commit6b13d5d9b1ff1cb38bb50e918e51a241a225f8da (patch)
tree90e8e5da37402975d769184aeb4b51fa13b610f3 /kern/hvcall.c
parente021b8f12ad129c0bdbda3111bb93a170e21ae41 (diff)
timer
Diffstat (limited to 'kern/hvcall.c')
-rw-r--r--kern/hvcall.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/kern/hvcall.c b/kern/hvcall.c
index c57b668..d387771 100644
--- a/kern/hvcall.c
+++ b/kern/hvcall.c
@@ -316,6 +316,7 @@ static pv_pd_t* translate_pv_pd(pv_t* pv, pa_t pd, int wp) {
}
pt_pa += pv->mem_base;
page_table_t* pt = (page_table_t*)map_phys_page(pt_pa, NULL);
+ int old_pde_us = (old_pde & (1 << PTE_US_SHIFT));
int j;
for (j = 0; j < NUM_PAGE_ENTRY; j++) {
pte_t old_pte = (*pt)[j];
@@ -340,7 +341,7 @@ static pv_pd_t* translate_pv_pd(pv_t* pv, pa_t pd, int wp) {
new_mask =
((1 << PTE_P_SHIFT) | old_rw | (PTE_USER << PTE_US_SHIFT));
}
- if (old_us != 0) {
+ if ((old_us & old_pde_us) != 0) {
new_user_mask =
((1 << PTE_P_SHIFT) | old_rw | (PTE_USER << PTE_US_SHIFT));
} else {
@@ -543,7 +544,7 @@ static void hvcall_print(stack_frame_t* f) {
if (copy_from_user(esp, sizeof(int), &len) != 0) {
goto read_arg_fail;
}
- if (len < 0) {
+ if (len < 0 || len > HV_PRINT_MAX) {
goto bad_length;
}
if (copy_from_user(esp + sizeof(va_t), sizeof(va_t), &base) != 0) {
@@ -659,6 +660,9 @@ static void hvcall_print_at(stack_frame_t* f) {
if (copy_from_user(esp + 4 * sizeof(va_t), sizeof(int), &color) != 0) {
goto read_arg_fail;
}
+ if (len < 0 || len > HV_PRINT_MAX) {
+ goto bad_length;
+ }
pts_t* pts = get_current()->pts;
mutex_lock(&pts->lock);
int result = pts_print_at(pts, len, base, row, col, color);
@@ -670,6 +674,8 @@ static void hvcall_print_at(stack_frame_t* f) {
print_fail:
pv_die("Bad argument");
+bad_length:
+ pv_die("Bad buffer length");
read_arg_fail:
pv_die("Bad argument address");
}