diff --git a/internal/proxy/validate_util.go b/internal/proxy/validate_util.go index 6531f425ce..0fe0740343 100644 --- a/internal/proxy/validate_util.go +++ b/internal/proxy/validate_util.go @@ -1,6 +1,7 @@ package proxy import ( + "encoding/json" "fmt" "math" "reflect" @@ -341,6 +342,18 @@ func (v *validateUtil) checkJSONFieldData(field *schemapb.FieldData, fieldSchema } } + var jsonMap map[string]interface{} + for _, data := range jsonArray { + err := json.Unmarshal(data, &jsonMap) + if err != nil { + log.Warn("insert invalid JSON data", + zap.ByteString("data", data), + zap.Error(err), + ) + return merr.WrapErrIoFailedReason(err.Error()) + } + } + return nil } diff --git a/internal/proxy/validate_util_test.go b/internal/proxy/validate_util_test.go index 1bd2ed9a7d..123f84c1a2 100644 --- a/internal/proxy/validate_util_test.go +++ b/internal/proxy/validate_util_test.go @@ -3209,4 +3209,27 @@ func Test_validateUtil_checkJSONData(t *testing.T) { err := v.checkJSONFieldData(data, f) assert.Error(t, err) }) + + t.Run("invalid_JSON_data", func(t *testing.T) { + v := newValidateUtil(withOverflowCheck(), withMaxLenCheck()) + jsonData := "hello" + f := &schemapb.FieldSchema{ + DataType: schemapb.DataType_JSON, + } + data := &schemapb.FieldData{ + FieldName: "json", + Field: &schemapb.FieldData_Scalars{ + Scalars: &schemapb.ScalarField{ + Data: &schemapb.ScalarField_JsonData{ + JsonData: &schemapb.JSONArray{ + Data: [][]byte{[]byte(jsonData)}, + }, + }, + }, + }, + } + + err := v.checkJSONFieldData(data, f) + assert.Error(t, err) + }) }