Skip to content

Commit 0e654db

Browse files
committed
Fixing memory corruption when passing additional scopes.
Change-Id: I3d27930e4d077ee288d1ebc892fd9a4401dc25a3
1 parent 6f72959 commit 0e654db

File tree

6 files changed

+149
-160
lines changed

6 files changed

+149
-160
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ ProjectSettings/
1616
Temp/
1717
obj/
1818

19+
.DS_Store
20+
1921
# Don't check in the resolver
2022
GoogleSignInPlugin/Assets/PlayServicesResolver/
2123

native-googlesignin/src/main/cpp/google_signin.cc

+8-14
Original file line numberDiff line numberDiff line change
@@ -229,10 +229,6 @@ void GoogleSignIn::GoogleSignInImpl::Configure(
229229
delete current_configuration_;
230230
current_configuration_ = new Configuration(configuration);
231231

232-
if (configuration.web_client_id) {
233-
current_configuration_->web_client_id = strdup(configuration.web_client_id);
234-
}
235-
236232
delete current_result_;
237233
current_result_ = new GoogleSignInFuture();
238234

@@ -247,26 +243,24 @@ void GoogleSignIn::GoogleSignInImpl::CallConfigure() {
247243
return;
248244
}
249245
jstring j_web_client_id =
250-
current_configuration_->web_client_id
251-
? env->NewStringUTF(current_configuration_->web_client_id)
252-
: nullptr;
246+
current_configuration_->web_client_id.empty() ? nullptr
247+
: env->NewStringUTF(current_configuration_->web_client_id.c_str());
253248

254249
jstring j_account_name =
255-
current_configuration_->account_name
256-
? env->NewStringUTF(current_configuration_->account_name)
257-
: nullptr;
250+
current_configuration_->account_name.empty() ? nullptr
251+
: env->NewStringUTF(current_configuration_->account_name.c_str());
258252

259253
jobjectArray j_auth_scopes = nullptr;
260254

261-
if (current_configuration_->additional_scope_count > 0) {
255+
if (current_configuration_->additional_scopes.size() > 0) {
262256
jclass string_clazz = FindClass("java/lang/String", activity_);
263257
j_auth_scopes = env->NewObjectArray(
264-
current_configuration_->additional_scope_count, string_clazz, nullptr);
258+
current_configuration_->additional_scopes.size(), string_clazz, nullptr);
265259

266-
for (int i = 0; i < current_configuration_->additional_scope_count; i++) {
260+
for (int i = 0; i < current_configuration_->additional_scopes.size(); i++) {
267261
env->SetObjectArrayElement(
268262
j_auth_scopes, i,
269-
env->NewStringUTF(current_configuration_->additional_scopes[i]));
263+
env->NewStringUTF(current_configuration_->additional_scopes[i].c_str()));
270264
}
271265
env->DeleteLocalRef(string_clazz);
272266
}

native-googlesignin/src/main/cpp/google_signin.h

+6-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#endif
2121

2222
#include <jni.h>
23+
#include <string>
24+
#include <vector>
2325

2426
#include "future.h" // NOLINT
2527
#include "google_signin_user.h" // NOLINT
@@ -90,7 +92,7 @@ class GoogleSignIn {
9092
/// true to use games signin, false for default signin.
9193
bool use_game_signin;
9294
/// web client id associated with this app.
93-
const char *web_client_id;
95+
std::string web_client_id;
9496
/// true for getting an auth code when authenticating.
9597
/// Note: This may trigger re-consent on iOS. Ideally, this
9698
/// is set to true once, and the result sent to the server where the
@@ -107,11 +109,11 @@ class GoogleSignIn {
107109
/// recommended for VR applications.
108110
bool hide_ui_popups;
109111
/// account name to use when authenticating, null indicates use default.
110-
const char *account_name;
112+
std::string account_name;
111113
/// additional scopes to request, requires consent.
112-
const char **additional_scopes;
113-
int additional_scope_count;
114+
std::vector<std::string> additional_scopes;
114115

116+
Configuration() = default;
115117
~Configuration() = default;
116118
Configuration(Configuration const &copy) = default;
117119
Configuration(Configuration &&move) = delete;

native-googlesignin/src/main/cpp/google_signin_bridge.cc

+21-11
Original file line numberDiff line numberDiff line change
@@ -103,17 +103,27 @@ void GoogleSignIn_Configure(GoogleSignIn_t self, bool useGameSignIn,
103103
bool requestIdToken, bool hidePopups,
104104
const char **additional_scopes, int scopes_count,
105105
const char *accountName) {
106-
self->wrapped_->Configure(googlesignin::GoogleSignIn::Configuration{
107-
.use_game_signin = useGameSignIn,
108-
.web_client_id = webClientId,
109-
.request_auth_code = requestAuthCode,
110-
.force_token_refresh = forceTokenRefresh,
111-
.request_email = requestEmail,
112-
.request_id_token = requestIdToken,
113-
.hide_ui_popups = hidePopups,
114-
.additional_scopes = additional_scopes,
115-
.additional_scope_count = scopes_count,
116-
.account_name = accountName});
106+
googlesignin::GoogleSignIn::Configuration configuration;
107+
108+
configuration.use_game_signin = useGameSignIn;
109+
if (webClientId) {
110+
configuration.web_client_id = webClientId;
111+
}
112+
configuration.request_auth_code = requestAuthCode;
113+
configuration.force_token_refresh = forceTokenRefresh;
114+
configuration.request_email = requestEmail;
115+
configuration.request_id_token = requestIdToken;
116+
configuration.hide_ui_popups = hidePopups;
117+
if (accountName) {
118+
configuration.account_name = accountName;
119+
}
120+
if (scopes_count) {
121+
for(int i=0;i<scopes_count;i++) {
122+
configuration.additional_scopes.push_back(std::string(additional_scopes[i]));
123+
}
124+
}
125+
126+
self->wrapped_->Configure(configuration);
117127
}
118128

119129
GoogleSignInFuture_t GoogleSignIn_SignIn(GoogleSignIn_t self) {

0 commit comments

Comments
 (0)