It's good to me!

Reviewed-By: Wu Jiaxin <jiaxin...@intel.com>

Best Regards!
Jiaxin

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of
> Nagaraj Hegde
> Sent: Thursday, May 5, 2016 2:59 PM
> To: edk2-devel@lists.01.org
> Cc: Ye, Ting <ting...@intel.com>; Fu, Siyuan <siyuan...@intel.com>; Wu,
> Jiaxin <jiaxin...@intel.com>
> Subject: [edk2] [PATCH v2 1/1] MdeModulePkg:DxeHttpLib: Add checks in
> HttpGenRequestMessage API
> 
> v2:
> More input validation based on Request and HeaderCount.
> 
> HttpGenRequestMessage assumes that HTTP message would always contain
> a request-line, headers and an optional message body.
> However, subsequent to a HTTP PUT/POST request, HTTP requests would
> contain just the message body. This patch supports creation of such request
> messages with additional checks.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Hegde, Nagaraj P nagaraj-p.he...@hpe.com
> ---
>  MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c | 225 +++++++++++-------
> --
>  1 file changed, 130 insertions(+), 95 deletions(-)
> 
> diff --git a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
> b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
> index 8d61d0b..1b0858c 100644
> --- a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
> +++ b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
> @@ -1681,61 +1681,92 @@ HttpGenRequestMessage (
>    HttpUtilitiesProtocol = NULL;
> 
>    //
> -  // Locate the HTTP_UTILITIES protocol.
> +  // 1. If we have a Request, we cannot have a NULL Url  // 2. If we
> + have a Request, HeaderCount can not be non-zero  // 3. If we do not
> + have a Request, HeaderCount should be zero  // 4. If we do not have
> + Request and Headers, we need at least a message-body
>    //
> -  Status = gBS->LocateProtocol (
> -                  &gEfiHttpUtilitiesProtocolGuid,
> -                  NULL,
> -                  (VOID **)&HttpUtilitiesProtocol
> -                  );
> -
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR,"Failed to locate Http Utilities protocol. Status
> = %r.\n", Status));
> -    return Status;
> +  if ((Message->Data.Request != NULL && Url == NULL) ||
> +      (Message->Data.Request != NULL && Message->HeaderCount == 0) ||
> +      (Message->Data.Request == NULL && Message->HeaderCount != 0) ||
> +      (Message->Data.Request == NULL && Message->HeaderCount == 0 &&
> Message->BodyLength == 0)) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  if (Message->HeaderCount != 0) {
> +    //
> +    // Locate the HTTP_UTILITIES protocol.
> +    //
> +    Status = gBS->LocateProtocol (
> +                    &gEfiHttpUtilitiesProtocolGuid,
> +                    NULL,
> +                    (VOID **)&HttpUtilitiesProtocol
> +                    );
> +
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR,"Failed to locate Http Utilities protocol. Status
> = %r.\n", Status));
> +      return Status;
> +    }
> +
> +    //
> +    // Build AppendList to send into HttpUtilitiesBuild
> +    //
> +    AppendList = AllocateZeroPool (sizeof (EFI_HTTP_HEADER *) * (Message-
> >HeaderCount));
> +    if (AppendList == NULL) {
> +      return EFI_OUT_OF_RESOURCES;
> +    }
> +
> +    for(Index = 0; Index < Message->HeaderCount; Index++){
> +      AppendList[Index] = &Message->Headers[Index];
> +    }
> +
> +    //
> +    // Build raw HTTP Headers
> +    //
> +    Status = HttpUtilitiesProtocol->Build (
> +                HttpUtilitiesProtocol,
> +                0,
> +                NULL,
> +                0,
> +                NULL,
> +                Message->HeaderCount,
> +                AppendList,
> +                &HttpHdrSize,
> +                &HttpHdr
> +                );
> +
> +    if (AppendList != NULL) {
> +      FreePool (AppendList);
> +    }
> +
> +    if (EFI_ERROR (Status) || HttpHdr == NULL){
> +      return Status;
> +    }
>    }
> 
>    //
> -  // Build AppendList to send into HttpUtilitiesBuild
> +  // If we have headers to be sent, account for it.
>    //
> -  AppendList = AllocateZeroPool (sizeof (EFI_HTTP_HEADER *) * (Message-
> >HeaderCount));
> -  if (AppendList == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  for(Index = 0; Index < Message->HeaderCount; Index++){
> -    AppendList[Index] = &Message->Headers[Index];
> +  if (Message->HeaderCount != 0) {
> +    MsgSize = HttpHdrSize;
>    }
> 
>    //
> -  // Build raw HTTP Headers
> +  // If we have a request line, account for the fields.
>    //
> -  Status = HttpUtilitiesProtocol->Build (
> -              HttpUtilitiesProtocol,
> -              0,
> -              NULL,
> -              0,
> -              NULL,
> -              Message->HeaderCount,
> -              AppendList,
> -              &HttpHdrSize,
> -              &HttpHdr
> -              );
> -
> -  if (AppendList != NULL) {
> -    FreePool (AppendList);
> -  }
> -
> -  if (EFI_ERROR (Status) || HttpHdr == NULL){
> -    return Status;
> +  if (Message->Data.Request != NULL) {
> +    MsgSize += HTTP_METHOD_MAXIMUM_LEN + AsciiStrLen
> + (HTTP_VERSION_CRLF_STR) + AsciiStrLen (Url);
>    }
> 
> +
>    //
> -  // Calculate HTTP message length.
> +  // If we have a message body to be sent, account for it.
>    //
> -  MsgSize = Message->BodyLength + HTTP_METHOD_MAXIMUM_LEN +
> AsciiStrLen (Url) +
> -            AsciiStrLen (HTTP_VERSION_CRLF_STR) + HttpHdrSize;
> -
> +  MsgSize += Message->BodyLength;
> 
> +  //
> +  // memory for the string that needs to be sent to TCP  //
>    *RequestMsg = AllocateZeroPool (MsgSize);
>    if (*RequestMsg == NULL) {
>      Status = EFI_OUT_OF_RESOURCES;
> @@ -1746,60 +1777,64 @@ HttpGenRequestMessage (
>    //
>    // Construct header request
>    //
> -  switch (Message->Data.Request->Method) {
> -  case HttpMethodGet:
> -    StrLength = sizeof (HTTP_METHOD_GET) - 1;
> -    CopyMem (RequestPtr, HTTP_METHOD_GET, StrLength);
> -    RequestPtr += StrLength;
> -    break;
> -  case HttpMethodPut:
> -    StrLength = sizeof (HTTP_METHOD_PUT) - 1;
> -    CopyMem (RequestPtr, HTTP_METHOD_PUT, StrLength);
> -    RequestPtr += StrLength;
> -    break;
> -  case HttpMethodPatch:
> -    StrLength = sizeof (HTTP_METHOD_PATCH) - 1;
> -    CopyMem (RequestPtr, HTTP_METHOD_PATCH, StrLength);
> -    RequestPtr += StrLength;
> -    break;
> -  case HttpMethodPost:
> -    StrLength = sizeof (HTTP_METHOD_POST) - 1;
> -    CopyMem (RequestPtr, HTTP_METHOD_POST, StrLength);
> -    RequestPtr += StrLength;
> -    break;
> -  case HttpMethodHead:
> -    StrLength = sizeof (HTTP_METHOD_HEAD) - 1;
> -    CopyMem (RequestPtr, HTTP_METHOD_HEAD, StrLength);
> -    RequestPtr += StrLength;
> -    break;
> -  case HttpMethodDelete:
> -    StrLength = sizeof (HTTP_METHOD_DELETE) - 1;
> -    CopyMem (RequestPtr, HTTP_METHOD_DELETE, StrLength);
> -    RequestPtr += StrLength;
> -    break;
> -  default:
> -    ASSERT (FALSE);
> -    Status = EFI_INVALID_PARAMETER;
> -    goto Exit;
> -  }
> -
> -  StrLength = AsciiStrLen(EMPTY_SPACE);
> -  CopyMem (RequestPtr, EMPTY_SPACE, StrLength);
> -  RequestPtr += StrLength;
> -
> -  StrLength = AsciiStrLen (Url);
> -  CopyMem (RequestPtr, Url, StrLength);
> -  RequestPtr += StrLength;
> -
> -  StrLength = sizeof (HTTP_VERSION_CRLF_STR) - 1;
> -  CopyMem (RequestPtr, HTTP_VERSION_CRLF_STR, StrLength);
> -  RequestPtr += StrLength;
> -
> -  //
> -  // Construct header
> -  //
> -  CopyMem (RequestPtr, HttpHdr, HttpHdrSize);
> -  RequestPtr += HttpHdrSize;
> +  if (Message->Data.Request != NULL) {
> +    switch (Message->Data.Request->Method) {
> +    case HttpMethodGet:
> +      StrLength = sizeof (HTTP_METHOD_GET) - 1;
> +      CopyMem (RequestPtr, HTTP_METHOD_GET, StrLength);
> +      RequestPtr += StrLength;
> +      break;
> +    case HttpMethodPut:
> +      StrLength = sizeof (HTTP_METHOD_PUT) - 1;
> +      CopyMem (RequestPtr, HTTP_METHOD_PUT, StrLength);
> +      RequestPtr += StrLength;
> +      break;
> +    case HttpMethodPatch:
> +      StrLength = sizeof (HTTP_METHOD_PATCH) - 1;
> +      CopyMem (RequestPtr, HTTP_METHOD_PATCH, StrLength);
> +      RequestPtr += StrLength;
> +      break;
> +    case HttpMethodPost:
> +      StrLength = sizeof (HTTP_METHOD_POST) - 1;
> +      CopyMem (RequestPtr, HTTP_METHOD_POST, StrLength);
> +      RequestPtr += StrLength;
> +      break;
> +    case HttpMethodHead:
> +      StrLength = sizeof (HTTP_METHOD_HEAD) - 1;
> +      CopyMem (RequestPtr, HTTP_METHOD_HEAD, StrLength);
> +      RequestPtr += StrLength;
> +      break;
> +    case HttpMethodDelete:
> +      StrLength = sizeof (HTTP_METHOD_DELETE) - 1;
> +      CopyMem (RequestPtr, HTTP_METHOD_DELETE, StrLength);
> +      RequestPtr += StrLength;
> +      break;
> +    default:
> +      ASSERT (FALSE);
> +      Status = EFI_INVALID_PARAMETER;
> +      goto Exit;
> +    }
> +
> +    StrLength = AsciiStrLen(EMPTY_SPACE);
> +    CopyMem (RequestPtr, EMPTY_SPACE, StrLength);
> +    RequestPtr += StrLength;
> +
> +    StrLength = AsciiStrLen (Url);
> +    CopyMem (RequestPtr, Url, StrLength);
> +    RequestPtr += StrLength;
> +
> +    StrLength = sizeof (HTTP_VERSION_CRLF_STR) - 1;
> +    CopyMem (RequestPtr, HTTP_VERSION_CRLF_STR, StrLength);
> +    RequestPtr += StrLength;
> +
> +    if (HttpHdr != NULL) {
> +      //
> +      // Construct header
> +      //
> +      CopyMem (RequestPtr, HttpHdr, HttpHdrSize);
> +      RequestPtr += HttpHdrSize;
> +    }
> +  }
> 
>    //
>    // Construct body
> --
> 2.6.2.windows.1
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to