Skip to content

Commit 3e0977d

Browse files
authored
3.x: Fix map() conditional chain causing NPE (#7040)
1 parent 343be6a commit 3e0977d

File tree

3 files changed

+40
-2
lines changed

3 files changed

+40
-2
lines changed

src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableMap.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,12 @@ public void onNext(T t) {
115115
@Override
116116
public boolean tryOnNext(T t) {
117117
if (done) {
118-
return false;
118+
return true;
119+
}
120+
121+
if (sourceMode != NONE) {
122+
downstream.tryOnNext(null);
123+
return true;
119124
}
120125

121126
U v;

src/test/java/io/reactivex/rxjava3/internal/jdk8/FlowableMapOptionalTest.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@
2424
import io.reactivex.rxjava3.exceptions.TestException;
2525
import io.reactivex.rxjava3.functions.Function;
2626
import io.reactivex.rxjava3.internal.fuseable.QueueFuseable;
27+
import io.reactivex.rxjava3.internal.schedulers.ImmediateThinScheduler;
2728
import io.reactivex.rxjava3.internal.subscriptions.BooleanSubscription;
2829
import io.reactivex.rxjava3.processors.*;
29-
import io.reactivex.rxjava3.testsupport.TestHelper;
30+
import io.reactivex.rxjava3.testsupport.*;
3031

3132
public class FlowableMapOptionalTest extends RxJavaTest {
3233

@@ -467,4 +468,20 @@ public void boundaryFusedMixedConditional() {
467468
.assertFusionMode(QueueFuseable.NONE)
468469
.assertResult(2, 4, 6, 8, 10);
469470
}
471+
472+
@Test
473+
public void conditionalFusionNoNPE() {
474+
TestSubscriberEx<Object> ts = new TestSubscriberEx<>()
475+
.setInitialFusionMode(QueueFuseable.ANY);
476+
477+
Flowable.empty()
478+
.observeOn(ImmediateThinScheduler.INSTANCE)
479+
.filter(v -> true)
480+
.mapOptional(Optional::of)
481+
.filter(v -> true)
482+
.subscribe(ts)
483+
;
484+
485+
ts.assertResult();
486+
}
470487
}

src/test/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableMapTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import io.reactivex.rxjava3.functions.*;
2929
import io.reactivex.rxjava3.internal.functions.Functions;
3030
import io.reactivex.rxjava3.internal.fuseable.*;
31+
import io.reactivex.rxjava3.internal.schedulers.ImmediateThinScheduler;
3132
import io.reactivex.rxjava3.internal.subscriptions.BooleanSubscription;
3233
import io.reactivex.rxjava3.plugins.RxJavaPlugins;
3334
import io.reactivex.rxjava3.processors.*;
@@ -617,4 +618,19 @@ public Object apply(Flowable<Object> f) throws Exception {
617618
}, false, 1, 1, 1);
618619
}
619620

621+
@Test
622+
public void conditionalFusionNoNPE() {
623+
TestSubscriberEx<Object> ts = new TestSubscriberEx<>()
624+
.setInitialFusionMode(QueueFuseable.ANY);
625+
626+
Flowable.empty()
627+
.observeOn(ImmediateThinScheduler.INSTANCE)
628+
.filter(v -> true)
629+
.map(v -> v)
630+
.filter(v -> true)
631+
.subscribe(ts)
632+
;
633+
634+
ts.assertResult();
635+
}
620636
}

0 commit comments

Comments
 (0)