[lxc-devel] [lxd/master] lxd/db: Don't hang after bad request

stgraber on Github lxc-bot at linuxcontainers.org
Wed Jun 27 16:53:09 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 370 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180627/c92a993c/attachment.bin>
-------------- next part --------------
From 2e942e632fa23e2eab2668e9ec58f7200c6b7d7e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Wed, 27 Jun 2018 12:52:21 -0400
Subject: [PATCH] lxd/db: Don't hang after bad request
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #4692

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/api_internal.go | 29 ++++++++++++++++++++++-------
 1 file changed, 22 insertions(+), 7 deletions(-)

diff --git a/lxd/api_internal.go b/lxd/api_internal.go
index ce9529800..b92e976ab 100644
--- a/lxd/api_internal.go
+++ b/lxd/api_internal.go
@@ -189,24 +189,30 @@ func internalSQLPost(d *Daemon, r *http.Request) Response {
 		}
 
 		result := internalSQLResult{}
+
 		tx, err := db.Begin()
 		if err != nil {
 			return SmartError(err)
 		}
+
 		if strings.HasPrefix(strings.ToUpper(query), "SELECT") {
 			err = internalSQLSelect(tx, query, &result)
 			tx.Rollback()
 		} else {
 			err = internalSQLExec(tx, query, &result)
-			if err == nil {
+			if err != nil {
+				tx.Rollback()
+			} else {
 				err = tx.Commit()
 			}
 		}
 		if err != nil {
 			return SmartError(err)
 		}
+
 		batch.Results = append(batch.Results, result)
 	}
+
 	return SyncResponse(true, batch)
 }
 
@@ -214,23 +220,27 @@ func internalSQLSelect(tx *sql.Tx, query string, result *internalSQLResult) erro
 	result.Type = "select"
 	rows, err := tx.Query(query)
 	if err != nil {
-		return errors.Wrap(err, "failed to execute query")
+		return errors.Wrap(err, "Failed to execute query")
 	}
+
 	defer rows.Close()
 	result.Columns, err = rows.Columns()
 	if err != nil {
-		return errors.Wrap(err, "failed to fetch colume names")
+		return errors.Wrap(err, "Failed to fetch colume names")
 	}
+
 	for rows.Next() {
 		row := make([]interface{}, len(result.Columns))
 		rowPointers := make([]interface{}, len(result.Columns))
 		for i := range row {
 			rowPointers[i] = &row[i]
 		}
+
 		err := rows.Scan(rowPointers...)
 		if err != nil {
-			return errors.Wrap(err, "failed to scan row")
+			return errors.Wrap(err, "Failed to scan row")
 		}
+
 		for i, column := range row {
 			// Convert bytes to string. This is safe as
 			// long as we don't have any BLOB column type.
@@ -239,12 +249,15 @@ func internalSQLSelect(tx *sql.Tx, query string, result *internalSQLResult) erro
 				row[i] = string(data)
 			}
 		}
+
 		result.Rows = append(result.Rows, row)
 	}
+
 	err = rows.Err()
 	if err != nil {
-		return errors.Wrap(err, "rows error")
+		return errors.Wrap(err, "Got a row error")
 	}
+
 	return nil
 }
 
@@ -252,12 +265,14 @@ func internalSQLExec(tx *sql.Tx, query string, result *internalSQLResult) error
 	result.Type = "exec"
 	r, err := tx.Exec(query)
 	if err != nil {
-		return errors.Wrapf(err, "failed to exec query")
+		return errors.Wrapf(err, "Failed to exec query")
 	}
+
 	result.RowsAffected, err = r.RowsAffected()
 	if err != nil {
-		return errors.Wrap(err, "failed to fetch affected rows")
+		return errors.Wrap(err, "Failed to fetch affected rows")
 	}
+
 	return nil
 }
 


More information about the lxc-devel mailing list