Implement error_abort (from upstream).

Change-Id: Id0f4affa23f60def3a221cb3643c5038cca265ad
diff --git a/include/qapi/error.h b/include/qapi/error.h
index 7d4c696..d3ef7f4 100644
--- a/include/qapi/error.h
+++ b/include/qapi/error.h
@@ -95,4 +95,9 @@
  */
 void error_free(Error *err);
 
+/**
+ * If passed to error_set and friends, abort().
+ */
+
+extern Error *error_abort;
 #endif
diff --git a/util/error.c b/util/error.c
index 3ee362a..a059cfe 100644
--- a/util/error.c
+++ b/util/error.c
@@ -23,6 +23,7 @@
     ErrorClass err_class;
 };
 
+Error *error_abort;
 void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...)
 {
     Error *err;
@@ -40,6 +41,10 @@
     err->msg = g_strdup_vprintf(fmt, ap);
     va_end(ap);
     err->err_class = err_class;
+    if (errp == &error_abort) {
+        error_report("%s", error_get_pretty(err));
+        abort();
+    }
 
     *errp = err;
 
@@ -71,6 +76,10 @@
     }
     va_end(ap);
     err->err_class = err_class;
+    if (errp == &error_abort) {
+        error_report("%s", error_get_pretty(err));
+        abort();
+    }
 
     *errp = err;
 
@@ -111,6 +120,10 @@
     }
     va_end(ap);
     err->err_class = err_class;
+    if (errp == &error_abort) {
+        error_report("%s", error_get_pretty(err));
+        abort();
+    }
 
     *errp = err;
 }
@@ -153,7 +166,10 @@
 
 void error_propagate(Error **dst_err, Error *local_err)
 {
-    if (dst_err && !*dst_err) {
+    if (local_err && dst_err == &error_abort) {
+        error_report("%s", error_get_pretty(local_err));
+        abort();
+    } else if (dst_err && !*dst_err) {
         *dst_err = local_err;
     } else if (local_err) {
         error_free(local_err);