You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ma...@apache.org on 2017/03/07 00:05:07 UTC

[12/50] incubator-mynewt-core git commit: MYNEWT-647 Changes to NMP over OIC scheme

MYNEWT-647 Changes to NMP over OIC scheme

Update NMP handlers to account for new scheme.  Now the top-level
handler creates and closes the response root map rather than each
handler.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/5f24475b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/5f24475b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/5f24475b

Branch: refs/heads/1_0_0_dev
Commit: 5f24475b194abf8869c47bc750cb3b8d0c409154
Parents: 1209a41
Author: Christopher Collins <cc...@apache.org>
Authored: Wed Mar 1 17:48:55 2017 -0800
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Mon Mar 6 15:49:04 2017 -0800

----------------------------------------------------------------------
 fs/fs/src/fs_nmgr.c                   |  63 +++++---------
 mgmt/imgmgr/src/imgmgr.c              |  38 +++------
 mgmt/imgmgr/src/imgmgr_coredump.c     |  70 ++++++++-------
 mgmt/imgmgr/src/imgmgr_state.c        |  41 ++++-----
 mgmt/newtmgr/nmgr_os/src/newtmgr_os.c | 132 ++++++++++++++---------------
 mgmt/newtmgr/src/newtmgr.c            |  54 ++++++++++--
 sys/config/src/config_nmgr.c          |   8 +-
 sys/log/full/src/log_nmgr.c           |  81 ++++++++----------
 sys/stats/full/src/stats_nmgr.c       |  51 +++++------
 test/crash_test/src/crash_nmgr.c      |  23 +++--
 test/runtest/src/runtest_nmgr.c       |  21 ++---
 11 files changed, 274 insertions(+), 308 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5f24475b/fs/fs/src/fs_nmgr.c
----------------------------------------------------------------------
diff --git a/fs/fs/src/fs_nmgr.c b/fs/fs/src/fs_nmgr.c
index d04d768..bd87697 100644
--- a/fs/fs/src/fs_nmgr.c
+++ b/fs/fs/src/fs_nmgr.c
@@ -90,19 +90,15 @@ fs_nmgr_file_download(struct mgmt_cbuf *cb)
     uint32_t out_len;
     struct fs_file *file;
     CborError g_err = CborNoError;
-    CborEncoder *penc = &cb->encoder;
-    CborEncoder rsp;
 
     rc = cbor_read_object(&cb->it, dload_attr);
     if (rc || off == UINT_MAX) {
-        rc = MGMT_ERR_EINVAL;
-        goto err;
+        return MGMT_ERR_EINVAL;
     }
 
     rc = fs_open(tmp_str, FS_ACCESS_READ, &file);
     if (rc || !file) {
-        rc = MGMT_ERR_ENOMEM;
-        goto err;
+        return MGMT_ERR_ENOMEM;
     }
 
     rc = fs_seek(file, off);
@@ -116,34 +112,30 @@ fs_nmgr_file_download(struct mgmt_cbuf *cb)
         goto err_close;
     }
 
-    g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength);
-
-    g_err |= cbor_encode_text_stringz(&rsp, "off");
-    g_err |= cbor_encode_uint(&rsp, off);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "off");
+    g_err |= cbor_encode_uint(&cb->encoder, off);
 
-    g_err |= cbor_encode_text_stringz(&rsp, "data");
-    g_err |= cbor_encode_byte_string(&rsp, img_data, out_len);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "data");
+    g_err |= cbor_encode_byte_string(&cb->encoder, img_data, out_len);
 
-    g_err |= cbor_encode_text_stringz(&rsp, "rc");
-    g_err |= cbor_encode_int(&rsp, MGMT_ERR_EOK);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "rc");
+    g_err |= cbor_encode_int(&cb->encoder, MGMT_ERR_EOK);
     if (off == 0) {
         rc = fs_filelen(file, &out_len);
-        g_err |= cbor_encode_text_stringz(&rsp, "len");
-        g_err |= cbor_encode_uint(&rsp, out_len);
+        g_err |= cbor_encode_text_stringz(&cb->encoder, "len");
+        g_err |= cbor_encode_uint(&cb->encoder, out_len);
     }
-    g_err |= cbor_encoder_close_container(penc, &rsp);
 
     fs_close(file);
     if (g_err) {
-          return MGMT_ERR_ENOMEM;
+        return MGMT_ERR_ENOMEM;
     }
+
     return 0;
 
 err_close:
     fs_close(file);
-err:
-    mgmt_cbuf_setoerr(cb, rc);
-    return 0;
+    return rc;
 }
 
 static int
@@ -183,14 +175,11 @@ fs_nmgr_file_upload(struct mgmt_cbuf *cb)
         [4] = { 0 },
     };
     CborError g_err = CborNoError;
-    CborEncoder *penc = &cb->encoder;
-    CborEncoder rsp;
     int rc;
 
     rc = cbor_read_object(&cb->it, off_attr);
     if (rc || off == UINT_MAX) {
-        rc = MGMT_ERR_EINVAL;
-        goto err;
+        return MGMT_ERR_EINVAL;
     }
 
     if (off == 0) {
@@ -201,8 +190,7 @@ fs_nmgr_file_upload(struct mgmt_cbuf *cb)
         fs_nmgr_state.upload.size = size;
 
         if (!strlen(file_name)) {
-            rc = MGMT_ERR_EINVAL;
-            goto err;
+            return MGMT_ERR_EINVAL;
         }
         if (fs_nmgr_state.upload.file) {
             fs_close(fs_nmgr_state.upload.file);
@@ -211,8 +199,7 @@ fs_nmgr_file_upload(struct mgmt_cbuf *cb)
         rc = fs_open(file_name, FS_ACCESS_WRITE | FS_ACCESS_TRUNCATE,
           &fs_nmgr_state.upload.file);
         if (rc) {
-            rc = MGMT_ERR_EINVAL;
-            goto err;
+            return MGMT_ERR_EINVAL;
         }
     } else if (off != fs_nmgr_state.upload.off) {
         /*
@@ -223,8 +210,7 @@ fs_nmgr_file_upload(struct mgmt_cbuf *cb)
     }
 
     if (!fs_nmgr_state.upload.file) {
-        rc = MGMT_ERR_EINVAL;
-        goto err;
+        return MGMT_ERR_EINVAL;
     }
     if (img_len) {
         rc = fs_write(fs_nmgr_state.upload.file, img_data, img_len);
@@ -239,13 +225,12 @@ fs_nmgr_file_upload(struct mgmt_cbuf *cb)
             fs_nmgr_state.upload.file = NULL;
         }
     }
+
 out:
-    g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "rc");
-    g_err |= cbor_encode_int(&rsp, MGMT_ERR_EOK);
-    g_err |= cbor_encode_text_stringz(&rsp, "off");
-    g_err |= cbor_encode_uint(&rsp, fs_nmgr_state.upload.off);
-    g_err |= cbor_encoder_close_container(penc, &rsp);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "rc");
+    g_err |= cbor_encode_int(&cb->encoder, MGMT_ERR_EOK);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "off");
+    g_err |= cbor_encode_uint(&cb->encoder, fs_nmgr_state.upload.off);
     if (g_err) {
         return MGMT_ERR_ENOMEM;
     }
@@ -254,9 +239,7 @@ out:
 err_close:
     fs_close(fs_nmgr_state.upload.file);
     fs_nmgr_state.upload.file = NULL;
-err:
-    mgmt_cbuf_setoerr(cb, rc);
-    return 0;
+    return rc;
 }
 
 int

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5f24475b/mgmt/imgmgr/src/imgmgr.c
----------------------------------------------------------------------
diff --git a/mgmt/imgmgr/src/imgmgr.c b/mgmt/imgmgr/src/imgmgr.c
index 32744e2..7b4431e 100644
--- a/mgmt/imgmgr/src/imgmgr.c
+++ b/mgmt/imgmgr/src/imgmgr.c
@@ -257,14 +257,11 @@ imgr_upload(struct mgmt_cbuf *cb)
     int best;
     int rc;
     int i;
-    CborEncoder *penc = &cb->encoder;
-    CborEncoder rsp;
     CborError g_err = CborNoError;
 
     rc = cbor_read_object(&cb->it, off_attr);
     if (rc || off == UINT_MAX) {
-        rc = MGMT_ERR_EINVAL;
-        goto err;
+        return MGMT_ERR_EINVAL;
     }
 
     if (off == 0) {
@@ -272,13 +269,11 @@ imgr_upload(struct mgmt_cbuf *cb)
             /*
              * Image header is the first thing in the image.
              */
-            rc = MGMT_ERR_EINVAL;
-            goto err;
+            return MGMT_ERR_EINVAL;
         }
         hdr = (struct image_header *)img_data;
         if (hdr->ih_magic != IMAGE_MAGIC) {
-            rc = MGMT_ERR_EINVAL;
-            goto err;
+            return MGMT_ERR_EINVAL;
         }
 
         /*
@@ -318,12 +313,10 @@ imgr_upload(struct mgmt_cbuf *cb)
             }
             rc = flash_area_open(area_id, &imgr_state.upload.fa);
             if (rc) {
-                rc = MGMT_ERR_EINVAL;
-                goto err;
+                return MGMT_ERR_EINVAL;
             }
             if (IMAGE_SIZE(hdr) > imgr_state.upload.fa->fa_size) {
-                rc = MGMT_ERR_EINVAL;
-                goto err;
+                return MGMT_ERR_EINVAL;
             }
             /*
              * XXX only erase if needed.
@@ -334,8 +327,7 @@ imgr_upload(struct mgmt_cbuf *cb)
             /*
              * No slot where to upload!
              */
-            rc = MGMT_ERR_ENOMEM;
-            goto err;
+            return MGMT_ERR_ENOMEM;
         }
     } else if (off != imgr_state.upload.off) {
         /*
@@ -346,8 +338,7 @@ imgr_upload(struct mgmt_cbuf *cb)
     }
 
     if (!imgr_state.upload.fa) {
-        rc = MGMT_ERR_EINVAL;
-        goto err;
+        return MGMT_ERR_EINVAL;
     }
     if (data_len) {
         rc = flash_area_write(imgr_state.upload.fa, imgr_state.upload.off,
@@ -363,13 +354,12 @@ imgr_upload(struct mgmt_cbuf *cb)
             imgr_state.upload.fa = NULL;
         }
     }
+
 out:
-    g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "rc");
-    g_err |= cbor_encode_int(&rsp, MGMT_ERR_EOK);
-    g_err |= cbor_encode_text_stringz(&rsp, "off");
-    g_err |= cbor_encode_int(&rsp, imgr_state.upload.off);
-    g_err |= cbor_encoder_close_container(penc, &rsp);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "rc");
+    g_err |= cbor_encode_int(&cb->encoder, MGMT_ERR_EOK);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "off");
+    g_err |= cbor_encode_int(&cb->encoder, imgr_state.upload.off);
 
     if (g_err) {
         return MGMT_ERR_ENOMEM;
@@ -378,9 +368,7 @@ out:
 err_close:
     flash_area_close(imgr_state.upload.fa);
     imgr_state.upload.fa = NULL;
-err:
-    mgmt_cbuf_setoerr(cb, rc);
-    return 0;
+    return rc;
 }
 
 void

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5f24475b/mgmt/imgmgr/src/imgmgr_coredump.c
----------------------------------------------------------------------
diff --git a/mgmt/imgmgr/src/imgmgr_coredump.c b/mgmt/imgmgr/src/imgmgr_coredump.c
index df3e321..48058c9 100644
--- a/mgmt/imgmgr/src/imgmgr_coredump.c
+++ b/mgmt/imgmgr/src/imgmgr_coredump.c
@@ -40,20 +40,24 @@ imgr_core_list(struct mgmt_cbuf *cb)
     int rc;
 
     rc = flash_area_open(MYNEWT_VAL(COREDUMP_FLASH_AREA), &fa);
-    if (rc) {
-        rc = MGMT_ERR_EINVAL;
-    } else {
-        rc = flash_area_read(fa, 0, &hdr, sizeof(hdr));
-        if (rc != 0) {
-            rc = MGMT_ERR_EINVAL;
-        } else if (hdr.ch_magic != COREDUMP_MAGIC) {
-            rc = MGMT_ERR_ENOENT;
-        } else {
-            rc = 0;
-        }
+    if (rc != 0) {
+        return MGMT_ERR_EUNKNOWN;
+    }
+
+    rc = flash_area_read(fa, 0, &hdr, sizeof(hdr));
+    if (rc != 0) {
+        return MGMT_ERR_EINVAL;
+    }
+
+    if (hdr.ch_magic != COREDUMP_MAGIC) {
+        return MGMT_ERR_ENOENT;
+    }
+
+    rc = mgmt_cbuf_setoerr(cb, 0);
+    if (rc != 0) {
+        return rc;
     }
 
-    mgmt_cbuf_setoerr(cb, rc);
     return 0;
 }
 
@@ -75,21 +79,17 @@ imgr_core_load(struct mgmt_cbuf *cb)
     uint8_t data[IMGMGR_NMGR_MAX_MSG];
     struct coredump_header *hdr;
     CborError g_err = CborNoError;
-    CborEncoder *penc = &cb->encoder;
-    CborEncoder rsp;
 
     hdr = (struct coredump_header *)data;
 
     rc = cbor_read_object(&cb->it, dload_attr);
     if (rc || off == UINT_MAX) {
-        rc = MGMT_ERR_EINVAL;
-        goto err;
+        return MGMT_ERR_EINVAL;
     }
 
     rc = flash_area_open(MYNEWT_VAL(COREDUMP_FLASH_AREA), &fa);
     if (rc) {
-        rc = MGMT_ERR_EINVAL;
-        goto err;
+        return MGMT_ERR_EINVAL;
     }
 
     rc = flash_area_read(fa, 0, hdr, sizeof(*hdr));
@@ -115,14 +115,12 @@ imgr_core_load(struct mgmt_cbuf *cb)
         goto err_close;
     }
 
-    g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "rc");
-    g_err |= cbor_encode_int(&rsp, MGMT_ERR_EOK);
-    g_err |= cbor_encode_text_stringz(&rsp, "off");
-    g_err |= cbor_encode_int(&rsp, off);
-    g_err |= cbor_encode_text_stringz(&rsp, "data");
-    g_err |= cbor_encode_byte_string(&rsp, data, sz);
-    g_err |= cbor_encoder_close_container(penc, &rsp);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "rc");
+    g_err |= cbor_encode_int(&cb->encoder, MGMT_ERR_EOK);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "off");
+    g_err |= cbor_encode_int(&cb->encoder, off);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "data");
+    g_err |= cbor_encode_byte_string(&cb->encoder, data, sz);
 
     flash_area_close(fa);
     if (g_err) {
@@ -132,8 +130,6 @@ imgr_core_load(struct mgmt_cbuf *cb)
 
 err_close:
     flash_area_close(fa);
-err:
-    mgmt_cbuf_setoerr(cb, rc);
     return rc;
 }
 
@@ -148,24 +144,26 @@ imgr_core_erase(struct mgmt_cbuf *cb)
     int rc;
 
     rc = flash_area_open(MYNEWT_VAL(COREDUMP_FLASH_AREA), &fa);
-    if (rc) {
-        rc = MGMT_ERR_EINVAL;
-        goto err;
+    if (rc != 0) {
+        return MGMT_ERR_EINVAL;
     }
 
     rc = flash_area_read(fa, 0, &hdr, sizeof(hdr));
     if (rc == 0 &&
       (hdr.ch_magic == COREDUMP_MAGIC || hdr.ch_magic == 0xffffffff)) {
         rc = flash_area_erase(fa, 0, fa->fa_size);
-        if (rc) {
-            rc = MGMT_ERR_EINVAL;
+        if (rc != 0) {
+            return MGMT_ERR_EINVAL;
         }
     }
-    rc = 0;
 
     flash_area_close(fa);
-err:
-    mgmt_cbuf_setoerr(cb, rc);
+
+    rc = mgmt_cbuf_setoerr(cb, rc);
+    if (rc != 0) {
+        return rc;
+    }
+
     return 0;
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5f24475b/mgmt/imgmgr/src/imgmgr_state.c
----------------------------------------------------------------------
diff --git a/mgmt/imgmgr/src/imgmgr_state.c b/mgmt/imgmgr/src/imgmgr_state.c
index ee7d76c..610b57f 100644
--- a/mgmt/imgmgr/src/imgmgr_state.c
+++ b/mgmt/imgmgr/src/imgmgr_state.c
@@ -240,15 +240,15 @@ imgmgr_state_read(struct mgmt_cbuf *cb)
     int split_status;
     uint8_t state_flags;
     CborError g_err = CborNoError;
-    CborEncoder *penc = &cb->encoder;
-    CborEncoder rsp, images, image;
+    CborEncoder images;
+    CborEncoder image;
 
     any_non_bootable = 0;
 
-    g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "images");
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "images");
 
-    g_err |= cbor_encoder_create_array(&rsp, &images, CborIndefiniteLength);
+    g_err |= cbor_encoder_create_array(&cb->encoder, &images,
+                                       CborIndefiniteLength);
     for (i = 0; i < 2; i++) {
         rc = imgr_read_info(i, &ver, hash, &flags);
         if (rc != 0) {
@@ -261,7 +261,8 @@ imgmgr_state_read(struct mgmt_cbuf *cb)
 
         state_flags = imgmgr_state_flags(i);
 
-        g_err |= cbor_encoder_create_map(&images, &image, CborIndefiniteLength);
+        g_err |= cbor_encoder_create_map(&images, &image,
+                                         CborIndefiniteLength);
         g_err |= cbor_encode_text_stringz(&image, "slot");
         g_err |= cbor_encode_int(&image, i);
 
@@ -294,7 +295,7 @@ imgmgr_state_read(struct mgmt_cbuf *cb)
         g_err |= cbor_encoder_close_container(&images, &image);
     }
 
-    g_err |= cbor_encoder_close_container(&rsp, &images);
+    g_err |= cbor_encoder_close_container(&cb->encoder, &images);
 
     if (any_non_bootable) {
         split_status = split_check_status();
@@ -302,10 +303,8 @@ imgmgr_state_read(struct mgmt_cbuf *cb)
         split_status = SPLIT_STATUS_INVALID;
     }
 
-    g_err |= cbor_encode_text_stringz(&rsp, "splitStatus");
-    g_err |= cbor_encode_int(&rsp, split_status);
-
-    g_err |= cbor_encoder_close_container(penc, &rsp);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "splitStatus");
+    g_err |= cbor_encode_int(&cb->encoder, split_status);
 
     if (g_err) {
         return MGMT_ERR_ENOMEM;
@@ -341,45 +340,37 @@ imgmgr_state_write(struct mgmt_cbuf *cb)
 
     rc = cbor_read_object(&cb->it, write_attr);
     if (rc != 0) {
-        rc = MGMT_ERR_EINVAL;
-        goto err;
+        return MGMT_ERR_EINVAL;
     }
 
     /* Validate arguments. */
     if ((hash_len == 0) && !confirm) {
-        rc = MGMT_ERR_EINVAL;
-        goto err;
+        return MGMT_ERR_EINVAL;
     }
 
     if (hash_len != 0) {
         slot = imgr_find_by_hash(hash, NULL);
         if (slot < 0) {
-            rc = MGMT_ERR_EINVAL;
-            goto err;
+            return MGMT_ERR_EINVAL;
         }
 
         rc = imgmgr_state_set_pending(slot, confirm);
         if (rc != 0) {
-            goto err;
+            return rc;
         }
     } else {
         /* Confirm current setup. */
         rc = imgmgr_state_confirm();
         if (rc != 0) {
-            goto err;
+            return rc;
         }
     }
 
     /* Send the current image state in the response. */
     rc = imgmgr_state_read(cb);
     if (rc != 0) {
-        goto err;
+        return rc;
     }
 
     return 0;
-
-err:
-    mgmt_cbuf_setoerr(cb, rc);
-
-    return 0;
 }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5f24475b/mgmt/newtmgr/nmgr_os/src/newtmgr_os.c
----------------------------------------------------------------------
diff --git a/mgmt/newtmgr/nmgr_os/src/newtmgr_os.c b/mgmt/newtmgr/nmgr_os/src/newtmgr_os.c
index c3e38d6..2a75d47 100644
--- a/mgmt/newtmgr/nmgr_os/src/newtmgr_os.c
+++ b/mgmt/newtmgr/nmgr_os/src/newtmgr_os.c
@@ -84,9 +84,8 @@ static int
 nmgr_def_echo(struct mgmt_cbuf *cb)
 {
     char echo_buf[128] = {'\0'};
-    CborEncoder *penc = &cb->encoder;
     CborError g_err = CborNoError;
-    CborEncoder rsp;
+
     struct cbor_attr_t attrs[2] = {
         [0] = {
             .attribute = "d",
@@ -100,11 +99,9 @@ nmgr_def_echo(struct mgmt_cbuf *cb)
         }
     };
 
-    g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "r");
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "r");
     g_err |= cbor_read_object(&cb->it, attrs);
-    g_err |= cbor_encode_text_string(&rsp, echo_buf, strlen(echo_buf));
-    g_err |= cbor_encoder_close_container(penc, &rsp);
+    g_err |= cbor_encode_text_string(&cb->encoder, echo_buf, strlen(echo_buf));
 
     if (g_err) {
         return MGMT_ERR_ENOMEM;
@@ -145,19 +142,18 @@ nmgr_def_taskstat_read(struct mgmt_cbuf *cb)
 {
     struct os_task *prev_task;
     struct os_task_info oti;
-
     CborError g_err = CborNoError;
-    CborEncoder rsp, tasks, task;
+    CborEncoder tasks;
+    CborEncoder task;
 
-    g_err |= cbor_encoder_create_map(&cb->encoder, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "rc");
-    g_err |= cbor_encode_int(&rsp, MGMT_ERR_EOK);
-    g_err |= cbor_encode_text_stringz(&rsp, "tasks");
-    g_err |= cbor_encoder_create_map(&rsp, &tasks, CborIndefiniteLength);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "rc");
+    g_err |= cbor_encode_int(&cb->encoder, MGMT_ERR_EOK);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "tasks");
+    g_err |= cbor_encoder_create_map(&cb->encoder, &tasks,
+                                     CborIndefiniteLength);
 
     prev_task = NULL;
     while (1) {
-
         prev_task = os_task_info_get_next(prev_task, &oti);
         if (prev_task == NULL) {
             break;
@@ -165,28 +161,27 @@ nmgr_def_taskstat_read(struct mgmt_cbuf *cb)
 
         g_err |= cbor_encode_text_stringz(&tasks, oti.oti_name);
         g_err |= cbor_encoder_create_map(&tasks, &task, CborIndefiniteLength);
-        g_err |= cbor_encode_text_stringz(&rsp, "prio");
-        g_err |= cbor_encode_uint(&rsp, oti.oti_prio);
-        g_err |= cbor_encode_text_stringz(&rsp, "tid");
-        g_err |= cbor_encode_uint(&rsp, oti.oti_taskid);
-        g_err |= cbor_encode_text_stringz(&rsp, "state");
-        g_err |= cbor_encode_uint(&rsp, oti.oti_state);
-        g_err |= cbor_encode_text_stringz(&rsp, "stkuse");
-        g_err |= cbor_encode_uint(&rsp, oti.oti_stkusage);
-        g_err |= cbor_encode_text_stringz(&rsp, "stksiz");
-        g_err |= cbor_encode_uint(&rsp, oti.oti_stksize);
-        g_err |= cbor_encode_text_stringz(&rsp, "cswcnt");
-        g_err |= cbor_encode_uint(&rsp, oti.oti_cswcnt);
-        g_err |= cbor_encode_text_stringz(&rsp, "runtime");
-        g_err |= cbor_encode_uint(&rsp, oti.oti_runtime);
-        g_err |= cbor_encode_text_stringz(&rsp, "last_checkin");
-        g_err |= cbor_encode_uint(&rsp, oti.oti_last_checkin);
-        g_err |= cbor_encode_text_stringz(&rsp, "next_checkin");
-        g_err |= cbor_encode_uint(&rsp, oti.oti_next_checkin);
+        g_err |= cbor_encode_text_stringz(&task, "prio");
+        g_err |= cbor_encode_uint(&task, oti.oti_prio);
+        g_err |= cbor_encode_text_stringz(&task, "tid");
+        g_err |= cbor_encode_uint(&task, oti.oti_taskid);
+        g_err |= cbor_encode_text_stringz(&task, "state");
+        g_err |= cbor_encode_uint(&task, oti.oti_state);
+        g_err |= cbor_encode_text_stringz(&task, "stkuse");
+        g_err |= cbor_encode_uint(&task, oti.oti_stkusage);
+        g_err |= cbor_encode_text_stringz(&task, "stksiz");
+        g_err |= cbor_encode_uint(&task, oti.oti_stksize);
+        g_err |= cbor_encode_text_stringz(&task, "cswcnt");
+        g_err |= cbor_encode_uint(&task, oti.oti_cswcnt);
+        g_err |= cbor_encode_text_stringz(&task, "runtime");
+        g_err |= cbor_encode_uint(&task, oti.oti_runtime);
+        g_err |= cbor_encode_text_stringz(&task, "last_checkin");
+        g_err |= cbor_encode_uint(&task, oti.oti_last_checkin);
+        g_err |= cbor_encode_text_stringz(&task, "next_checkin");
+        g_err |= cbor_encode_uint(&task, oti.oti_next_checkin);
         g_err |= cbor_encoder_close_container(&tasks, &task);
     }
-    g_err |= cbor_encoder_close_container(&rsp, &tasks);
-    g_err |= cbor_encoder_close_container(&cb->encoder, &rsp);
+    g_err |= cbor_encoder_close_container(&cb->encoder, &tasks);
 
     if (g_err) {
         return MGMT_ERR_ENOMEM;
@@ -200,13 +195,14 @@ nmgr_def_mpstat_read(struct mgmt_cbuf *cb)
     struct os_mempool *prev_mp;
     struct os_mempool_info omi;
     CborError g_err = CborNoError;
-    CborEncoder rsp, pools, pool;
+    CborEncoder pools;
+    CborEncoder pool;
 
-    g_err |= cbor_encoder_create_map(&cb->encoder, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "rc");
-    g_err |= cbor_encode_int(&rsp, MGMT_ERR_EOK);
-    g_err |= cbor_encode_text_stringz(&rsp, "mpools");
-    g_err |= cbor_encoder_create_map(&rsp, &pools, CborIndefiniteLength);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "rc");
+    g_err |= cbor_encode_int(&cb->encoder, MGMT_ERR_EOK);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "mpools");
+    g_err |= cbor_encoder_create_map(&cb->encoder, &pools,
+                                     CborIndefiniteLength);
 
     prev_mp = NULL;
     while (1) {
@@ -217,19 +213,18 @@ nmgr_def_mpstat_read(struct mgmt_cbuf *cb)
 
         g_err |= cbor_encode_text_stringz(&pools, omi.omi_name);
         g_err |= cbor_encoder_create_map(&pools, &pool, CborIndefiniteLength);
-        g_err |= cbor_encode_text_stringz(&rsp, "blksiz");
-        g_err |= cbor_encode_uint(&rsp, omi.omi_block_size);
-        g_err |= cbor_encode_text_stringz(&rsp, "nblks");
-        g_err |= cbor_encode_uint(&rsp, omi.omi_num_blocks);
-        g_err |= cbor_encode_text_stringz(&rsp, "nfree");
-        g_err |= cbor_encode_uint(&rsp, omi.omi_num_free);
-        g_err |= cbor_encode_text_stringz(&rsp, "min");
-        g_err |= cbor_encode_uint(&rsp, omi.omi_min_free);
+        g_err |= cbor_encode_text_stringz(&pool, "blksiz");
+        g_err |= cbor_encode_uint(&pool, omi.omi_block_size);
+        g_err |= cbor_encode_text_stringz(&pool, "nblks");
+        g_err |= cbor_encode_uint(&pool, omi.omi_num_blocks);
+        g_err |= cbor_encode_text_stringz(&pool, "nfree");
+        g_err |= cbor_encode_uint(&pool, omi.omi_num_free);
+        g_err |= cbor_encode_text_stringz(&pool, "min");
+        g_err |= cbor_encode_uint(&pool, omi.omi_min_free);
         g_err |= cbor_encoder_close_container(&pools, &pool);
     }
 
-    g_err |= cbor_encoder_close_container(&rsp, &pools);
-    g_err |= cbor_encoder_close_container(&cb->encoder, &rsp);
+    g_err |= cbor_encoder_close_container(&cb->encoder, &pools);
 
     if (g_err) {
         return MGMT_ERR_ENOMEM;
@@ -245,11 +240,9 @@ nmgr_datetime_get(struct mgmt_cbuf *cb)
     char buf[DATETIME_BUFSIZE];
     int rc;
     CborError g_err = CborNoError;
-    CborEncoder rsp;
 
-    g_err |= cbor_encoder_create_map(&cb->encoder, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "rc");
-    g_err |= cbor_encode_int(&rsp, MGMT_ERR_EOK);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "rc");
+    g_err |= cbor_encode_int(&cb->encoder, MGMT_ERR_EOK);
 
     /* Display the current datetime */
     rc = os_gettimeofday(&tv, &tz);
@@ -259,9 +252,8 @@ nmgr_datetime_get(struct mgmt_cbuf *cb)
         rc = MGMT_ERR_EINVAL;
         goto err;
     }
-    g_err |= cbor_encode_text_stringz(&rsp, "datetime");
-    g_err |= cbor_encode_text_stringz(&rsp, buf);
-    g_err |= cbor_encoder_close_container(&cb->encoder, &rsp);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "datetime");
+    g_err |= cbor_encode_text_stringz(&cb->encoder, buf);
 
     if (g_err) {
         return MGMT_ERR_ENOMEM;
@@ -295,8 +287,7 @@ nmgr_datetime_set(struct mgmt_cbuf *cb)
 
     rc = cbor_read_object(&cb->it, datetime_write_attr);
     if (rc) {
-        rc = MGMT_ERR_EINVAL;
-        goto out;
+        return MGMT_ERR_EINVAL;
     }
 
     /* Set the current datetime */
@@ -304,18 +295,18 @@ nmgr_datetime_set(struct mgmt_cbuf *cb)
     if (!rc) {
         rc = os_settimeofday(&tv, &tz);
         if (rc) {
-          rc = MGMT_ERR_EINVAL;
-          goto out;
+          return MGMT_ERR_EINVAL;
         }
     } else {
-        rc = MGMT_ERR_EINVAL;
-        goto out;
+        return MGMT_ERR_EINVAL;
     }
 
-    rc = 0;
-out:
-    mgmt_cbuf_setoerr(cb, rc);
-    return rc;
+    rc = mgmt_cbuf_setoerr(cb, 0);
+    if (rc != 0) {
+        return rc;
+    }
+
+    return 0;
 }
 
 static void
@@ -327,6 +318,8 @@ nmgr_reset_tmo(struct os_event *ev)
 static int
 nmgr_reset(struct mgmt_cbuf *cb)
 {
+    int rc;
+
     os_callout_init(&nmgr_reset_callout, mgmt_evq_get(), nmgr_reset_tmo, NULL);
 
 #if MYNEWT_VAL(LOG_SOFT_RESET)
@@ -334,7 +327,10 @@ nmgr_reset(struct mgmt_cbuf *cb)
 #endif
     os_callout_reset(&nmgr_reset_callout, OS_TICKS_PER_SEC / 4);
 
-    mgmt_cbuf_setoerr(cb, OS_OK);
+    rc = mgmt_cbuf_setoerr(cb, 0);
+    if (rc != 0) {
+        return rc;
+    }
 
     return 0;
 }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5f24475b/mgmt/newtmgr/src/newtmgr.c
----------------------------------------------------------------------
diff --git a/mgmt/newtmgr/src/newtmgr.c b/mgmt/newtmgr/src/newtmgr.c
index 5d37021..043cef6 100644
--- a/mgmt/newtmgr/src/newtmgr.c
+++ b/mgmt/newtmgr/src/newtmgr.c
@@ -95,20 +95,36 @@ nmgr_init_rsp(struct os_mbuf *m, struct nmgr_hdr *src)
 
 static void
 nmgr_send_err_rsp(struct nmgr_transport *nt, struct os_mbuf *m,
-  struct nmgr_hdr *hdr, int rc)
+                  struct nmgr_hdr *hdr, int status)
 {
+    struct CborEncoder map;
+    int rc;
+
     hdr = nmgr_init_rsp(m, hdr);
     if (!hdr) {
         os_mbuf_free_chain(m);
         return;
     }
 
-    mgmt_cbuf_setoerr(&nmgr_task_cbuf.n_b, rc);
-    hdr->nh_len +=
-        cbor_encode_bytes_written(&nmgr_task_cbuf.n_b.encoder);
+    rc = cbor_encoder_create_map(&nmgr_task_cbuf.n_b.encoder, &map,
+                                 CborIndefiniteLength);
+    if (rc != 0) {
+        return;
+    }
+
+    rc = mgmt_cbuf_setoerr(&nmgr_task_cbuf.n_b, status);
+    if (rc != 0) {
+        return;
+    }
+
+    rc = cbor_encoder_close_container(&nmgr_task_cbuf.n_b.encoder, &map);
+    if (rc != 0) {
+        return;
+    }
+
+    hdr->nh_len =
+        htons(cbor_encode_bytes_written(&nmgr_task_cbuf.n_b.encoder));
 
-    hdr->nh_len = htons(hdr->nh_len);
-    hdr->nh_flags = 0;
     nt->nt_output(nt, nmgr_task_cbuf.n_out_m);
 }
 
@@ -172,6 +188,7 @@ nmgr_handle_req(struct nmgr_transport *nt, struct os_mbuf *req)
 {
     struct os_mbuf *rsp;
     const struct mgmt_handler *handler;
+    CborEncoder payload_enc;
     struct nmgr_hdr *rsp_hdr;
     struct nmgr_hdr hdr;
     int off;
@@ -194,7 +211,7 @@ nmgr_handle_req(struct nmgr_transport *nt, struct os_mbuf *req)
 
     mtu = nt->nt_get_mtu(req);
 
-    /* Copy the request packet header into the response. */
+    /* Copy the request user header into the response. */
     memcpy(OS_MBUF_USRHDR(rsp), OS_MBUF_USRHDR(req), OS_MBUF_USRHDR_LEN(req));
 
     off = 0;
@@ -228,6 +245,16 @@ nmgr_handle_req(struct nmgr_transport *nt, struct os_mbuf *req)
         cbor_parser_init(&nmgr_task_cbuf.reader.r, 0,
                          &nmgr_task_cbuf.n_b.parser, &nmgr_task_cbuf.n_b.it);
 
+        /* Begin response payload.  Response fields are inserted into the root
+         * map as key value pairs.
+         */
+        rc = cbor_encoder_create_map(&nmgr_task_cbuf.n_b.encoder, &payload_enc,
+                                     CborIndefiniteLength);
+        if (rc != 0) {
+            rc = MGMT_ERR_ENOMEM;
+            goto err;
+        }
+
         if (hdr.nh_op == NMGR_OP_READ) {
             if (handler->mh_read) {
                 rc = handler->mh_read(&nmgr_task_cbuf.n_b);
@@ -243,8 +270,15 @@ nmgr_handle_req(struct nmgr_transport *nt, struct os_mbuf *req)
         } else {
             rc = MGMT_ERR_EINVAL;
         }
+        if (rc != 0) {
+            goto err;
+        }
 
+        /* End response payload. */
+        rc = cbor_encoder_close_container(&nmgr_task_cbuf.n_b.encoder,
+                                          &payload_enc);
         if (rc != 0) {
+            rc = MGMT_ERR_ENOMEM;
             goto err;
         }
 
@@ -270,11 +304,15 @@ nmgr_handle_req(struct nmgr_transport *nt, struct os_mbuf *req)
     os_mbuf_free_chain(rsp);
     os_mbuf_free_chain(req);
     return;
+
 err:
-    OS_MBUF_PKTHDR(rsp)->omp_len = rsp->om_len = 0;
+    /* Clear partially written response. */
+    os_mbuf_adj(rsp, OS_MBUF_PKTLEN(rsp));
+
     nmgr_send_err_rsp(nt, rsp, &hdr, rc);
     os_mbuf_free_chain(req);
     return;
+
 err_norsp:
     os_mbuf_free_chain(rsp);
     os_mbuf_free_chain(req);

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5f24475b/sys/config/src/config_nmgr.c
----------------------------------------------------------------------
diff --git a/sys/config/src/config_nmgr.c b/sys/config/src/config_nmgr.c
index 24c7080..0b42bc6 100644
--- a/sys/config/src/config_nmgr.c
+++ b/sys/config/src/config_nmgr.c
@@ -49,7 +49,6 @@ conf_nmgr_read(struct mgmt_cbuf *cb)
     char val_str[CONF_MAX_VAL_LEN];
     char *val;
     CborError g_err = CborNoError;
-    CborEncoder rsp;
 
     const struct cbor_attr_t attr[2] = {
         [0] = {
@@ -73,10 +72,9 @@ conf_nmgr_read(struct mgmt_cbuf *cb)
         return MGMT_ERR_EINVAL;
     }
 
-    g_err |= cbor_encoder_create_map(&cb->encoder, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "val");
-    g_err |= cbor_encode_text_stringz(&rsp, val);
-    g_err |= cbor_encoder_close_container(&cb->encoder, &rsp);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "val");
+    g_err |= cbor_encode_text_stringz(&cb->encoder, val);
+
     if (g_err) {
         return MGMT_ERR_ENOMEM;
     }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5f24475b/sys/log/full/src/log_nmgr.c
----------------------------------------------------------------------
diff --git a/sys/log/full/src/log_nmgr.c b/sys/log/full/src/log_nmgr.c
index 6d51cb6..00beeba 100644
--- a/sys/log/full/src/log_nmgr.c
+++ b/sys/log/full/src/log_nmgr.c
@@ -250,8 +250,7 @@ log_nmgr_read(struct mgmt_cbuf *cb)
     int64_t ts;
     uint64_t index;
     CborError g_err = CborNoError;
-    CborEncoder *penc = &cb->encoder;
-    CborEncoder rsp, logs;
+    CborEncoder logs;
 
     const struct cbor_attr_t attr[4] = {
         [0] = {
@@ -281,10 +280,9 @@ log_nmgr_read(struct mgmt_cbuf *cb)
     }
 
 
-    g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "logs");
-
-    g_err |= cbor_encoder_create_array(&rsp, &logs, CborIndefiniteLength);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "logs");
+    g_err |= cbor_encoder_create_array(&cb->encoder, &logs,
+                                       CborIndefiniteLength);
 
     name_len = strlen(name);
     log = NULL;
@@ -321,10 +319,9 @@ log_nmgr_read(struct mgmt_cbuf *cb)
     }
 
 err:
-    g_err |= cbor_encoder_close_container(&rsp, &logs);
-    g_err |= cbor_encode_text_stringz(&rsp, "rc");
-    g_err |= cbor_encode_int(&rsp, rc);
-    g_err |= cbor_encoder_close_container(penc, &rsp);
+    g_err |= cbor_encoder_close_container(&cb->encoder, &logs);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "rc");
+    g_err |= cbor_encode_int(&cb->encoder, rc);
 
     if (g_err) {
         return MGMT_ERR_ENOMEM;
@@ -344,15 +341,14 @@ log_nmgr_module_list(struct mgmt_cbuf *cb)
     int module;
     char *str;
     CborError g_err = CborNoError;
-    CborEncoder *penc = &cb->encoder;
-    CborEncoder rsp, modules;
+    CborEncoder modules;
 
-    g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "rc");
-    g_err |= cbor_encode_int(&rsp, MGMT_ERR_EOK);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "rc");
+    g_err |= cbor_encode_int(&cb->encoder, MGMT_ERR_EOK);
 
-    g_err |= cbor_encode_text_stringz(&rsp, "module_map");
-    g_err |= cbor_encoder_create_map(&rsp, &modules, CborIndefiniteLength);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "module_map");
+    g_err |= cbor_encoder_create_map(&cb->encoder, &modules,
+                                     CborIndefiniteLength);
 
     module = LOG_MODULE_DEFAULT;
     while (module < LOG_MODULE_MAX) {
@@ -367,8 +363,7 @@ log_nmgr_module_list(struct mgmt_cbuf *cb)
         module++;
     }
 
-    g_err |= cbor_encoder_close_container(&rsp, &modules);
-    g_err |= cbor_encoder_close_container(penc, &rsp);
+    g_err |= cbor_encoder_close_container(&cb->encoder, &modules);
 
     if (g_err) {
         return MGMT_ERR_ENOMEM;
@@ -385,16 +380,15 @@ static int
 log_nmgr_logs_list(struct mgmt_cbuf *cb)
 {
     CborError g_err = CborNoError;
-    CborEncoder *penc = &cb->encoder;
-    CborEncoder rsp, log_list;
+    CborEncoder log_list;
     struct log *log;
 
-    g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "rc");
-    g_err |= cbor_encode_int(&rsp, MGMT_ERR_EOK);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "rc");
+    g_err |= cbor_encode_int(&cb->encoder, MGMT_ERR_EOK);
 
-    g_err |= cbor_encode_text_stringz(&rsp, "log_list");
-    g_err |= cbor_encoder_create_array(&rsp, &log_list, CborIndefiniteLength);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "log_list");
+    g_err |= cbor_encoder_create_array(&cb->encoder, &log_list,
+                                       CborIndefiniteLength);
 
     log = NULL;
     while (1) {
@@ -410,8 +404,7 @@ log_nmgr_logs_list(struct mgmt_cbuf *cb)
         g_err |= cbor_encode_text_stringz(&log_list, log->l_name);
     }
 
-    g_err |= cbor_encoder_close_container(&rsp, &log_list);
-    g_err |= cbor_encoder_close_container(penc, &rsp);
+    g_err |= cbor_encoder_close_container(&cb->encoder, &log_list);
 
     if (g_err) {
         return MGMT_ERR_ENOMEM;
@@ -428,17 +421,16 @@ static int
 log_nmgr_level_list(struct mgmt_cbuf *cb)
 {
     CborError g_err = CborNoError;
-    CborEncoder *penc = &cb->encoder;
-    CborEncoder rsp, level_map;
+    CborEncoder level_map;
     int level;
     char *str;
 
-    g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "rc");
-    g_err |= cbor_encode_int(&rsp, MGMT_ERR_EOK);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "rc");
+    g_err |= cbor_encode_int(&cb->encoder, MGMT_ERR_EOK);
 
-    g_err |= cbor_encode_text_stringz(&rsp, "level_map");
-    g_err |= cbor_encoder_create_map(&rsp, &level_map, CborIndefiniteLength);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "level_map");
+    g_err |= cbor_encoder_create_map(&cb->encoder, &level_map,
+                                     CborIndefiniteLength);
 
     level = LOG_LEVEL_DEBUG;
     while (level < LOG_LEVEL_MAX) {
@@ -453,8 +445,7 @@ log_nmgr_level_list(struct mgmt_cbuf *cb)
         level++;
     }
 
-    g_err |= cbor_encoder_close_container(&rsp, &level_map);
-    g_err |= cbor_encoder_close_container(penc, &rsp);
+    g_err |= cbor_encoder_close_container(&cb->encoder, &level_map);
 
     if (g_err) {
         return MGMT_ERR_ENOMEM;
@@ -470,9 +461,6 @@ log_nmgr_level_list(struct mgmt_cbuf *cb)
 static int
 log_nmgr_clear(struct mgmt_cbuf *cb)
 {
-    CborError g_err = CborNoError;
-    CborEncoder *penc = &cb->encoder;
-    CborEncoder rsp;
     struct log *log;
     int rc;
 
@@ -489,19 +477,16 @@ log_nmgr_clear(struct mgmt_cbuf *cb)
 
         rc = log_flush(log);
         if (rc) {
-            goto err;
+            return rc;
         }
     }
-    g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encoder_close_container(penc, &rsp);
 
-    if (g_err) {
-        return MGMT_ERR_ENOMEM;
+    rc = mgmt_cbuf_setoerr(cb, 0);
+    if (rc != 0) {
+        return rc;
     }
+
     return 0;
-err:
-    mgmt_cbuf_setoerr(cb, rc);
-    return (rc);
 }
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5f24475b/sys/stats/full/src/stats_nmgr.c
----------------------------------------------------------------------
diff --git a/sys/stats/full/src/stats_nmgr.c b/sys/stats/full/src/stats_nmgr.c
index 5df6e7c..0b28b25 100644
--- a/sys/stats/full/src/stats_nmgr.c
+++ b/sys/stats/full/src/stats_nmgr.c
@@ -95,46 +95,39 @@ stats_nmgr_read(struct mgmt_cbuf *cb)
         { NULL },
     };
     CborError g_err = CborNoError;
-    CborEncoder *penc = &cb->encoder;
-    CborEncoder rsp, stats;
+    CborEncoder stats;
 
     g_err = cbor_read_object(&cb->it, attrs);
     if (g_err != 0) {
-        g_err = MGMT_ERR_EINVAL;
-        goto err;
+        return MGMT_ERR_EINVAL;
     }
 
     hdr = stats_group_find(stats_name);
     if (!hdr) {
-        g_err = MGMT_ERR_EINVAL;
-        goto err;
+        return MGMT_ERR_EINVAL;
     }
 
-    g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "rc");
-    g_err |= cbor_encode_int(&rsp, MGMT_ERR_EOK);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "rc");
+    g_err |= cbor_encode_int(&cb->encoder, MGMT_ERR_EOK);
 
-    g_err |= cbor_encode_text_stringz(&rsp, "name");
-    g_err |= cbor_encode_text_stringz(&rsp, stats_name);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "name");
+    g_err |= cbor_encode_text_stringz(&cb->encoder, stats_name);
 
-    g_err |= cbor_encode_text_stringz(&rsp, "group");
-    g_err |= cbor_encode_text_string(&rsp, "sys", sizeof("sys")-1);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "group");
+    g_err |= cbor_encode_text_string(&cb->encoder, "sys", sizeof("sys")-1);
 
-    g_err |= cbor_encode_text_stringz(&rsp, "fields");
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "fields");
 
-    g_err |= cbor_encoder_create_map(&rsp, &stats, CborIndefiniteLength);
+    g_err |= cbor_encoder_create_map(&cb->encoder, &stats,
+                                     CborIndefiniteLength);
 
     stats_walk(hdr, stats_nmgr_walk_func, &stats);
 
-    g_err |= cbor_encoder_close_container(&rsp, &stats);
-    g_err |= cbor_encoder_close_container(penc, &rsp);
+    g_err |= cbor_encoder_close_container(&cb->encoder, &stats);
 
     if (g_err) {
         return MGMT_ERR_ENOMEM;
     }
-    return (0);
-err:
-    mgmt_cbuf_setoerr(cb, g_err);
 
     return (0);
 }
@@ -143,17 +136,15 @@ static int
 stats_nmgr_list(struct mgmt_cbuf *cb)
 {
     CborError g_err = CborNoError;
-    CborEncoder *penc = &cb->encoder;
-    CborEncoder rsp, stats;
-
-    g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "rc");
-    g_err |= cbor_encode_int(&rsp, MGMT_ERR_EOK);
-    g_err |= cbor_encode_text_stringz(&rsp, "stat_list");
-    g_err |= cbor_encoder_create_array(&rsp, &stats, CborIndefiniteLength);
+    CborEncoder stats;
+
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "rc");
+    g_err |= cbor_encode_int(&cb->encoder, MGMT_ERR_EOK);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "stat_list");
+    g_err |= cbor_encoder_create_array(&cb->encoder, &stats,
+                                       CborIndefiniteLength);
     stats_group_walk(stats_nmgr_encode_name, &stats);
-    g_err |= cbor_encoder_close_container(&rsp, &stats);
-    g_err |= cbor_encoder_close_container(penc, &rsp);
+    g_err |= cbor_encoder_close_container(&cb->encoder, &stats);
 
     if (g_err) {
         return MGMT_ERR_ENOMEM;

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5f24475b/test/crash_test/src/crash_nmgr.c
----------------------------------------------------------------------
diff --git a/test/crash_test/src/crash_nmgr.c b/test/crash_test/src/crash_nmgr.c
index 7ffd969..b1b8eaa 100644
--- a/test/crash_test/src/crash_nmgr.c
+++ b/test/crash_test/src/crash_nmgr.c
@@ -33,7 +33,7 @@
 static int crash_test_nmgr_write(struct mgmt_cbuf *);
 
 static const struct mgmt_handler crash_test_nmgr_handler[] = {
-    [0] = { crash_test_nmgr_write, crash_test_nmgr_write }
+    [0] = { NULL, crash_test_nmgr_write }
 };
 
 struct mgmt_group crash_test_nmgr_group = {
@@ -60,15 +60,20 @@ crash_test_nmgr_write(struct mgmt_cbuf *cb)
     int rc;
 
     rc = cbor_read_object(&cb->it, attr);
-    if (rc) {
-        rc = MGMT_ERR_EINVAL;
-    } else {
-        rc = crash_device(tmp_str);
-        if (rc) {
-            rc = MGMT_ERR_EINVAL;
-        }
+    if (rc != 0) {
+        return MGMT_ERR_EINVAL;
+    }
+
+    rc = crash_device(tmp_str);
+    if (rc != 0) {
+        return MGMT_ERR_EINVAL;
     }
-    mgmt_cbuf_setoerr(cb, rc);
+
+    rc = mgmt_cbuf_setoerr(cb, 0);
+    if (rc != 0) {
+        return rc;
+    }
+
     return 0;
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5f24475b/test/runtest/src/runtest_nmgr.c
----------------------------------------------------------------------
diff --git a/test/runtest/src/runtest_nmgr.c b/test/runtest/src/runtest_nmgr.c
index 3c02ee3..ce282ce 100644
--- a/test/runtest/src/runtest_nmgr.c
+++ b/test/runtest/src/runtest_nmgr.c
@@ -105,11 +105,6 @@ run_nmgr_test(struct mgmt_cbuf *cb)
 
     os_eventq_put(run_evq_get(), &run_test_event);
             
-    if (rc) {
-        rc = MGMT_ERR_EINVAL;
-    }
-
-    mgmt_cbuf_setoerr(cb, rc);
     return 0;
 }
 
@@ -120,23 +115,21 @@ static int
 run_nmgr_list(struct mgmt_cbuf *cb)
 {
     CborError g_err = CborNoError;
-    CborEncoder *penc = &cb->encoder;
-    CborEncoder rsp, run_list;
+    CborEncoder run_list;
     struct ts_suite *ts;
 
-    g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength);
-    g_err |= cbor_encode_text_stringz(&rsp, "rc");
-    g_err |= cbor_encode_int(&rsp, MGMT_ERR_EOK);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "rc");
+    g_err |= cbor_encode_int(&cb->encoder, MGMT_ERR_EOK);
 
-    g_err |= cbor_encode_text_stringz(&rsp, "run_list");
-    g_err |= cbor_encoder_create_array(&rsp, &run_list, CborIndefiniteLength);
+    g_err |= cbor_encode_text_stringz(&cb->encoder, "run_list");
+    g_err |= cbor_encoder_create_array(&cb->encoder, &run_list,
+                                       CborIndefiniteLength);
 
     SLIST_FOREACH(ts, &g_ts_suites, ts_next) {
         g_err |= cbor_encode_text_stringz(&run_list, ts->ts_name);
     }
 
-    g_err |= cbor_encoder_close_container(&rsp, &run_list);
-    g_err |= cbor_encoder_close_container(penc, &rsp);
+    g_err |= cbor_encoder_close_container(&cb->encoder, &run_list);
 
     if (g_err) {
         return MGMT_ERR_ENOMEM;