Skip to content

Commit ba3e841

Browse files
author
Chris Elder
committed
[FAB-7954] Errors not handled for JSON marshaling
Upon code review in statecouchdb.go and couchdb.go, it appears there are occurrences of the following error producing functions without errors captured and handled: json.Marshal() json.Unmarhsal() decoder.Decode() e.g. json.NewDecoder(resp.Body).Decode(&dbResponse) e.g. decoder.Decode(&genericMap) Change-Id: Id632d636d7e2de817abb60961f908f7ad5222bec Signed-off-by: Chris Elder <chris.elder@us.ibm.com>
1 parent ec639a6 commit ba3e841

File tree

1 file changed

+36
-13
lines changed

1 file changed

+36
-13
lines changed

core/ledger/util/couchdb/couchdb.go

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,6 @@ func (dbclient *CouchDatabase) CreateDatabaseIfNotExist() error {
312312

313313
return err
314314
}
315-
316315
defer closeResponseBody(resp)
317316

318317
logger.Infof("Created state database %s", dbclient.DBName)
@@ -343,7 +342,10 @@ func (dbclient *CouchDatabase) GetDatabaseInfo() (*DBInfo, *DBReturn, error) {
343342
defer closeResponseBody(resp)
344343

345344
dbResponse := &DBInfo{}
346-
json.NewDecoder(resp.Body).Decode(&dbResponse)
345+
decodeErr := json.NewDecoder(resp.Body).Decode(&dbResponse)
346+
if decodeErr != nil {
347+
return nil, nil, decodeErr
348+
}
347349

348350
// trace the database info response
349351
if logger.IsEnabledFor(logging.DEBUG) {
@@ -382,9 +384,9 @@ func (couchInstance *CouchInstance) VerifyCouchConfig() (*ConnectionInfo, *DBRet
382384
defer closeResponseBody(resp)
383385

384386
dbResponse := &ConnectionInfo{}
385-
errJSON := json.NewDecoder(resp.Body).Decode(&dbResponse)
386-
if errJSON != nil {
387-
return nil, nil, fmt.Errorf("Unable to connect to CouchDB, check the hostname and port: %s", errJSON.Error())
387+
decodeErr := json.NewDecoder(resp.Body).Decode(&dbResponse)
388+
if decodeErr != nil {
389+
return nil, nil, decodeErr
388390
}
389391

390392
// trace the database info response
@@ -429,7 +431,10 @@ func (dbclient *CouchDatabase) DropDatabase() (*DBOperationResponse, error) {
429431
defer closeResponseBody(resp)
430432

431433
dbResponse := &DBOperationResponse{}
432-
json.NewDecoder(resp.Body).Decode(&dbResponse)
434+
decodeErr := json.NewDecoder(resp.Body).Decode(&dbResponse)
435+
if decodeErr != nil {
436+
return nil, decodeErr
437+
}
433438

434439
if dbResponse.Ok == true {
435440
logger.Debugf("Dropped database %s ", dbclient.DBName)
@@ -470,7 +475,10 @@ func (dbclient *CouchDatabase) EnsureFullCommit() (*DBOperationResponse, error)
470475
defer closeResponseBody(resp)
471476

472477
dbResponse := &DBOperationResponse{}
473-
json.NewDecoder(resp.Body).Decode(&dbResponse)
478+
decodeErr := json.NewDecoder(resp.Body).Decode(&dbResponse)
479+
if decodeErr != nil {
480+
return nil, decodeErr
481+
}
474482

475483
if dbResponse.Ok == true {
476484
logger.Debugf("_ensure_full_commit database %s ", dbclient.DBName)
@@ -626,7 +634,10 @@ func createAttachmentPart(couchDoc *CouchDoc, defaultBoundary string) (bytes.Buf
626634
//unmarshal the data into the generic map
627635
decoder := json.NewDecoder(bytes.NewBuffer(couchDoc.JSONValue))
628636
decoder.UseNumber()
629-
decoder.Decode(&genericMap)
637+
decodeErr := decoder.Decode(&genericMap)
638+
if decodeErr != nil {
639+
return *writeBuffer, "", decodeErr
640+
}
630641

631642
//add all key/values to the attachmentJSONMap
632643
for jsonKey, jsonValue := range genericMap {
@@ -635,7 +646,11 @@ func createAttachmentPart(couchDoc *CouchDoc, defaultBoundary string) (bytes.Buf
635646

636647
}
637648

638-
filesForUpload, _ := json.Marshal(attachmentJSONMap)
649+
filesForUpload, err := json.Marshal(attachmentJSONMap)
650+
if err != nil {
651+
return *writeBuffer, "", err
652+
}
653+
639654
logger.Debugf(string(filesForUpload))
640655

641656
//create the header for the JSON
@@ -1336,7 +1351,10 @@ func (dbclient *CouchDatabase) BatchUpdateDocuments(documents []*CouchDoc) ([]*B
13361351
var document = make(map[string]interface{})
13371352

13381353
//unmarshal the JSON component of the CouchDoc into the document
1339-
json.Unmarshal(jsonDocument.JSONValue, &document)
1354+
err = json.Unmarshal(jsonDocument.JSONValue, &document)
1355+
if err != nil {
1356+
return nil, err
1357+
}
13401358

13411359
//iterate through any attachments
13421360
if len(jsonDocument.Attachments) > 0 {
@@ -1365,7 +1383,6 @@ func (dbclient *CouchDatabase) BatchUpdateDocuments(documents []*CouchDoc) ([]*B
13651383
documentMap["docs"] = jsonDocumentMap
13661384

13671385
bulkDocsJSON, err := json.Marshal(documentMap)
1368-
13691386
if err != nil {
13701387
return nil, err
13711388
}
@@ -1557,7 +1574,10 @@ func (couchInstance *CouchInstance) handleRequest(method, connectURL string, dat
15571574
errorBytes := []byte(jsonError)
15581575

15591576
//Unmarshal the response
1560-
json.Unmarshal(errorBytes, &couchDBReturn)
1577+
err = json.Unmarshal(errorBytes, &couchDBReturn)
1578+
if err != nil {
1579+
return nil, nil, err
1580+
}
15611581

15621582
//Log the 500 error with the retry count and continue
15631583
logger.Warningf("Retrying couchdb request in %s. Attempt:%v Couch DB Error:%s, Status Code:%v Reason:%v",
@@ -1604,7 +1624,10 @@ func (couchInstance *CouchInstance) handleRequest(method, connectURL string, dat
16041624
errorBytes := []byte(jsonError)
16051625

16061626
//marshal the response
1607-
json.Unmarshal(errorBytes, &couchDBReturn)
1627+
err = json.Unmarshal(errorBytes, &couchDBReturn)
1628+
if err != nil {
1629+
return nil, nil, err
1630+
}
16081631

16091632
logger.Debugf("Couch DB Error:%s, Status Code:%v, Reason:%s",
16101633
couchDBReturn.Error, resp.StatusCode, couchDBReturn.Reason)

0 commit comments

Comments
 (0)