You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by vi...@apache.org on 2019/10/16 00:38:08 UTC

[mynewt-mcumgr] branch master updated: cmd/log_mgmt: make sure a +ve err gets returned

This is an automated email from the ASF dual-hosted git repository.

vipulrahane pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-mcumgr.git


The following commit(s) were added to refs/heads/master by this push:
     new 19fef12  cmd/log_mgmt: make sure a +ve err gets returned
     new 2d9b24b  Merge pull request #36 from vrahane/log_walk_workaround
19fef12 is described below

commit 19fef129acc37730bc0697ddeac7206c481338cf
Author: Vipul Rahane <vr...@gmail.com>
AuthorDate: Tue Oct 15 17:25:46 2019 -0700

    cmd/log_mgmt: make sure a +ve err gets returned
    
    - log_walk() callbacks for different mediums return and ignore different
      errors, for log_fcb_walk() the callback just returns -ve errors and
    ignores +ve errors. We should make sure +ve errors get returned as well.
---
 cmd/log_mgmt/src/log_mgmt.c | 36 ++++++++++++++++++++++++++++++------
 1 file changed, 30 insertions(+), 6 deletions(-)

diff --git a/cmd/log_mgmt/src/log_mgmt.c b/cmd/log_mgmt/src/log_mgmt.c
index fa2a792..7e6c715 100644
--- a/cmd/log_mgmt/src/log_mgmt.c
+++ b/cmd/log_mgmt/src/log_mgmt.c
@@ -235,7 +235,8 @@ log_mgmt_cb_encode(struct log_mgmt_entry *entry, void *arg)
                          "error: entry too large (%zu bytes)", entry_len);
             }
 
-            return MGMT_ERR_EMSGSIZE;
+            /* We want a negative error code here */
+            return -1 * MGMT_ERR_EMSGSIZE;
         }
         ctxt->rsp_len += entry_len;
     }
@@ -255,13 +256,32 @@ static int
 log_encode_entries(const struct log_mgmt_log *log, CborEncoder *enc,
                    int64_t timestamp, uint32_t index)
 {
+    struct CborCntWriter cnt_writer;
     struct log_mgmt_filter filter;
     struct log_walk_ctxt ctxt;
+    CborEncoder cnt_encoder;
     CborEncoder entries;
     CborError err;
+    int rsp_len;
     int rc;
 
     err = 0;
+    rsp_len = 0;
+    /* this code counts how long the message would be if we encoded
+     * this outer structure using cbor. */
+    cbor_cnt_writer_init(&cnt_writer);
+    cbor_encoder_init(&cnt_encoder, &cnt_writer.enc, 0);
+    err |= cbor_encode_text_stringz(&cnt_encoder, "entries");
+    err |= cbor_encoder_create_array(&cnt_encoder, &entries,
+                                       CborIndefiniteLength);
+    err |= cbor_encoder_close_container(&cnt_encoder, &entries);
+    rsp_len = cbor_encode_bytes_written(enc) +
+              cbor_encode_bytes_written(&cnt_encoder);
+    if (rsp_len > LOG_MGMT_MAX_RSP_LEN) {
+        rc = MGMT_ERR_EMSGSIZE;
+        goto err;
+    }
+
     err |= cbor_encode_text_stringz(enc, "entries");
     err |= cbor_encoder_create_array(enc, &entries, CborIndefiniteLength);
 
@@ -276,9 +296,12 @@ log_encode_entries(const struct log_mgmt_log *log, CborEncoder *enc,
 
     rc = log_mgmt_impl_foreach_entry(log->name, &filter,
                                      log_mgmt_cb_encode, &ctxt);
-    if (rc != 0 && rc != MGMT_ERR_EMSGSIZE) {
-        cbor_encoder_close_container(enc, &entries);
-        return rc;
+    if (rc < 0) {
+        /*
+         * If we receive negative error code from the walk function,
+         * make sure it gets converted to a positive error code
+         */
+        rc = -1 * rc;
     }
 
     err |= cbor_encoder_close_container(enc, &entries);
@@ -287,7 +310,8 @@ log_encode_entries(const struct log_mgmt_log *log, CborEncoder *enc,
         return MGMT_ERR_ENOMEM;
     }
 
-    return 0;
+err:
+    return rc;
 }
 
 static int
@@ -410,7 +434,7 @@ log_mgmt_show(struct mgmt_ctxt *ctxt)
                 rc = log_encode(&log, &logs, timestamp, index);
 
 #if LOG_MGMT_READ_WATERMARK_UPDATE
-                if (rc == 0 || rc == OS_ENOMEM) {
+                if (rc == 0 || rc == MGMT_ERR_EMSGSIZE) {
                     log_mgmt_impl_set_watermark(&log, index);
                 }
 #endif