Skip to content

Commit 27203e2

Browse files
authored
guard against invoking deleted callbacks (#744)
Check to see if Interstitial and BannerView callback pointers have been nullified before invoking them in Java.
1 parent 8bbaf8b commit 27203e2

File tree

2 files changed

+41
-26
lines changed

2 files changed

+41
-26
lines changed

admob/src_java/com/google/firebase/admob/internal/cpp/BannerViewHelper.java

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,6 @@ public void destroy(final long callbackDataPtr) {
177177
completeBannerViewFutureCallback(callbackDataPtr,
178178
ConstantsHelper.CALLBACK_ERROR_NONE,
179179
ConstantsHelper.CALLBACK_ERROR_MESSAGE_NONE);
180-
mNotifyBoundingBoxListenerOnNextDraw.set(true);
181180
}
182181

183182
/**
@@ -484,7 +483,7 @@ public class AdViewListener extends AdListener implements OnPaidEventListener {
484483
@Override
485484
public void onAdClicked() {
486485
synchronized (mBannerViewLock) {
487-
if (mAdView != null) {
486+
if (mBannerViewInternalPtr != CPP_NULLPTR) {
488487
notifyAdClicked(mBannerViewInternalPtr);
489488
}
490489
}
@@ -494,7 +493,7 @@ public void onAdClicked() {
494493
@Override
495494
public void onAdClosed() {
496495
synchronized (mBannerViewLock) {
497-
if (mAdView != null) {
496+
if (mBannerViewInternalPtr != CPP_NULLPTR) {
498497
notifyAdClosed(mBannerViewInternalPtr);
499498
mNotifyBoundingBoxListenerOnNextDraw.set(true);
500499
}
@@ -505,18 +504,18 @@ public void onAdClosed() {
505504
@Override
506505
public void onAdFailedToLoad(LoadAdError loadAdError) {
507506
synchronized (mBannerViewLock) {
508-
if (mAdView != null) {
507+
if (mLoadAdCallbackDataPtr != CPP_NULLPTR) {
509508
completeBannerViewLoadAdError(mLoadAdCallbackDataPtr, loadAdError, loadAdError.getCode(), loadAdError.getMessage());
509+
mLoadAdCallbackDataPtr = CPP_NULLPTR;
510510
}
511-
mLoadAdCallbackDataPtr = CPP_NULLPTR;
512511
}
513512
super.onAdFailedToLoad(loadAdError);
514513
}
515514

516515
@Override
517516
public void onAdImpression() {
518517
synchronized (mBannerViewLock) {
519-
if (mAdView != null) {
518+
if (mBannerViewInternalPtr != CPP_NULLPTR) {
520519
notifyAdImpression(mBannerViewInternalPtr);
521520
}
522521
}
@@ -528,13 +527,15 @@ public void onAdLoaded() {
528527
synchronized (mBannerViewLock) {
529528
if (mAdView != null) {
530529
mAdViewContainsAd = true;
530+
}
531+
if (mLoadAdCallbackDataPtr != CPP_NULLPTR) {
531532
completeBannerViewLoadedAd(mLoadAdCallbackDataPtr);
532533
mLoadAdCallbackDataPtr = CPP_NULLPTR;
533-
// Only update the bounding box if the banner view is already visible.
534-
if (mPopUp != null && mPopUp.isShowing()) {
535-
// Loading an ad can sometimes cause the bounds to change.
536-
mNotifyBoundingBoxListenerOnNextDraw.set(true);
537-
}
534+
}
535+
// Only update the bounding box if the banner view is already visible.
536+
if (mPopUp != null && mPopUp.isShowing()) {
537+
// Loading an ad can sometimes cause the bounds to change.
538+
mNotifyBoundingBoxListenerOnNextDraw.set(true);
538539
}
539540
}
540541
super.onAdLoaded();
@@ -543,17 +544,17 @@ public void onAdLoaded() {
543544
@Override
544545
public void onAdOpened() {
545546
synchronized (mBannerViewLock) {
546-
if (mAdView != null) {
547+
if (mBannerViewInternalPtr != CPP_NULLPTR) {
547548
notifyAdOpened(mBannerViewInternalPtr);
548-
mNotifyBoundingBoxListenerOnNextDraw.set(true);
549549
}
550+
mNotifyBoundingBoxListenerOnNextDraw.set(true);
550551
}
551552
super.onAdOpened();
552553
}
553554

554555
public void onPaidEvent(AdValue value) {
555556
synchronized (mBannerViewLock) {
556-
if (mAdView != null) {
557+
if (mBannerViewInternalPtr != CPP_NULLPTR) {
557558
notifyPaidEvent(mBannerViewInternalPtr, value.getCurrencyCode(),
558559
value.getPrecisionType(), value.getValueMicros());
559560
}
@@ -575,7 +576,7 @@ public void onPaidEvent(AdValue value) {
575576
@Override
576577
public boolean onPreDraw() {
577578
if (mNotifyBoundingBoxListenerOnNextDraw.compareAndSet(true, false)) {
578-
if (mAdView != null) {
579+
if (mAdView != null && mBannerViewInternalPtr != CPP_NULLPTR) {
579580
notifyBoundingBoxChanged(mBannerViewInternalPtr);
580581
}
581582
}

admob/src_java/com/google/firebase/admob/internal/cpp/InterstitialAdHelper.java

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -219,35 +219,45 @@ private class InterstitialAdFullScreenContentListener
219219
@Override
220220
public void onAdClicked() {
221221
synchronized (mInterstitialLock) {
222-
notifyAdClickedFullScreenContentEvent(mInterstitialAdInternalPtr);
222+
if (mInterstitialAdInternalPtr != CPP_NULLPTR) {
223+
notifyAdClickedFullScreenContentEvent(mInterstitialAdInternalPtr);
224+
}
223225
}
224226
}
225227

226228
@Override
227229
public void onAdDismissedFullScreenContent() {
228230
synchronized (mInterstitialLock) {
229-
notifyAdDismissedFullScreenContentEvent(mInterstitialAdInternalPtr);
231+
if (mInterstitialAdInternalPtr != CPP_NULLPTR) {
232+
notifyAdDismissedFullScreenContentEvent(mInterstitialAdInternalPtr);
233+
}
230234
}
231235
}
232236

233237
@Override
234238
public void onAdFailedToShowFullScreenContent(AdError error) {
235239
synchronized (mInterstitialLock) {
236-
notifyAdFailedToShowFullScreenContentEvent(mInterstitialAdInternalPtr, error);
240+
if (mInterstitialAdInternalPtr != CPP_NULLPTR) {
241+
notifyAdFailedToShowFullScreenContentEvent(mInterstitialAdInternalPtr, error);
242+
}
237243
}
238244
}
239245

240246
@Override
241247
public void onAdImpression() {
242248
synchronized (mInterstitialLock) {
243-
notifyAdImpressionEvent(mInterstitialAdInternalPtr);
249+
if (mInterstitialAdInternalPtr != CPP_NULLPTR) {
250+
notifyAdImpressionEvent(mInterstitialAdInternalPtr);
251+
}
244252
}
245253
}
246254

247255
@Override
248256
public void onAdShowedFullScreenContent() {
249257
synchronized (mInterstitialLock) {
250-
notifyAdShowedFullScreenContentEvent(mInterstitialAdInternalPtr);
258+
if (mInterstitialAdInternalPtr != CPP_NULLPTR) {
259+
notifyAdShowedFullScreenContentEvent(mInterstitialAdInternalPtr);
260+
}
251261
}
252262
}
253263

@@ -263,10 +273,12 @@ private class InterstitialAdListener extends InterstitialAdLoadCallback {
263273
@Override
264274
public void onAdFailedToLoad(LoadAdError loadAdError) {
265275
synchronized (mInterstitialLock) {
266-
completeInterstitialLoadAdError(
267-
mLoadAdCallbackDataPtr, loadAdError, loadAdError.getCode(),
268-
loadAdError.getMessage());
269-
mLoadAdCallbackDataPtr = CPP_NULLPTR;
276+
if (mLoadAdCallbackDataPtr != CPP_NULLPTR) {
277+
completeInterstitialLoadAdError(
278+
mLoadAdCallbackDataPtr, loadAdError, loadAdError.getCode(),
279+
loadAdError.getMessage());
280+
mLoadAdCallbackDataPtr = CPP_NULLPTR;
281+
}
270282
}
271283
}
272284

@@ -277,8 +289,10 @@ public void onAdLoaded(InterstitialAd ad) {
277289
InterstitialAdFullScreenContentListener listener = new InterstitialAdFullScreenContentListener();
278290
mInterstitial.setFullScreenContentCallback(listener);
279291
mInterstitial.setOnPaidEventListener(listener);
280-
completeInterstitialLoadedAd(mLoadAdCallbackDataPtr);
281-
mLoadAdCallbackDataPtr = CPP_NULLPTR;
292+
if (mLoadAdCallbackDataPtr != CPP_NULLPTR) {
293+
completeInterstitialLoadedAd(mLoadAdCallbackDataPtr);
294+
mLoadAdCallbackDataPtr = CPP_NULLPTR;
295+
}
282296
}
283297
}
284298
}

0 commit comments

Comments
 (0)