ipc_args.cc 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "sandbox/win/src/ipc_args.h"
  5. #include <stddef.h>
  6. #include "sandbox/win/src/crosscall_params.h"
  7. #include "sandbox/win/src/crosscall_server.h"
  8. namespace sandbox {
  9. // Releases memory allocated for IPC arguments, if needed.
  10. void ReleaseArgs(const IPCParams* ipc_params, void* args[kMaxIpcParams]) {
  11. for (size_t i = 0; i < kMaxIpcParams; i++) {
  12. switch (ipc_params->args[i]) {
  13. case WCHAR_TYPE: {
  14. delete reinterpret_cast<std::wstring*>(args[i]);
  15. args[i] = nullptr;
  16. break;
  17. }
  18. case INOUTPTR_TYPE: {
  19. delete reinterpret_cast<CountedBuffer*>(args[i]);
  20. args[i] = nullptr;
  21. break;
  22. }
  23. default:
  24. break;
  25. }
  26. }
  27. }
  28. // Fills up the list of arguments (args and ipc_params) for an IPC call.
  29. bool GetArgs(CrossCallParamsEx* params,
  30. IPCParams* ipc_params,
  31. void* args[kMaxIpcParams]) {
  32. if (kMaxIpcParams < params->GetParamsCount())
  33. return false;
  34. for (uint32_t i = 0; i < params->GetParamsCount(); i++) {
  35. uint32_t size;
  36. ArgType type;
  37. args[i] = params->GetRawParameter(i, &size, &type);
  38. if (args[i]) {
  39. ipc_params->args[i] = type;
  40. switch (type) {
  41. case WCHAR_TYPE: {
  42. std::unique_ptr<std::wstring> data(new std::wstring);
  43. if (!params->GetParameterStr(i, data.get())) {
  44. args[i] = 0;
  45. ReleaseArgs(ipc_params, args);
  46. return false;
  47. }
  48. args[i] = data.release();
  49. break;
  50. }
  51. case UINT32_TYPE: {
  52. uint32_t data;
  53. if (!params->GetParameter32(i, &data)) {
  54. ReleaseArgs(ipc_params, args);
  55. return false;
  56. }
  57. IPCInt ipc_int(data);
  58. args[i] = ipc_int.AsVoidPtr();
  59. break;
  60. }
  61. case VOIDPTR_TYPE: {
  62. void* data;
  63. if (!params->GetParameterVoidPtr(i, &data)) {
  64. ReleaseArgs(ipc_params, args);
  65. return false;
  66. }
  67. args[i] = data;
  68. break;
  69. }
  70. case INOUTPTR_TYPE: {
  71. if (!args[i]) {
  72. ReleaseArgs(ipc_params, args);
  73. return false;
  74. }
  75. CountedBuffer* buffer = new CountedBuffer(args[i], size);
  76. args[i] = buffer;
  77. break;
  78. }
  79. default:
  80. break;
  81. }
  82. }
  83. }
  84. return true;
  85. }
  86. } // namespace sandbox