From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.43; helo=mga05.intel.com; envelope-from=hao.a.wu@intel.com; receiver=edk2-devel@lists.01.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id AF1BD2116DA2B for ; Tue, 16 Oct 2018 00:23:54 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 16 Oct 2018 00:23:54 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,387,1534834800"; d="scan'208";a="97812154" Received: from shwdeopenpsi014.ccr.corp.intel.com ([10.239.9.9]) by fmsmga004.fm.intel.com with ESMTP; 16 Oct 2018 00:23:53 -0700 From: Hao Wu To: edk2-devel@lists.01.org Cc: Hao Wu , Paulo Alcantara , Ruiyu Ni , Star Zeng Date: Tue, 16 Oct 2018 15:23:38 +0800 Message-Id: <20181016072340.22068-9-hao.a.wu@intel.com> X-Mailer: git-send-email 2.12.0.windows.1 In-Reply-To: <20181016072340.22068-1-hao.a.wu@intel.com> References: <20181016072340.22068-1-hao.a.wu@intel.com> Subject: [PATCH v1 08/10] MdeModulePkg/UdfDxe: Update GetInfo() for FS VolumeLabel info request X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 16 Oct 2018 07:23:54 -0000 REF:https://bugzilla.tianocore.org/show_bug.cgi?id=1175 This commit will update the UdfGetInfo() function with the support of EFI_FILE_SYSTEM_VOLUME_LABEL data information request. Cc: Paulo Alcantara Cc: Ruiyu Ni Cc: Star Zeng Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Hao Wu --- MdeModulePkg/Universal/Disk/UdfDxe/File.c | 97 +++++++------------- MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c | 84 +++++++++++++++++ MdeModulePkg/Universal/Disk/UdfDxe/Udf.h | 27 ++++++ MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf | 1 + 4 files changed, 146 insertions(+), 63 deletions(-) diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/File.c b/MdeModulePkg/Universal/Disk/UdfDxe/File.c index 54c2400243..eb91e877ee 100644 --- a/MdeModulePkg/Universal/Disk/UdfDxe/File.c +++ b/MdeModulePkg/Universal/Disk/UdfDxe/File.c @@ -718,12 +718,6 @@ UdfSetPosition ( /** Get information about a file. - @attention This is boundary function that may receive untrusted input. - @attention The input is from FileSystem. - - The File Set Descriptor is external input, so this routine will do basic - validation for File Set Descriptor and report status. - @param This Protocol instance pointer. @param InformationType Type of information to return in Buffer. @param BufferSize On input size of buffer, on output amount of data in @@ -750,19 +744,16 @@ UdfGetInfo ( OUT VOID *Buffer ) { - EFI_STATUS Status; - PRIVATE_UDF_FILE_DATA *PrivFileData; - PRIVATE_UDF_SIMPLE_FS_DATA *PrivFsData; - EFI_FILE_SYSTEM_INFO *FileSystemInfo; - UINTN FileSystemInfoLength; - CHAR16 *String; - UDF_FILE_SET_DESCRIPTOR *FileSetDesc; - UINTN Index; - UINT8 *OstaCompressed; - UINT8 CompressionId; - UINT64 VolumeSize; - UINT64 FreeSpaceSize; - CHAR16 VolumeLabel[64]; + EFI_STATUS Status; + PRIVATE_UDF_FILE_DATA *PrivFileData; + PRIVATE_UDF_SIMPLE_FS_DATA *PrivFsData; + EFI_FILE_SYSTEM_INFO *FileSystemInfo; + UINTN FileSystemInfoLength; + UINT64 VolumeSize; + UINT64 FreeSpaceSize; + EFI_FILE_SYSTEM_VOLUME_LABEL *FileSystemVolumeLabel; + UINTN FileSystemVolumeLabelLength; + CHAR16 VolumeLabel[64]; if (This == NULL || InformationType == NULL || BufferSize == NULL || (*BufferSize != 0 && Buffer == NULL)) { @@ -784,50 +775,10 @@ UdfGetInfo ( Buffer ); } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { - String = VolumeLabel; - - FileSetDesc = &PrivFsData->Volume.FileSetDesc; - - OstaCompressed = &FileSetDesc->LogicalVolumeIdentifier[0]; - - CompressionId = OstaCompressed[0]; - if (!IS_VALID_COMPRESSION_ID (CompressionId)) { - return EFI_VOLUME_CORRUPTED; - } - - for (Index = 1; Index < 128; Index++) { - if (CompressionId == 16) { - *String = *(UINT8 *)(OstaCompressed + Index) << 8; - Index++; - } else { - if (Index > ARRAY_SIZE (VolumeLabel)) { - return EFI_VOLUME_CORRUPTED; - } - - *String = 0; - } - - if (Index < 128) { - *String |= (CHAR16)(*(UINT8 *)(OstaCompressed + Index)); - } - - // - // Unlike FID Identifiers, Logical Volume Identifier is stored in a - // NULL-terminated OSTA compressed format, so we must check for the NULL - // character. - // - if (*String == L'\0') { - break; - } - - String++; - } - - Index = ((UINTN)String - (UINTN)VolumeLabel) / sizeof (CHAR16); - if (Index > ARRAY_SIZE (VolumeLabel) - 1) { - Index = ARRAY_SIZE (VolumeLabel) - 1; + Status = GetVolumeLabel (&PrivFsData->Volume, ARRAY_SIZE (VolumeLabel), VolumeLabel); + if (EFI_ERROR (Status)) { + return Status; } - VolumeLabel[Index] = L'\0'; FileSystemInfoLength = StrSize (VolumeLabel) + sizeof (EFI_FILE_SYSTEM_INFO); @@ -839,7 +790,7 @@ UdfGetInfo ( FileSystemInfo = (EFI_FILE_SYSTEM_INFO *)Buffer; StrCpyS ( FileSystemInfo->VolumeLabel, - (*BufferSize - OFFSET_OF (EFI_FILE_SYSTEM_INFO, VolumeLabel)) / sizeof (CHAR16), + (*BufferSize - SIZE_OF_EFI_FILE_SYSTEM_INFO) / sizeof (CHAR16), VolumeLabel ); Status = GetVolumeSize ( @@ -862,6 +813,26 @@ UdfGetInfo ( *BufferSize = FileSystemInfoLength; Status = EFI_SUCCESS; + } else if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) { + Status = GetVolumeLabel (&PrivFsData->Volume, ARRAY_SIZE (VolumeLabel), VolumeLabel); + if (EFI_ERROR (Status)) { + return Status; + } + + FileSystemVolumeLabelLength = StrSize (VolumeLabel) + + sizeof (EFI_FILE_SYSTEM_VOLUME_LABEL); + if (*BufferSize < FileSystemVolumeLabelLength) { + *BufferSize = FileSystemVolumeLabelLength; + return EFI_BUFFER_TOO_SMALL; + } + + FileSystemVolumeLabel = (EFI_FILE_SYSTEM_VOLUME_LABEL *)Buffer; + StrCpyS ( + FileSystemVolumeLabel->VolumeLabel, + (*BufferSize - SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL) / sizeof (CHAR16), + VolumeLabel + ); + Status = EFI_SUCCESS; } return Status; diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c b/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c index ac6e0a8ff7..562a7d983c 100644 --- a/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c +++ b/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c @@ -2448,6 +2448,90 @@ SetFileInfo ( } /** + Get volume label of an UDF volume. + + @attention This is boundary function that may receive untrusted input. + @attention The input is from FileSystem. + + The File Set Descriptor is external input, so this routine will do basic + validation for File Set Descriptor and report status. + + @param[in] Volume Volume information pointer. + @param[in] CharMax The maximum number of Unicode char in String, + including terminating null char. + @param[out] String String buffer pointer to store the volume label. + + @retval EFI_SUCCESS Volume label is returned. + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. + @retval EFI_BUFFER_TOO_SMALL The string buffer String cannot hold the + volume label. + +**/ +EFI_STATUS +GetVolumeLabel ( + IN UDF_VOLUME_INFO *Volume, + IN UINTN CharMax, + OUT CHAR16 *String + ) +{ + UDF_FILE_SET_DESCRIPTOR *FileSetDesc; + UINTN Index; + UINT8 *OstaCompressed; + UINT8 CompressionId; + CHAR16 *StringBak; + + FileSetDesc = &Volume->FileSetDesc; + + OstaCompressed = &FileSetDesc->LogicalVolumeIdentifier[0]; + + CompressionId = OstaCompressed[0]; + if (!IS_VALID_COMPRESSION_ID (CompressionId)) { + return EFI_VOLUME_CORRUPTED; + } + + StringBak = String; + for (Index = 1; Index < 128; Index++) { + if (CompressionId == 16) { + if ((Index >> 1) > CharMax) { + return EFI_BUFFER_TOO_SMALL; + } + + *String = *(UINT8 *)(OstaCompressed + Index) << 8; + Index++; + } else { + if (Index > CharMax) { + return EFI_BUFFER_TOO_SMALL; + } + + *String = 0; + } + + if (Index < 128) { + *String |= (CHAR16)(*(UINT8 *)(OstaCompressed + Index)); + } + + // + // Unlike FID Identifiers, Logical Volume Identifier is stored in a + // NULL-terminated OSTA compressed format, so we must check for the NULL + // character. + // + if (*String == L'\0') { + break; + } + + String++; + } + + Index = ((UINTN)String - (UINTN)StringBak) / sizeof (CHAR16); + if (Index > CharMax - 1) { + Index = CharMax - 1; + } + StringBak[Index] = L'\0'; + + return EFI_SUCCESS; +} + +/** Get volume and free space size information of an UDF volume. @attention This is boundary function that may receive untrusted input. diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.h b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.h index 9c3f21fd05..7eeaa6192c 100644 --- a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.h +++ b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.h @@ -900,6 +900,33 @@ SetFileInfo ( ); /** + Get volume label of an UDF volume. + + @attention This is boundary function that may receive untrusted input. + @attention The input is from FileSystem. + + The File Set Descriptor is external input, so this routine will do basic + validation for File Set Descriptor and report status. + + @param[in] Volume Volume information pointer. + @param[in] CharMax The maximum number of Unicode char in String, + including terminating null char. + @param[out] String String buffer pointer to store the volume label. + + @retval EFI_SUCCESS Volume label is returned. + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. + @retval EFI_BUFFER_TOO_SMALL The string buffer String cannot hold the + volume label. + +**/ +EFI_STATUS +GetVolumeLabel ( + IN UDF_VOLUME_INFO *Volume, + IN UINTN CharMax, + OUT CHAR16 *String + ); + +/** Get volume and free space size information of an UDF volume. @attention This is boundary function that may receive untrusted input. diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf b/MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf index c8bfc880ed..4f435140e9 100644 --- a/MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf +++ b/MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf @@ -58,6 +58,7 @@ [Guids] gEfiFileInfoGuid ## SOMETIMES_CONSUMES ## Protocol gEfiFileSystemInfoGuid ## SOMETIMES_CONSUMES ## Protocol + gEfiFileSystemVolumeLabelInfoIdGuid ## SOMETIMES_CONSUMES ## Protocol [Protocols] -- 2.12.0.windows.1