mirror of
				https://git.proxmox.com/git/grub2
				synced 2025-10-31 17:40:15 +00:00 
			
		
		
		
	 004a2b1efd
			
		
	
	
		004a2b1efd
		
	
	
	
	
		
			
			The EFI version of grub_machine_get_bootlocation crops the boot image name back to the last / in order to get a directory path. However, it does not check that *name is actually set before calling grub_strrchr to do this, and neither does grub_strrchr before dereferencing a NULL pointer. Parent function, grub_set_prefix_and_root, does check the pointer before using.
		
			
				
	
	
		
			81 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* init.c - generic EFI initialization and finalization */
 | |
| /*
 | |
|  *  GRUB  --  GRand Unified Bootloader
 | |
|  *  Copyright (C) 2006,2007  Free Software Foundation, Inc.
 | |
|  *
 | |
|  *  GRUB is free software: you can redistribute it and/or modify
 | |
|  *  it under the terms of the GNU General Public License as published by
 | |
|  *  the Free Software Foundation, either version 3 of the License, or
 | |
|  *  (at your option) any later version.
 | |
|  *
 | |
|  *  GRUB is distributed in the hope that it will be useful,
 | |
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  *  GNU General Public License for more details.
 | |
|  *
 | |
|  *  You should have received a copy of the GNU General Public License
 | |
|  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| 
 | |
| #include <grub/efi/efi.h>
 | |
| #include <grub/efi/console.h>
 | |
| #include <grub/efi/disk.h>
 | |
| #include <grub/term.h>
 | |
| #include <grub/misc.h>
 | |
| #include <grub/env.h>
 | |
| #include <grub/mm.h>
 | |
| #include <grub/kernel.h>
 | |
| 
 | |
| grub_addr_t grub_modbase;
 | |
| 
 | |
| void
 | |
| grub_efi_init (void)
 | |
| {
 | |
|   grub_modbase = grub_efi_modules_addr ();
 | |
|   /* First of all, initialize the console so that GRUB can display
 | |
|      messages.  */
 | |
|   grub_console_init ();
 | |
| 
 | |
|   /* Initialize the memory management system.  */
 | |
|   grub_efi_mm_init ();
 | |
| 
 | |
|   efi_call_4 (grub_efi_system_table->boot_services->set_watchdog_timer,
 | |
| 	      0, 0, 0, NULL);
 | |
| 
 | |
|   grub_efidisk_init ();
 | |
| }
 | |
| 
 | |
| void (*grub_efi_net_config) (grub_efi_handle_t hnd, 
 | |
| 			     char **device,
 | |
| 			     char **path);
 | |
| 
 | |
| void
 | |
| grub_machine_get_bootlocation (char **device, char **path)
 | |
| {
 | |
|   grub_efi_loaded_image_t *image = NULL;
 | |
|   char *p;
 | |
| 
 | |
|   image = grub_efi_get_loaded_image (grub_efi_image_handle);
 | |
|   if (!image)
 | |
|     return;
 | |
|   *device = grub_efidisk_get_device_name (image->device_handle);
 | |
|   *path = grub_efi_get_filename (image->file_path);
 | |
|   if (!*device && grub_efi_net_config)
 | |
|     grub_efi_net_config (image->device_handle, device, path);
 | |
| 
 | |
|   if (*path)
 | |
|     {
 | |
|       /* Get the directory.  */
 | |
|       p = grub_strrchr (*path, '/');
 | |
|       if (p)
 | |
|         *p = '\0';
 | |
|     }
 | |
| }
 | |
| 
 | |
| void
 | |
| grub_efi_fini (void)
 | |
| {
 | |
|   grub_efidisk_fini ();
 | |
|   grub_console_fini ();
 | |
| }
 |