লেনদেন নির্দেশিকা

ভূমিকা

একটি আনস্যান্ডবক্সড C/C++ লাইব্রেরি ব্যবহার করার সময়, লিঙ্কার নিশ্চিত করে যে সমস্ত প্রয়োজনীয় ফাংশন সংকলনের পরে উপলব্ধ রয়েছে এবং এইভাবে একটি API কল রানটাইমে ব্যর্থ হতে পারে কিনা তা নিয়ে চিন্তা করার দরকার নেই।

একটি স্যান্ডবক্সড লাইব্রেরি ব্যবহার করার সময়, লাইব্রেরির সম্পাদন একটি পৃথক প্রক্রিয়ায় থাকে। একটি API কলে ব্যর্থতার জন্য RPC স্তরের উপর কলটি পাস করার সাথে সম্পর্কিত সমস্ত ধরণের সমস্যার জন্য পরীক্ষা করা প্রয়োজন৷ কখনও কখনও, RPC স্তর ত্রুটিগুলি আগ্রহের নাও হতে পারে, উদাহরণস্বরূপ যখন বাল্ক প্রসেসিং করা হয় এবং স্যান্ডবক্স সবেমাত্র পুনরায় চালু করা হয়।

তবুও, উপরে উল্লিখিত কারণগুলির জন্য, RPC স্তরে একটি ত্রুটি ফেরত দেওয়া হয়েছে কিনা তা পরীক্ষা করা অন্তর্ভুক্ত করার জন্য স্যান্ডবক্সড API কলের রিটার্ন মানের নিয়মিত ত্রুটি পরীক্ষা বাড়ানো গুরুত্বপূর্ণ। এই কারণেই সমস্ত লাইব্রেরি ফাংশন প্রোটোটাইপগুলি T এর পরিবর্তে ::sapi::StatusOr<T> ফেরত দেয়। যদি লাইব্রেরি ফাংশন ইনভোকেশন ব্যর্থ হয় (যেমন একটি স্যান্ডবক্স লঙ্ঘনের কারণে), রিটার্ন মানটিতে ঘটে যাওয়া ত্রুটির বিবরণ থাকবে .

RPC স্তর ত্রুটিগুলি পরিচালনা করার অর্থ হল একটি স্যান্ডবক্সড লাইব্রেরিতে প্রতিটি কলের পরে SAPI-এর RPC স্তরের একটি অতিরিক্ত চেক করা হয়৷ এই ব্যতিক্রমী পরিস্থিতি মোকাবেলা করার জন্য, SAPI SAPI লেনদেন মডিউল ( transaction.h ) প্রদান করে। এই মডিউলটিতে ::sapi::Transaction ক্লাস রয়েছে এবং নিশ্চিত করে যে স্যান্ডবক্সড লাইব্রেরিতে সমস্ত ফাংশন কলগুলি কোনও RPC-স্তরের সমস্যা ছাড়াই সম্পন্ন হয়েছে, অথবা একটি প্রাসঙ্গিক ত্রুটি ফিরিয়ে দিয়েছে।

SAPI লেনদেন

SAPI স্যান্ডবক্সড লাইব্রেরি থেকে হোস্ট কোড বিচ্ছিন্ন করে এবং কলকারীকে সমস্যাযুক্ত ডেটা প্রসেসিং অনুরোধ পুনরায় চালু বা বাতিল করার ক্ষমতা দেয়। SAPI লেনদেন আরও এক ধাপ এগিয়ে যায় এবং স্বয়ংক্রিয়ভাবে ব্যর্থ প্রক্রিয়ার পুনরাবৃত্তি করে।

SAPI লেনদেন দুটি ভিন্ন উপায়ে ব্যবহার করা যেতে পারে: হয় সরাসরি ::sapi::Transaction থেকে উত্তরাধিকারসূত্রে পাওয়া, অথবা ::sapi::BasicTransaction এ পাস করা ফাংশন পয়েন্টার ব্যবহার করে।

SAPI লেনদেন নিম্নলিখিত তিনটি ফাংশন ওভাররাইড করে সংজ্ঞায়িত করা হয়:

SAPI লেনদেন পদ্ধতি
::sapi::Transaction::Init() এটি একটি সাধারণ C/C++ লাইব্রেরির একটি প্রারম্ভিক পদ্ধতি কল করার অনুরূপ। স্যান্ডবক্সড লাইব্রেরিতে প্রতিটি লেনদেনের সময় পদ্ধতিটি শুধুমাত্র একবার বলা হয়, যদি না লেনদেনটি পুনরায় চালু করা হয়। রিস্টার্টের ক্ষেত্রে, পদ্ধতিটিকে আবার বলা হয়, আগে কতগুলি রিস্টার্ট হয়েছে তা নির্বিশেষে।
::sapi::Transaction::Main() পদ্ধতিটি প্রতিটি কলের জন্য বলা হয় ::sapi::Transaction::Run()
::sapi::Transaction::Finish() এটি একটি সাধারণ C/C++ লাইব্রেরির একটি ক্লিন-আপ পদ্ধতি কল করার অনুরূপ। SAPI লেনদেন বস্তু ধ্বংসের সময় পদ্ধতিটি শুধুমাত্র একবার বলা হয়।

সাধারণ লাইব্রেরি ব্যবহার

স্যান্ডবক্সড লাইব্রেরি ছাড়া একটি প্রকল্পে, লাইব্রেরিগুলির সাথে ডিল করার সময় সাধারণ প্যাটার্নটি এরকম কিছু দেখায়:

LibInit();
while (data = NextDataToProcess()) {
  result += LibProcessData(data);
}
LibClose();

লাইব্রেরিটি আরম্ভ করা হয়, তারপর লাইব্রেরির এক্সপোর্ট করা ফাংশন ব্যবহার করা হয় এবং পরিশেষে পরিবেশ পরিষ্কার করার জন্য একটি শেষ/বন্ধ ফাংশন বলা হয়।

স্যান্ডবক্সড লাইব্রেরি ব্যবহার

স্যান্ডবক্সযুক্ত লাইব্রেরি সহ একটি প্রকল্পে, কলব্যাকের সাথে লেনদেন ব্যবহার করার সময় সাধারণ লাইব্রেরি ব্যবহারের কোডটি নিম্নলিখিত কোড স্নিপেটে অনুবাদ করে:

// Overwrite the Init method, passed to BasicTransaction initialization
::absl::Status Init(::sapi::Sandbox* sandbox) {
  // Instantiate the SAPI Object
  LibraryAPI lib(sandbox);
  // Instantiate the Sandboxed Library
  SAPI_RETURN_IF_ERROR(lib.LibInit());
  return ::absl::OkStatus();
}

// Overwrite the Finish method, passed to BasicTransaction initialization
::absl::Status Finish(::sapi::Sandbox *sandbox) {
  // Instantiate the SAPI Object
  LibraryAPI lib(sandbox);
  // Clean-up sandboxed library instance
  SAPI_RETURN_IF_ERROR(lib.LibClose());
  return ::absl::OkStatus();
}

// Wrapper function to process data, passed to Run method call
::absl::Status HandleData(::sapi::Sandbox *sandbox, Data data_to_process,
                           Result *out) {
  // Instantiate the SAPI Object
  LibraryAPI lib(sandbox);
  // Call the sandboxed function LibProcessData
  SAPI_ASSIGN_OR_RETURN(*out, lib.LibProcessData(data_to_process));
  return ::absl::OkStatus();
}

void Handle() {
  // Use SAPI Transactions by passing function pointers to ::sapi::BasicTransaction
  ::sapi::BasicTransaction transaction(Init, Finish);
  while (data = NextDataToProcess()) {
    ::sandbox2::Result result;
    // call the ::sapi::Transaction::Run() method
    transaction.Run(HandleData, data, &result);
    // ...
  }
  // ...
}

লেনদেন শ্রেণীটি নিশ্চিত করে যে handle_data আহ্বানের সময় একটি ত্রুটি দেখা দিলে লাইব্রেরিটি পুনরায় চালু করা যায় - নিম্নলিখিত বিভাগে এটি সম্পর্কে আরও।

লেনদেন পুনরায় শুরু হয়

যদি একটি স্যান্ডবক্সড লাইব্রেরি API কল SAPI লেনদেন পদ্ধতিগুলি সম্পাদন করার সময় একটি ত্রুটি উত্থাপন করে (উপরের টেবিলটি দেখুন), লেনদেনটি পুনরায় আরম্ভ করা হবে৷ রিস্টার্টের ডিফল্ট সংখ্যা kDefaultRetryCnt দ্বারা transaction.h- এ সংজ্ঞায়িত করা হয়েছে।

উত্থাপিত ত্রুটিগুলির উদাহরণ যা পুনরায় চালু করতে ট্রিগার করবে:

  • একটি স্যান্ডবক্স লঙ্ঘন ঘটেছে
  • স্যান্ডবক্সড প্রক্রিয়া ক্র্যাশ হয়েছে৷
  • একটি স্যান্ডবক্সড ফাংশন একটি লাইব্রেরি ত্রুটির কারণে একটি ত্রুটি কোড ফেরত দিয়েছে৷

পুনঃসূচনা পদ্ধতিটি স্বাভাবিক Init() এবং Main() প্রবাহ পর্যবেক্ষণ করে এবং যদি ::sapi::Transaction::Run() পদ্ধতিতে বারবার কল করা হয়, তাহলে পুরো পদ্ধতিটি তার কলারকে একটি ত্রুটি ফেরত দেয়।

স্যান্ডবক্স বা RPC ত্রুটি হ্যান্ডলিং

স্বয়ংক্রিয়ভাবে তৈরি স্যান্ডবক্সড লাইব্রেরি ইন্টারফেস যতটা সম্ভব মূল C/C++ লাইব্রেরি ফাংশন প্রোটোটাইপের কাছাকাছি হওয়ার চেষ্টা করে। যাইহোক, স্যান্ডবক্সড লাইব্রেরি যেকোনো স্যান্ডবক্স বা RPC ত্রুটির সংকেত দিতে সক্ষম হতে হবে।

স্যান্ডবক্স করা ফাংশনের রিটার্ন মান সরাসরি ফেরত দেওয়ার পরিবর্তে ::sapi::StatusOr<T> রিটার্ন প্রকারগুলি (বা ::sapi::Status ফাংশন রিটার্নিং void ) ব্যবহার করে এটি অর্জন করা হয়।

SAPI আরও কিছু সুবিধাজনক ম্যাক্রো প্রদান করে একটি SAPI স্ট্যাটাস অবজেক্ট চেক করতে এবং প্রতিক্রিয়া জানাতে। এই ম্যাক্রোগুলি status_macro.h হেডার ফাইলে সংজ্ঞায়িত করা হয়েছে।

নিম্নলিখিত কোড স্নিপেটটি যোগফলের উদাহরণ থেকে একটি উদ্ধৃতি এবং SAPI স্থিতি এবং ম্যাক্রোর ব্যবহার প্রদর্শন করে:

// Instead of void, use ::sapi::Status
::sapi::Status SumTransaction::Main() {
  // Instantiate the SAPI Object
  SumApi f(sandbox());

  // ::sapi::StatusOr<int> sum(int a, int b)
  SAPI_ASSIGN_OR_RETURN(int v, f.sum(1000, 337));
  // ...

  // ::sapi::Status sums(sapi::v::Ptr* params)
  SumParams params;
  params.mutable_data()->a = 1111;
  params.mutable_data()->b = 222;
  params.mutable_data()->ret = 0;
  SAPI_RETURN_IF_ERROR(f.sums(params.PtrBoth()));
  // ...
  // Gets symbol address and prints its value
  int *ssaddr;
  SAPI_RETURN_IF_ERROR(sandbox()->Symbol(
      "sumsymbol", reinterpret_cast<void**>(&ssaddr)));
  ::sapi::v::Int sumsymbol;
  sumsymbol.SetRemote(ssaddr);
  SAPI_RETURN_IF_ERROR(sandbox()->TransferFromSandboxee(&sumsymbol));
  // ...
  return ::sapi::OkStatus();
}

স্যান্ডবক্স পুনরায় চালু হয়

অনেক স্যান্ডবক্সযুক্ত লাইব্রেরি সংবেদনশীল ব্যবহারকারীর ইনপুট পরিচালনা করে। যদি স্যান্ডবক্স করা লাইব্রেরি কোনো সময়ে দূষিত হয় এবং রানের মধ্যে ডেটা সঞ্চয় করে, এই সংবেদনশীল ডেটা ঝুঁকিতে থাকে। উদাহরণস্বরূপ, যদি Imagemagick লাইব্রেরির একটি স্যান্ডবক্স করা সংস্করণ পূর্ববর্তী রানের ছবি পাঠাতে শুরু করে।

এই ধরনের পরিস্থিতি এড়াতে, স্যান্ডবক্স একাধিক রানের জন্য পুনরায় ব্যবহার করা উচিত নয়। স্যান্ডবক্সের পুনঃব্যবহার বন্ধ করতে, হোস্ট কোড SAPI লেনদেন ব্যবহার করার সময় ::sapi::Sandbox::Restart() বা ::sapi::Transaction::Restart() ব্যবহার করে স্যান্ডবক্সযুক্ত লাইব্রেরি প্রক্রিয়াটি পুনরায় চালু করতে পারে।

একটি পুনঃসূচনা স্যান্ডবক্সযুক্ত লাইব্রেরি প্রক্রিয়ার যেকোন রেফারেন্সকে বাতিল করবে। এর মানে পাস করা ফাইল বর্ণনাকারী, বা বরাদ্দ করা মেমরি আর থাকবে না।

,

ভূমিকা

একটি আনস্যান্ডবক্সড C/C++ লাইব্রেরি ব্যবহার করার সময়, লিঙ্কার নিশ্চিত করে যে সমস্ত প্রয়োজনীয় ফাংশন সংকলনের পরে উপলব্ধ রয়েছে এবং এইভাবে একটি API কল রানটাইমে ব্যর্থ হতে পারে কিনা তা নিয়ে চিন্তা করার দরকার নেই।

একটি স্যান্ডবক্সড লাইব্রেরি ব্যবহার করার সময়, লাইব্রেরির সম্পাদন একটি পৃথক প্রক্রিয়ায় থাকে। একটি API কলে ব্যর্থতার জন্য RPC স্তরের উপর কলটি পাস করার সাথে সম্পর্কিত সমস্ত ধরণের সমস্যার জন্য পরীক্ষা করা প্রয়োজন৷ কখনও কখনও, RPC স্তর ত্রুটিগুলি আগ্রহের নাও হতে পারে, উদাহরণস্বরূপ যখন বাল্ক প্রসেসিং করা হয় এবং স্যান্ডবক্স সবেমাত্র পুনরায় চালু করা হয়।

তবুও, উপরে উল্লিখিত কারণগুলির জন্য, RPC স্তরে একটি ত্রুটি ফেরত দেওয়া হয়েছে কিনা তা পরীক্ষা করা অন্তর্ভুক্ত করার জন্য স্যান্ডবক্সড API কলের রিটার্ন মানের নিয়মিত ত্রুটি পরীক্ষা বাড়ানো গুরুত্বপূর্ণ। এই কারণেই সমস্ত লাইব্রেরি ফাংশন প্রোটোটাইপগুলি T এর পরিবর্তে ::sapi::StatusOr<T> ফেরত দেয়। যদি লাইব্রেরি ফাংশন ইনভোকেশন ব্যর্থ হয় (যেমন একটি স্যান্ডবক্স লঙ্ঘনের কারণে), রিটার্ন মানটিতে ঘটে যাওয়া ত্রুটির বিবরণ থাকবে .

RPC স্তর ত্রুটিগুলি পরিচালনা করার অর্থ হল একটি স্যান্ডবক্সড লাইব্রেরিতে প্রতিটি কলের পরে SAPI-এর RPC স্তরের একটি অতিরিক্ত চেক করা হয়৷ এই ব্যতিক্রমী পরিস্থিতি মোকাবেলা করার জন্য, SAPI SAPI লেনদেন মডিউল ( transaction.h ) প্রদান করে। এই মডিউলটিতে ::sapi::Transaction ক্লাস রয়েছে এবং নিশ্চিত করে যে স্যান্ডবক্সড লাইব্রেরিতে সমস্ত ফাংশন কলগুলি কোনও RPC-স্তরের সমস্যা ছাড়াই সম্পন্ন হয়েছে, অথবা একটি প্রাসঙ্গিক ত্রুটি ফিরিয়ে দিয়েছে।

SAPI লেনদেন

SAPI স্যান্ডবক্সড লাইব্রেরি থেকে হোস্ট কোড বিচ্ছিন্ন করে এবং কলকারীকে সমস্যাযুক্ত ডেটা প্রসেসিং অনুরোধ পুনরায় চালু বা বাতিল করার ক্ষমতা দেয়। SAPI লেনদেন আরও এক ধাপ এগিয়ে যায় এবং স্বয়ংক্রিয়ভাবে ব্যর্থ প্রক্রিয়ার পুনরাবৃত্তি করে।

SAPI লেনদেন দুটি ভিন্ন উপায়ে ব্যবহার করা যেতে পারে: হয় সরাসরি ::sapi::Transaction থেকে উত্তরাধিকারসূত্রে পাওয়া, অথবা ::sapi::BasicTransaction এ পাস করা ফাংশন পয়েন্টার ব্যবহার করে।

SAPI লেনদেন নিম্নলিখিত তিনটি ফাংশন ওভাররাইড করে সংজ্ঞায়িত করা হয়:

SAPI লেনদেন পদ্ধতি
::sapi::Transaction::Init() এটি একটি সাধারণ C/C++ লাইব্রেরির একটি প্রারম্ভিক পদ্ধতি কল করার অনুরূপ। স্যান্ডবক্সড লাইব্রেরিতে প্রতিটি লেনদেনের সময় পদ্ধতিটি শুধুমাত্র একবার বলা হয়, যদি না লেনদেনটি পুনরায় চালু করা হয়। রিস্টার্টের ক্ষেত্রে, পদ্ধতিটিকে আবার বলা হয়, আগে কতগুলি রিস্টার্ট হয়েছে তা নির্বিশেষে।
::sapi::Transaction::Main() পদ্ধতিটি প্রতিটি কলের জন্য বলা হয় ::sapi::Transaction::Run()
::sapi::Transaction::Finish() এটি একটি সাধারণ C/C++ লাইব্রেরির একটি ক্লিন-আপ পদ্ধতি কল করার অনুরূপ। SAPI লেনদেন বস্তু ধ্বংসের সময় পদ্ধতিটি শুধুমাত্র একবার বলা হয়।

সাধারণ লাইব্রেরি ব্যবহার

স্যান্ডবক্সড লাইব্রেরি ছাড়া একটি প্রকল্পে, লাইব্রেরিগুলির সাথে ডিল করার সময় সাধারণ প্যাটার্নটি এরকম কিছু দেখায়:

LibInit();
while (data = NextDataToProcess()) {
  result += LibProcessData(data);
}
LibClose();

লাইব্রেরিটি আরম্ভ করা হয়, তারপর লাইব্রেরির এক্সপোর্ট করা ফাংশন ব্যবহার করা হয় এবং পরিশেষে পরিবেশ পরিষ্কার করার জন্য একটি শেষ/বন্ধ ফাংশন বলা হয়।

স্যান্ডবক্সড লাইব্রেরি ব্যবহার

স্যান্ডবক্সযুক্ত লাইব্রেরি সহ একটি প্রকল্পে, কলব্যাকের সাথে লেনদেন ব্যবহার করার সময় সাধারণ লাইব্রেরি ব্যবহারের কোডটি নিম্নলিখিত কোড স্নিপেটে অনুবাদ করে:

// Overwrite the Init method, passed to BasicTransaction initialization
::absl::Status Init(::sapi::Sandbox* sandbox) {
  // Instantiate the SAPI Object
  LibraryAPI lib(sandbox);
  // Instantiate the Sandboxed Library
  SAPI_RETURN_IF_ERROR(lib.LibInit());
  return ::absl::OkStatus();
}

// Overwrite the Finish method, passed to BasicTransaction initialization
::absl::Status Finish(::sapi::Sandbox *sandbox) {
  // Instantiate the SAPI Object
  LibraryAPI lib(sandbox);
  // Clean-up sandboxed library instance
  SAPI_RETURN_IF_ERROR(lib.LibClose());
  return ::absl::OkStatus();
}

// Wrapper function to process data, passed to Run method call
::absl::Status HandleData(::sapi::Sandbox *sandbox, Data data_to_process,
                           Result *out) {
  // Instantiate the SAPI Object
  LibraryAPI lib(sandbox);
  // Call the sandboxed function LibProcessData
  SAPI_ASSIGN_OR_RETURN(*out, lib.LibProcessData(data_to_process));
  return ::absl::OkStatus();
}

void Handle() {
  // Use SAPI Transactions by passing function pointers to ::sapi::BasicTransaction
  ::sapi::BasicTransaction transaction(Init, Finish);
  while (data = NextDataToProcess()) {
    ::sandbox2::Result result;
    // call the ::sapi::Transaction::Run() method
    transaction.Run(HandleData, data, &result);
    // ...
  }
  // ...
}

লেনদেন শ্রেণীটি নিশ্চিত করে যে handle_data আহ্বানের সময় একটি ত্রুটি দেখা দিলে লাইব্রেরিটি পুনরায় চালু করা যায় - নিম্নলিখিত বিভাগে এটি সম্পর্কে আরও।

লেনদেন পুনরায় শুরু হয়

যদি একটি স্যান্ডবক্সড লাইব্রেরি API কল SAPI লেনদেন পদ্ধতিগুলি সম্পাদন করার সময় একটি ত্রুটি উত্থাপন করে (উপরের টেবিলটি দেখুন), লেনদেনটি পুনরায় আরম্ভ করা হবে৷ রিস্টার্টের ডিফল্ট সংখ্যা kDefaultRetryCnt দ্বারা transaction.h- এ সংজ্ঞায়িত করা হয়েছে।

উত্থাপিত ত্রুটিগুলির উদাহরণ যা পুনরায় চালু করতে ট্রিগার করবে:

  • একটি স্যান্ডবক্স লঙ্ঘন ঘটেছে
  • স্যান্ডবক্সড প্রক্রিয়া ক্র্যাশ হয়েছে৷
  • একটি স্যান্ডবক্সড ফাংশন একটি লাইব্রেরি ত্রুটির কারণে একটি ত্রুটি কোড ফেরত দিয়েছে৷

পুনঃসূচনা পদ্ধতিটি স্বাভাবিক Init() এবং Main() প্রবাহ পর্যবেক্ষণ করে এবং যদি ::sapi::Transaction::Run() পদ্ধতিতে বারবার কল করা হয়, তাহলে পুরো পদ্ধতিটি তার কলারকে একটি ত্রুটি ফেরত দেয়।

স্যান্ডবক্স বা RPC ত্রুটি হ্যান্ডলিং

স্বয়ংক্রিয়ভাবে তৈরি স্যান্ডবক্সড লাইব্রেরি ইন্টারফেস যতটা সম্ভব মূল C/C++ লাইব্রেরি ফাংশন প্রোটোটাইপের কাছাকাছি হওয়ার চেষ্টা করে। যাইহোক, স্যান্ডবক্সড লাইব্রেরি যেকোনো স্যান্ডবক্স বা RPC ত্রুটির সংকেত দিতে সক্ষম হতে হবে।

স্যান্ডবক্স করা ফাংশনের রিটার্ন মান সরাসরি ফেরত দেওয়ার পরিবর্তে ::sapi::StatusOr<T> রিটার্ন প্রকারগুলি (বা ::sapi::Status ফাংশন রিটার্নিং void ) ব্যবহার করে এটি অর্জন করা হয়।

SAPI আরও কিছু সুবিধাজনক ম্যাক্রো প্রদান করে একটি SAPI স্ট্যাটাস অবজেক্ট চেক করতে এবং প্রতিক্রিয়া জানাতে। এই ম্যাক্রোগুলি status_macro.h হেডার ফাইলে সংজ্ঞায়িত করা হয়েছে।

নিম্নলিখিত কোড স্নিপেটটি যোগফলের উদাহরণ থেকে একটি উদ্ধৃতি এবং SAPI স্থিতি এবং ম্যাক্রোর ব্যবহার প্রদর্শন করে:

// Instead of void, use ::sapi::Status
::sapi::Status SumTransaction::Main() {
  // Instantiate the SAPI Object
  SumApi f(sandbox());

  // ::sapi::StatusOr<int> sum(int a, int b)
  SAPI_ASSIGN_OR_RETURN(int v, f.sum(1000, 337));
  // ...

  // ::sapi::Status sums(sapi::v::Ptr* params)
  SumParams params;
  params.mutable_data()->a = 1111;
  params.mutable_data()->b = 222;
  params.mutable_data()->ret = 0;
  SAPI_RETURN_IF_ERROR(f.sums(params.PtrBoth()));
  // ...
  // Gets symbol address and prints its value
  int *ssaddr;
  SAPI_RETURN_IF_ERROR(sandbox()->Symbol(
      "sumsymbol", reinterpret_cast<void**>(&ssaddr)));
  ::sapi::v::Int sumsymbol;
  sumsymbol.SetRemote(ssaddr);
  SAPI_RETURN_IF_ERROR(sandbox()->TransferFromSandboxee(&sumsymbol));
  // ...
  return ::sapi::OkStatus();
}

স্যান্ডবক্স পুনরায় চালু হয়

অনেক স্যান্ডবক্সযুক্ত লাইব্রেরি সংবেদনশীল ব্যবহারকারীর ইনপুট পরিচালনা করে। যদি স্যান্ডবক্স করা লাইব্রেরি কোনো সময়ে দূষিত হয় এবং রানের মধ্যে ডেটা সঞ্চয় করে, এই সংবেদনশীল ডেটা ঝুঁকিতে থাকে। উদাহরণস্বরূপ, যদি Imagemagick লাইব্রেরির একটি স্যান্ডবক্স করা সংস্করণ পূর্ববর্তী রানের ছবি পাঠাতে শুরু করে।

এই ধরনের পরিস্থিতি এড়াতে, স্যান্ডবক্স একাধিক রানের জন্য পুনরায় ব্যবহার করা উচিত নয়। স্যান্ডবক্সের পুনঃব্যবহার বন্ধ করতে, হোস্ট কোড SAPI লেনদেন ব্যবহার করার সময় ::sapi::Sandbox::Restart() বা ::sapi::Transaction::Restart() ব্যবহার করে স্যান্ডবক্সযুক্ত লাইব্রেরি প্রক্রিয়াটি পুনরায় চালু করতে পারে।

একটি পুনঃসূচনা স্যান্ডবক্সযুক্ত লাইব্রেরি প্রক্রিয়ার যেকোন রেফারেন্সকে বাতিল করবে। এর মানে পাস করা ফাইল বর্ণনাকারী, বা বরাদ্দ করা মেমরি আর থাকবে না।