Skip to content

Commit ebc4577

Browse files
committed
Make defensive copy of bookmarks in SessionConfig builder
1 parent 9ee21c0 commit ebc4577

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

driver/src/main/java/org/neo4j/driver/SessionConfig.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,12 @@
2323

2424
import java.io.Serial;
2525
import java.io.Serializable;
26+
import java.util.ArrayList;
2627
import java.util.Arrays;
28+
import java.util.Collections;
2729
import java.util.Objects;
2830
import java.util.Optional;
31+
import java.util.stream.StreamSupport;
2932
import org.neo4j.driver.async.AsyncSession;
3033
import org.neo4j.driver.exceptions.UnsupportedFeatureException;
3134
import org.neo4j.driver.reactive.ReactiveSession;
@@ -236,7 +239,9 @@ public Builder withBookmarks(Bookmark... bookmarks) {
236239
if (bookmarks == null) {
237240
this.bookmarks = null;
238241
} else {
239-
this.bookmarks = Arrays.asList(bookmarks);
242+
// must accept null values as well
243+
//noinspection Java9CollectionFactory
244+
this.bookmarks = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(bookmarks)));
240245
}
241246
return this;
242247
}
@@ -261,7 +266,10 @@ public Builder withBookmarks(Bookmark... bookmarks) {
261266
* @return this builder
262267
*/
263268
public Builder withBookmarks(Iterable<Bookmark> bookmarks) {
264-
this.bookmarks = bookmarks;
269+
if (bookmarks != null) {
270+
this.bookmarks =
271+
StreamSupport.stream(bookmarks.spliterator(), false).toList();
272+
}
265273
return this;
266274
}
267275

driver/src/test/java/org/neo4j/driver/SessionConfigTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,32 @@ void shouldAcceptNullInBookmarks() {
148148
assertEquals(Arrays.asList(one, two, null), config2.bookmarks());
149149
}
150150

151+
@Test
152+
void shouldMakeACopyOfBookmarksArray() {
153+
var bookmark1 = parse("one");
154+
var bookmark2 = parse("two");
155+
var bookmarks = new Bookmark[] {bookmark1, bookmark2};
156+
var config = builder().withBookmarks(bookmarks).build();
157+
assertEquals(List.of(bookmark1, bookmark2), config.bookmarks());
158+
159+
bookmarks[0] = parse("three");
160+
161+
assertEquals(List.of(bookmark1, bookmark2), config.bookmarks());
162+
}
163+
164+
@Test
165+
void shouldMakeACopyOfBookmarksIterable() {
166+
var bookmark1 = parse("one");
167+
var bookmark2 = parse("two");
168+
var bookmarks = new ArrayList<>(List.of(bookmark1, bookmark2));
169+
var config = builder().withBookmarks(bookmarks).build();
170+
assertEquals(List.of(bookmark1, bookmark2), config.bookmarks());
171+
172+
bookmarks.add(parse("three"));
173+
174+
assertEquals(List.of(bookmark1, bookmark2), config.bookmarks());
175+
}
176+
151177
@ParameterizedTest
152178
@ValueSource(longs = {100, 1, 1000, Long.MAX_VALUE, -1})
153179
void shouldChangeFetchSize(long value) {

0 commit comments

Comments
 (0)