From d878dbc132948f481e9a4c63bf5dbebdc9d07776 Mon Sep 17 00:00:00 2001 From: Themis Demetriades Date: Tue, 12 Nov 2024 16:22:32 +0000 Subject: [PATCH] Fix bug in userprog-merge where file writes were denied in the wrong thread --- src/threads/synch.c | 1 + src/userprog/process.c | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/threads/synch.c b/src/threads/synch.c index c8bbd6d..5ac1e51 100644 --- a/src/threads/synch.c +++ b/src/threads/synch.c @@ -260,6 +260,7 @@ lock_acquire (struct lock *lock) ASSERT (!lock_held_by_current_thread (lock)); struct thread *t = thread_current (); + ASSERT (t->waiting_lock == NULL); enum intr_level old_level = intr_disable (); if (lock->holder != NULL) diff --git a/src/userprog/process.c b/src/userprog/process.c index 20f2f3c..4d0c1ca 100644 --- a/src/userprog/process.c +++ b/src/userprog/process.c @@ -126,9 +126,16 @@ start_process (void *proc_start_data) if_.gs = if_.fs = if_.es = if_.ds = if_.ss = SEL_UDSEG; if_.cs = SEL_UCSEG; if_.eflags = FLAG_IF | FLAG_MBS; - + lock_acquire (&filesys_lock); + + /* Prevent writing to the file being executed. */ + struct file *exec_file = filesys_open (data->file_name); + thread_current ()->exec_file = exec_file; + file_deny_write(exec_file); + success = load (data->file_name, &if_.eip, &if_.esp); + lock_release (&filesys_lock); /* If load failed, quit. */