]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg:DxeHttpLib: Add checks in HttpGenRequestMessage API
authorNagaraj Hegde <nagaraj-p.hegde@hpe.com>
Thu, 5 May 2016 06:59:03 +0000 (14:59 +0800)
committerFu Siyuan <siyuan.fu@intel.com>
Fri, 13 May 2016 01:29:07 +0000 (09:29 +0800)
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.hegde@hpe.com>
Reviewed-By: Wu Jiaxin <jiaxin.wu@intel.com>
Reviewed-by: Fu Siyuan <siyuan.fu@intel.com>
MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c

index 8d61d0b40417ee92a177a1b89c3fcb4eeef0cce7..46f035ab39fbd6e197dc0d3e6c1c2457776efa45 100644 (file)
@@ -1681,61 +1681,92 @@ HttpGenRequestMessage (
   HttpUtilitiesProtocol = NULL;\r
 \r
   //\r
-  // Locate the HTTP_UTILITIES protocol.\r
+  // 1. If we have a Request, we cannot have a NULL Url\r
+  // 2. If we have a Request, HeaderCount can not be non-zero\r
+  // 3. If we do not have a Request, HeaderCount should be zero\r
+  // 4. If we do not have Request and Headers, we need at least a message-body\r
   //\r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiHttpUtilitiesProtocolGuid,\r
-                  NULL,\r
-                  (VOID **)&HttpUtilitiesProtocol\r
-                  );\r
+  if ((Message->Data.Request != NULL && Url == NULL) ||\r
+      (Message->Data.Request != NULL && Message->HeaderCount == 0) ||\r
+      (Message->Data.Request == NULL && Message->HeaderCount != 0) ||\r
+      (Message->Data.Request == NULL && Message->HeaderCount == 0 && Message->BodyLength == 0)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
 \r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((DEBUG_ERROR,"Failed to locate Http Utilities protocol. Status = %r.\n", Status));\r
-    return Status;\r
+  if (Message->HeaderCount != 0) {\r
+    //\r
+    // Locate the HTTP_UTILITIES protocol.\r
+    //\r
+    Status = gBS->LocateProtocol (\r
+                    &gEfiHttpUtilitiesProtocolGuid,\r
+                    NULL,\r
+                    (VOID **)&HttpUtilitiesProtocol\r
+                    );\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      DEBUG ((DEBUG_ERROR,"Failed to locate Http Utilities protocol. Status = %r.\n", Status));\r
+      return Status;\r
+    }\r
+\r
+    //\r
+    // Build AppendList to send into HttpUtilitiesBuild\r
+    //\r
+    AppendList = AllocateZeroPool (sizeof (EFI_HTTP_HEADER *) * (Message->HeaderCount));\r
+    if (AppendList == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+\r
+    for(Index = 0; Index < Message->HeaderCount; Index++){\r
+      AppendList[Index] = &Message->Headers[Index];\r
+    }\r
+\r
+    //\r
+    // Build raw HTTP Headers\r
+    //\r
+    Status = HttpUtilitiesProtocol->Build (\r
+                HttpUtilitiesProtocol,\r
+                0,\r
+                NULL,\r
+                0,\r
+                NULL,\r
+                Message->HeaderCount,\r
+                AppendList,\r
+                &HttpHdrSize,\r
+                &HttpHdr\r
+                );\r
+\r
+    if (AppendList != NULL) {\r
+      FreePool (AppendList);\r
+    }\r
+\r
+    if (EFI_ERROR (Status) || HttpHdr == NULL){\r
+      return Status;\r
+    }\r
   }\r
 \r
   //\r
-  // Build AppendList to send into HttpUtilitiesBuild\r
+  // If we have headers to be sent, account for it.\r
   //\r
-  AppendList = AllocateZeroPool (sizeof (EFI_HTTP_HEADER *) * (Message->HeaderCount));\r
-  if (AppendList == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  for(Index = 0; Index < Message->HeaderCount; Index++){\r
-    AppendList[Index] = &Message->Headers[Index];\r
+  if (Message->HeaderCount != 0) {\r
+    MsgSize = HttpHdrSize;\r
   }\r
 \r
   //\r
-  // Build raw HTTP Headers\r
+  // If we have a request line, account for the fields.\r
   //\r
-  Status = HttpUtilitiesProtocol->Build (\r
-              HttpUtilitiesProtocol,\r
-              0,\r
-              NULL,\r
-              0,\r
-              NULL,\r
-              Message->HeaderCount,\r
-              AppendList,\r
-              &HttpHdrSize,\r
-              &HttpHdr\r
-              );\r
-\r
-  if (AppendList != NULL) {\r
-    FreePool (AppendList);\r
-  }\r
-\r
-  if (EFI_ERROR (Status) || HttpHdr == NULL){\r
-    return Status;\r
+  if (Message->Data.Request != NULL) {\r
+    MsgSize += HTTP_METHOD_MAXIMUM_LEN + AsciiStrLen (HTTP_VERSION_CRLF_STR) + AsciiStrLen (Url);\r
   }\r
 \r
+\r
   //\r
-  // Calculate HTTP message length.\r
+  // If we have a message body to be sent, account for it.\r
   //\r
-  MsgSize = Message->BodyLength + HTTP_METHOD_MAXIMUM_LEN + AsciiStrLen (Url) +\r
-            AsciiStrLen (HTTP_VERSION_CRLF_STR) + HttpHdrSize;\r
-\r
+  MsgSize += Message->BodyLength;\r
 \r
+  //\r
+  // memory for the string that needs to be sent to TCP\r
+  //\r
   *RequestMsg = AllocateZeroPool (MsgSize);\r
   if (*RequestMsg == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
@@ -1746,60 +1777,64 @@ HttpGenRequestMessage (
   //\r
   // Construct header request\r
   //\r
-  switch (Message->Data.Request->Method) {\r
-  case HttpMethodGet:\r
-    StrLength = sizeof (HTTP_METHOD_GET) - 1;\r
-    CopyMem (RequestPtr, HTTP_METHOD_GET, StrLength);\r
-    RequestPtr += StrLength;\r
-    break;\r
-  case HttpMethodPut:\r
-    StrLength = sizeof (HTTP_METHOD_PUT) - 1;\r
-    CopyMem (RequestPtr, HTTP_METHOD_PUT, StrLength);\r
-    RequestPtr += StrLength;\r
-    break;\r
-  case HttpMethodPatch:\r
-    StrLength = sizeof (HTTP_METHOD_PATCH) - 1;\r
-    CopyMem (RequestPtr, HTTP_METHOD_PATCH, StrLength);\r
-    RequestPtr += StrLength;\r
-    break;\r
-  case HttpMethodPost:\r
-    StrLength = sizeof (HTTP_METHOD_POST) - 1;\r
-    CopyMem (RequestPtr, HTTP_METHOD_POST, StrLength);\r
-    RequestPtr += StrLength;\r
-    break;\r
-  case HttpMethodHead:\r
-    StrLength = sizeof (HTTP_METHOD_HEAD) - 1;\r
-    CopyMem (RequestPtr, HTTP_METHOD_HEAD, StrLength);\r
-    RequestPtr += StrLength;\r
-    break;\r
-  case HttpMethodDelete:\r
-    StrLength = sizeof (HTTP_METHOD_DELETE) - 1;\r
-    CopyMem (RequestPtr, HTTP_METHOD_DELETE, StrLength);\r
-    RequestPtr += StrLength;\r
-    break;\r
-  default:\r
-    ASSERT (FALSE);\r
-    Status = EFI_INVALID_PARAMETER;\r
-    goto Exit;\r
-  }\r
+  if (Message->Data.Request != NULL) {\r
+    switch (Message->Data.Request->Method) {\r
+    case HttpMethodGet:\r
+      StrLength = sizeof (HTTP_METHOD_GET) - 1;\r
+      CopyMem (RequestPtr, HTTP_METHOD_GET, StrLength);\r
+      RequestPtr += StrLength;\r
+      break;\r
+    case HttpMethodPut:\r
+      StrLength = sizeof (HTTP_METHOD_PUT) - 1;\r
+      CopyMem (RequestPtr, HTTP_METHOD_PUT, StrLength);\r
+      RequestPtr += StrLength;\r
+      break;\r
+    case HttpMethodPatch:\r
+      StrLength = sizeof (HTTP_METHOD_PATCH) - 1;\r
+      CopyMem (RequestPtr, HTTP_METHOD_PATCH, StrLength);\r
+      RequestPtr += StrLength;\r
+      break;\r
+    case HttpMethodPost:\r
+      StrLength = sizeof (HTTP_METHOD_POST) - 1;\r
+      CopyMem (RequestPtr, HTTP_METHOD_POST, StrLength);\r
+      RequestPtr += StrLength;\r
+      break;\r
+    case HttpMethodHead:\r
+      StrLength = sizeof (HTTP_METHOD_HEAD) - 1;\r
+      CopyMem (RequestPtr, HTTP_METHOD_HEAD, StrLength);\r
+      RequestPtr += StrLength;\r
+      break;\r
+    case HttpMethodDelete:\r
+      StrLength = sizeof (HTTP_METHOD_DELETE) - 1;\r
+      CopyMem (RequestPtr, HTTP_METHOD_DELETE, StrLength);\r
+      RequestPtr += StrLength;\r
+      break;\r
+    default:\r
+      ASSERT (FALSE);\r
+      Status = EFI_INVALID_PARAMETER;\r
+      goto Exit;\r
+    }\r
 \r
-  StrLength = AsciiStrLen(EMPTY_SPACE);\r
-  CopyMem (RequestPtr, EMPTY_SPACE, StrLength);\r
-  RequestPtr += StrLength;\r
+    StrLength = AsciiStrLen(EMPTY_SPACE);\r
+    CopyMem (RequestPtr, EMPTY_SPACE, StrLength);\r
+    RequestPtr += StrLength;\r
 \r
-  StrLength = AsciiStrLen (Url);\r
-  CopyMem (RequestPtr, Url, StrLength);\r
-  RequestPtr += StrLength;\r
+    StrLength = AsciiStrLen (Url);\r
+    CopyMem (RequestPtr, Url, StrLength);\r
+    RequestPtr += StrLength;\r
 \r
-  StrLength = sizeof (HTTP_VERSION_CRLF_STR) - 1;\r
-  CopyMem (RequestPtr, HTTP_VERSION_CRLF_STR, StrLength);\r
-  RequestPtr += StrLength;\r
+    StrLength = sizeof (HTTP_VERSION_CRLF_STR) - 1;\r
+    CopyMem (RequestPtr, HTTP_VERSION_CRLF_STR, StrLength);\r
+    RequestPtr += StrLength;\r
 \r
-  //\r
-  // Construct header\r
-  //\r
-  CopyMem (RequestPtr, HttpHdr, HttpHdrSize);\r
-  RequestPtr += HttpHdrSize;\r
+    if (HttpHdr != NULL) {\r
+      //\r
+      // Construct header\r
+      //\r
+      CopyMem (RequestPtr, HttpHdr, HttpHdrSize);\r
+      RequestPtr += HttpHdrSize;\r
+    }\r
+  }\r
 \r
   //\r
   // Construct body\r