Skip to content

Commit 013e769

Browse files
committed
Index Request wrongly stores extra bytes as part of the document (trailing null bytes), closes #175.
1 parent be3c4b0 commit 013e769

File tree

14 files changed

+45
-28
lines changed

14 files changed

+45
-28
lines changed

modules/elasticsearch/src/main/java/org/elasticsearch/action/count/CountRequest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,17 +213,17 @@ int querySourceLength() {
213213
* The query source to execute.
214214
*/
215215
@Required public CountRequest query(byte[] querySource) {
216-
return query(querySource, 0, querySource.length);
216+
return query(querySource, 0, querySource.length, false);
217217
}
218218

219219
/**
220220
* The query source to execute.
221221
*/
222-
@Required public CountRequest query(byte[] querySource, int offset, int length) {
222+
@Required public CountRequest query(byte[] querySource, int offset, int length, boolean unsafe) {
223223
this.querySource = querySource;
224224
this.querySourceOffset = offset;
225225
this.querySourceLength = length;
226-
this.querySourceUnsafe = false;
226+
this.querySourceUnsafe = unsafe;
227227
return this;
228228
}
229229

modules/elasticsearch/src/main/java/org/elasticsearch/action/deletebyquery/DeleteByQueryRequest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public DeleteByQueryRequest indices(String... indices) {
103103
* The query source to execute.
104104
*/
105105
byte[] querySource() {
106-
if (querySourceUnsafe) {
106+
if (querySourceUnsafe || querySourceOffset > 0) {
107107
querySource = Arrays.copyOfRange(querySource, querySourceOffset, querySourceLength);
108108
querySourceOffset = 0;
109109
querySourceUnsafe = false;
@@ -167,17 +167,17 @@ byte[] querySource() {
167167
* The query source to execute.
168168
*/
169169
@Required public DeleteByQueryRequest query(byte[] querySource) {
170-
return query(querySource, 0, querySource.length);
170+
return query(querySource, 0, querySource.length, false);
171171
}
172172

173173
/**
174174
* The query source to execute.
175175
*/
176-
@Required public DeleteByQueryRequest query(byte[] querySource, int offset, int length) {
176+
@Required public DeleteByQueryRequest query(byte[] querySource, int offset, int length, boolean unsafe) {
177177
this.querySource = querySource;
178178
this.querySourceOffset = offset;
179179
this.querySourceLength = length;
180-
this.querySourceUnsafe = false;
180+
this.querySourceUnsafe = unsafe;
181181
return this;
182182
}
183183

modules/elasticsearch/src/main/java/org/elasticsearch/action/index/IndexRequest.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,9 @@ public IndexRequest(String index) {
126126
/**
127127
* Constructs a new index request against the index, type, id and using the source.
128128
*
129-
* @param index The index to index into
130-
* @param type The type to index into
131-
* @param id The id of document
132-
* @param source The JSON source document
129+
* @param index The index to index into
130+
* @param type The type to index into
131+
* @param id The id of document
133132
*/
134133
public IndexRequest(String index, String type, String id) {
135134
this.index = index;
@@ -214,7 +213,7 @@ public IndexRequest id(String id) {
214213
* The source of the JSON document to index.
215214
*/
216215
byte[] source() {
217-
if (sourceUnsafe) {
216+
if (sourceUnsafe || sourceOffset > 0) {
218217
source = Arrays.copyOfRange(source, sourceOffset, sourceLength);
219218
sourceOffset = 0;
220219
sourceUnsafe = false;

modules/elasticsearch/src/main/java/org/elasticsearch/action/mlt/MoreLikeThisRequest.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -372,18 +372,18 @@ public MoreLikeThisRequest searchSource(XContentBuilder builder) {
372372
* more like this documents.
373373
*/
374374
public MoreLikeThisRequest searchSource(byte[] searchSource) {
375-
return searchSource(searchSource, 0, searchSource.length);
375+
return searchSource(searchSource, 0, searchSource.length, false);
376376
}
377377

378378
/**
379379
* An optional search source request allowing to control the search request for the
380380
* more like this documents.
381381
*/
382-
public MoreLikeThisRequest searchSource(byte[] searchSource, int offset, int length) {
382+
public MoreLikeThisRequest searchSource(byte[] searchSource, int offset, int length, boolean unsafe) {
383383
this.searchSource = searchSource;
384384
this.searchSourceOffset = offset;
385385
this.searchSourceLength = length;
386-
this.searchSourceUnsafe = false;
386+
this.searchSourceUnsafe = unsafe;
387387
return this;
388388
}
389389

@@ -403,6 +403,10 @@ public int searchSourceLength() {
403403
return searchSourceLength;
404404
}
405405

406+
public boolean searchSourceUnsafe() {
407+
return searchSourceUnsafe;
408+
}
409+
406410
/**
407411
* The search type of the mlt search query.
408412
*/

modules/elasticsearch/src/main/java/org/elasticsearch/action/mlt/TransportMoreLikeThisAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ public class TransportMoreLikeThisAction extends BaseAction<MoreLikeThisRequest,
174174
)
175175
.listenerThreaded(request.listenerThreaded());
176176
if (request.searchSource() != null) {
177-
searchRequest.source(request.searchSource(), request.searchSourceOffset(), request.searchSourceLength());
177+
searchRequest.source(request.searchSource(), request.searchSourceOffset(), request.searchSourceLength(), request.searchSourceUnsafe());
178178
}
179179
searchAction.execute(searchRequest, new ActionListener<SearchResponse>() {
180180
@Override public void onResponse(SearchResponse response) {

modules/elasticsearch/src/main/java/org/elasticsearch/action/search/SearchRequest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -267,17 +267,17 @@ public SearchRequest source(XContentBuilder builder) {
267267
* The search source to execute.
268268
*/
269269
public SearchRequest source(byte[] source) {
270-
return source(source, 0, source.length);
270+
return source(source, 0, source.length, false);
271271
}
272272

273273
/**
274274
* The search source to execute.
275275
*/
276-
public SearchRequest source(byte[] source, int offset, int length) {
276+
public SearchRequest source(byte[] source, int offset, int length, boolean unsafe) {
277277
this.source = source;
278278
this.sourceOffset = offset;
279279
this.sourceLength = length;
280-
this.sourceUnsafe = false;
280+
this.sourceUnsafe = unsafe;
281281
return this;
282282
}
283283

@@ -346,17 +346,17 @@ public SearchRequest extraSource(String source) {
346346
* Allows to provide additional source that will be used as well.
347347
*/
348348
public SearchRequest extraSource(byte[] source) {
349-
return extraSource(source, 0, source.length);
349+
return extraSource(source, 0, source.length, false);
350350
}
351351

352352
/**
353353
* Allows to provide additional source that will be used as well.
354354
*/
355-
public SearchRequest extraSource(byte[] source, int offset, int length) {
355+
public SearchRequest extraSource(byte[] source, int offset, int length, boolean unsafe) {
356356
this.extraSource = source;
357357
this.extraSourceOffset = offset;
358358
this.extraSourceLength = length;
359-
this.extraSourceUnsafe = false;
359+
this.extraSourceUnsafe = unsafe;
360360
return this;
361361
}
362362

modules/elasticsearch/src/main/java/org/elasticsearch/http/netty/NettyHttpRequest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ public NettyHttpRequest(org.jboss.netty.handler.codec.http.HttpRequest request)
9595
return request.getContent().readableBytes();
9696
}
9797

98+
@Override public boolean contentUnsafe() {
99+
return request.getContent().hasArray();
100+
}
101+
98102
@Override public byte[] contentByteArray() {
99103
if (request.getContent().hasArray()) {
100104
return request.getContent().array();
@@ -109,7 +113,8 @@ public NettyHttpRequest(org.jboss.netty.handler.codec.http.HttpRequest request)
109113

110114
@Override public int contentByteArrayOffset() {
111115
if (request.getContent().hasArray()) {
112-
return request.getContent().arrayOffset();
116+
// get the array offset, and the reader index offset within it
117+
return request.getContent().arrayOffset() + request.getContent().readerIndex();
113118
}
114119
return 0;
115120
}

modules/elasticsearch/src/main/java/org/elasticsearch/rest/RestRequest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ enum Method {
5050

5151
boolean hasContent();
5252

53+
/**
54+
* Is the byte array content safe or unsafe for usage on other threads
55+
*/
56+
boolean contentUnsafe();
57+
5358
byte[] contentByteArray();
5459

5560
int contentByteArrayOffset();

modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/count/RestCountAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public class RestCountAction extends BaseRestHandler {
6565
}
6666
countRequest.operationThreading(operationThreading);
6767
if (request.hasContent()) {
68-
countRequest.query(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength());
68+
countRequest.query(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength(), true);
6969
} else {
7070
String source = request.param("source");
7171
if (source != null) {

modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/deletebyquery/RestDeleteByQueryAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public class RestDeleteByQueryAction extends BaseRestHandler {
5555
deleteByQueryRequest.listenerThreaded(false);
5656
try {
5757
if (request.hasContent()) {
58-
deleteByQueryRequest.query(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength());
58+
deleteByQueryRequest.query(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength(), request.contentUnsafe());
5959
} else {
6060
String source = request.param("source");
6161
if (source != null) {

modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/index/RestIndexAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ final class CreateHandler implements RestHandler {
5757

5858
@Override public void handleRequest(final RestRequest request, final RestChannel channel) {
5959
IndexRequest indexRequest = new IndexRequest(request.param("index"), request.param("type"), request.param("id"));
60-
indexRequest.source(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength());
60+
indexRequest.source(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength(), request.contentUnsafe());
6161
indexRequest.timeout(request.paramAsTime("timeout", IndexRequest.DEFAULT_TIMEOUT));
6262
String sOpType = request.param("op_type");
6363
if (sOpType != null) {

modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/mlt/RestMoreLikeThisAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public class RestMoreLikeThisAction extends BaseRestHandler {
7272
mltRequest.searchScroll(new Scroll(parseTimeValue(searchScroll, null)));
7373
}
7474
if (request.hasContent()) {
75-
mltRequest.searchSource(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength());
75+
mltRequest.searchSource(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength(), request.contentUnsafe());
7676
} else {
7777
String searchSource = request.param("search_source");
7878
if (searchSource != null) {

modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ private SearchRequest parseSearchRequest(RestRequest request) {
115115
SearchRequest searchRequest = new SearchRequest(indices);
116116
// get the content, and put it in the body
117117
if (request.hasContent()) {
118-
searchRequest.source(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength());
118+
searchRequest.source(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength(), request.contentUnsafe());
119119
} else {
120120
String source = request.param("source");
121121
if (source != null) {

plugins/transport/memcached/src/main/java/org/elasticsearch/memcached/MemcachedRestRequest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ public void setData(byte[] data) {
109109
return data != null;
110110
}
111111

112+
@Override public boolean contentUnsafe() {
113+
return false;
114+
}
115+
112116
@Override public byte[] contentByteArray() {
113117
return data;
114118
}

0 commit comments

Comments
 (0)