script: Avoid a use-after-free when redefining a function during execution

Defining a new function with the same name as a previously defined
function causes the grub_script and associated resources for the
previous function to be freed. If the previous function is currently
executing when a function with the same name is defined, this results
in use-after-frees when processing subsequent commands in the original
function.

Instead, reject a new function definition if it has the same name as
a previously defined function, and that function is currently being
executed. Although a behavioural change, this should be backwards
compatible with existing configurations because they can't be
dependent on the current behaviour without being broken.

Fixes: CVE-2020-15706

Signed-off-by: Chris Coulson <chris.coulson@canonical.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Chris Coulson 2020-07-10 14:41:45 +01:00 committed by Daniel Kiper
parent 1a8d9c9b4a
commit 426f57383d
4 changed files with 19 additions and 4 deletions

View file

@ -361,6 +361,8 @@ struct grub_script_function
/* The next element. */
struct grub_script_function *next;
unsigned executing;
};
typedef struct grub_script_function *grub_script_function_t;