On 10/17/2018 12:46 PM, Heinrich Schuchardt wrote:
> On 10/17/2018 09:32 AM, AKASHI Takahiro wrote:
>> Factor out efi_set_bootdev() and extract efi_dp_from_name().
>> This function will be used to set a boot device in efishell command.
>>
>> Signed-off-by: AKASHI Takahiro <takahiro.aka...@linaro.org>
>> ---
>>  cmd/bootefi.c                    | 42 ++++++----------------------
>>  include/efi_loader.h             |  4 +++
>>  lib/efi_loader/efi_device_path.c | 47 ++++++++++++++++++++++++++++++++
>>  3 files changed, 59 insertions(+), 34 deletions(-)
>>
>> diff --git a/cmd/bootefi.c b/cmd/bootefi.c
>> index 99f5b2b95706..b3e2845120fe 100644
>> --- a/cmd/bootefi.c
>> +++ b/cmd/bootefi.c
>> @@ -647,45 +647,19 @@ U_BOOT_CMD(
>>  
>>  void efi_set_bootdev(const char *dev, const char *devnr, const char *path)
>>  {
>> -    char filename[32] = { 0 }; /* dp->str is u16[32] long */
>> -    char *s;
>> +    struct efi_device_path *device, *image;
>> +    efi_status_t ret;
>>  
>>      /* efi_set_bootdev is typically called repeatedly, recover memory */
>>      efi_free_pool(bootefi_device_path);
>>      efi_free_pool(bootefi_image_path);
>> -    /* If blk_get_device_part_str fails, avoid duplicate free. */
>> -    bootefi_device_path = NULL;
>> -    bootefi_image_path = NULL;
>> -
>> -    if (strcmp(dev, "Net")) {
>> -            struct blk_desc *desc;
>> -            disk_partition_t fs_partition;
>> -            int part;
>> -
>> -            part = blk_get_device_part_str(dev, devnr, &desc, &fs_partition,
>> -                                           1);
>> -            if (part < 0)
>> -                    return;
>> -
>> -            bootefi_device_path = efi_dp_from_part(desc, part);
>> -    } else {
>> -#ifdef CONFIG_NET
>> -            bootefi_device_path = efi_dp_from_eth();
>> -#endif
>> -    }
>> -
>> -    if (!path)
>> -            return;
>>  
>> -    if (strcmp(dev, "Net")) {
>> -            /* Add leading / to fs paths, because they're absolute */
>> -            snprintf(filename, sizeof(filename), "/%s", path);
>> +    ret = efi_dp_from_name(dev, devnr, path, &device, &image);
>> +    if (ret == EFI_SUCCESS) {
>> +            bootefi_device_path = device;
>> +            bootefi_image_path = image;
>>      } else {
>> -            snprintf(filename, sizeof(filename), "%s", path);
>> +            bootefi_device_path = NULL;
>> +            bootefi_image_path = NULL;
>>      }
>> -    /* DOS style file path: */
>> -    s = filename;
>> -    while ((s = strchr(s, '/')))
>> -            *s++ = '\\';
>> -    bootefi_image_path = efi_dp_from_file(NULL, 0, filename);
>>  }
>> diff --git a/include/efi_loader.h b/include/efi_loader.h
>> index 74df070316a0..b73fbb6de23f 100644
>> --- a/include/efi_loader.h
>> +++ b/include/efi_loader.h
>> @@ -425,6 +425,10 @@ const struct efi_device_path *efi_dp_last_node(
>>  efi_status_t efi_dp_split_file_path(struct efi_device_path *full_path,
>>                                  struct efi_device_path **device_path,
>>                                  struct efi_device_path **file_path);
>> +efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
>> +                          const char *path,
>> +                          struct efi_device_path **device,
>> +                          struct efi_device_path **file);
>>  
>>  #define EFI_DP_TYPE(_dp, _type, _subtype) \
>>      (((_dp)->type == DEVICE_PATH_TYPE_##_type) && \
>> diff --git a/lib/efi_loader/efi_device_path.c 
>> b/lib/efi_loader/efi_device_path.c
>> index 5a61a1c1dcf9..3af444147283 100644
>> --- a/lib/efi_loader/efi_device_path.c
>> +++ b/lib/efi_loader/efi_device_path.c
>> @@ -942,3 +942,50 @@ efi_status_t efi_dp_split_file_path(struct 
>> efi_device_path *full_path,
>>      *file_path = fp;
>>      return EFI_SUCCESS;
>>  }
>> +
>> +efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
>> +                          const char *path,
>> +                          struct efi_device_path **device,
>> +                          struct efi_device_path **file)
>> +{
>> +    int is_net;
>> +    struct blk_desc *desc = NULL;
>> +    disk_partition_t fs_partition;
>> +    int part = 0;
>> +    char filename[32] = { 0 }; /* dp->str is u16[32] long */
>> +    char *s;
>> +
>> +    if (!device || (path && !file))
>> +            return EFI_INVALID_PARAMETER;
>> +
>> +    is_net = !strcmp(dev, "Net");
>> +    if (!is_net) {
>> +            part = blk_get_device_part_str(dev, devnr, &desc, &fs_partition,
>> +                                           1);
>> +            if (part < 0)
>> +                    return EFI_INVALID_PARAMETER;
>> +
>> +            *device = efi_dp_from_part(desc, part);
>> +    } else {
>> +#ifdef CONFIG_NET
>> +            *device = efi_dp_from_eth();
>> +#endif
>> +    }
>> +
>> +    if (!path)
>> +            return EFI_SUCCESS;
>> +
>> +    if (!is_net) {
>> +            /* Add leading / to fs paths, because they're absolute */
>> +            snprintf(filename, sizeof(filename), "/%s", path);
> 
> This coding creates undefined behavior. You have to use two different
> variables.

Sorry I must be blind.

Heinrich
> 
>> +    } else {
>> +            snprintf(filename, sizeof(filename), "%s", path);
> 
> Same here.
> 
> @Alex:
> Please, remove the patch from efi-next until it is fixed.
> 
> Best regards
> 
> Heinrich
> 
>> +    }
>> +    /* DOS style file path: */
>> +    s = filename;
>> +    while ((s = strchr(s, '/')))
>> +            *s++ = '\\';
>> +    *file = efi_dp_from_file(NULL, 0, filename);
>> +
>> +    return EFI_SUCCESS;
>> +}
>>
> 
> 

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to