Skip to content

Commit 1683182

Browse files
authored
fix JSON datatype string value truncated by '\0' (#5482)
1 parent 1e37fe2 commit 1683182

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/JsonConversion.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ private static Json_Value parse_scalar(int type, LogBuffer buffer, long len, Cha
158158
throw new IllegalArgumentException("illegal json data");
159159
}
160160
return new Json_Value(Json_enum_type.STRING,
161-
buffer.rewind().forward((int) n).getFixString((int) str_len, charset));
161+
buffer.rewind().forward((int) n).getFixStringIgnore0000((int) str_len, charset));
162162
case JSONB_TYPE_OPAQUE:
163163
/*
164164
* There should always be at least one byte, which tells the field type of the
@@ -257,7 +257,7 @@ public String key(int i, Charset charset) {
257257
// entry, always two
258258
// bytes.
259259
long key_length = m_data.getUint16();
260-
return m_data.rewind().forward((int) key_offset).getFixString((int) key_length, charset);
260+
return m_data.rewind().forward((int) key_offset).getFixStringIgnore0000((int) key_length, charset);
261261
}
262262

263263
public Json_Value element(int i, Charset charset) {
@@ -400,7 +400,7 @@ public StringBuilder toJsonString(StringBuilder buf, Charset charset) {
400400
}
401401
buf.append('"').append(text).append('"');
402402
} else {
403-
text = m_data.getFixString((int) m_length, charset);
403+
text = m_data.getFixStringIgnore0000((int) m_length, charset);
404404
buf.append('"').append(escapse(text)).append('"');
405405
}
406406

dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/LogBuffer.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,6 +1156,22 @@ public final String getFixString(final int len, Charset charset) {
11561156
return string;
11571157
}
11581158

1159+
/**
1160+
* Return next fix length string from buffer. ignore \0
1161+
*/
1162+
public final String getFixStringIgnore0000(final int len, Charset charset) {
1163+
if (position + len > origin + limit) {
1164+
throw new IllegalArgumentException("limit excceed: " + (position + len - origin));
1165+
}
1166+
1167+
final int from = position;
1168+
byte[] buf = buffer;
1169+
1170+
String string = new String(buf, from, len, charset);
1171+
position += len;
1172+
return string;
1173+
}
1174+
11591175
public final String getFixName(final int len, Charset charset) {
11601176
if (position + len > origin + limit) {
11611177
throw new IllegalArgumentException("limit excceed: " + (position + len - origin));

0 commit comments

Comments
 (0)