NullPtr: Change SAPI to accept regular nullptr for sandboxed API calls.

This change allows to use a `nullptr` instead to having to instantiate a `sapi:✌️:NullPtr` object.

```
sapi:✌️:NullPtr null;
SAPI_RETURN_IF_ERROR(api.testNullPtr(&null);
```

Becomes:

```
SAPI_RETURN_IF_ERROR(api.testNullPtr(nullptr);
```

PiperOrigin-RevId: 602333882
Change-Id: Ie2517dbedab8c514d7a102c4ef4bad90b34a219d
This commit is contained in:
Oliver Kunz 2024-01-29 03:22:32 -08:00 committed by Copybara-Service
parent fa5360351b
commit f2840b37a3
2 changed files with 15 additions and 3 deletions

View File

@ -324,6 +324,14 @@ absl::Status Sandbox::Call(const std::string& func, v::Callable* ret,
// Copy all arguments into rfcall. // Copy all arguments into rfcall.
int i = 0; int i = 0;
for (auto* arg : args) { for (auto* arg : args) {
if (arg == nullptr) {
rfcall.arg_type[i] = v::Type::kPointer;
rfcall.arg_size[i] = sizeof(void*);
rfcall.args[i].arg_int = 0;
VLOG(1) << "CALL ARG: (" << i << "): nullptr";
++i;
continue;
}
rfcall.arg_size[i] = arg->GetSize(); rfcall.arg_size[i] = arg->GetSize();
rfcall.arg_type[i] = arg->GetType(); rfcall.arg_type[i] = arg->GetType();
@ -357,7 +365,6 @@ absl::Status Sandbox::Call(const std::string& func, v::Callable* ret,
} }
rfcall.args[i].arg_int = fd->GetRemoteFd(); rfcall.args[i].arg_int = fd->GetRemoteFd();
} }
VLOG(1) << "CALL ARG: (" << i << "), Type: " << arg->GetTypeString() VLOG(1) << "CALL ARG: (" << i << "), Type: " << arg->GetTypeString()
<< ", Size: " << arg->GetSize() << ", Val: " << arg->ToString(); << ", Size: " << arg->GetSize() << ", Val: " << arg->ToString();
++i; ++i;
@ -382,8 +389,10 @@ absl::Status Sandbox::Call(const std::string& func, v::Callable* ret,
// Synchronize all pointers after the call if it's needed. // Synchronize all pointers after the call if it's needed.
for (auto* arg : args) { for (auto* arg : args) {
if (arg != nullptr) {
SAPI_RETURN_IF_ERROR(SynchronizePtrAfter(arg)); SAPI_RETURN_IF_ERROR(SynchronizePtrAfter(arg));
} }
}
VLOG(1) << "CALL EXIT: Type: " << ret->GetTypeString() VLOG(1) << "CALL EXIT: Type: " << ret->GetTypeString()
<< ", Size: " << ret->GetSize() << ", Val: " << ret->ToString(); << ", Size: " << ret->GetSize() << ", Val: " << ret->ToString();

View File

@ -20,6 +20,7 @@
#include <memory> #include <memory>
#include <string> #include <string>
#include "absl/base/attributes.h"
#include "absl/base/macros.h" #include "absl/base/macros.h"
#include "absl/strings/str_format.h" #include "absl/strings/str_format.h"
#include "sandboxed_api/var_abstract.h" #include "sandboxed_api/var_abstract.h"
@ -79,7 +80,9 @@ class Ptr : public Reg<Var*> {
}; };
// Good, old nullptr // Good, old nullptr
class NullPtr : public Ptr { class ABSL_DEPRECATED(
"Use regular `nullptr` or `NULL` instead. This class will eventually get "
"removed") NullPtr : public Ptr {
public: public:
NullPtr() : Ptr(&void_obj_, SyncType::kSyncNone) {} NullPtr() : Ptr(&void_obj_, SyncType::kSyncNone) {}