Skip to content
This repository was archived by the owner on Oct 28, 2023. It is now read-only.

Commit b45e4d1

Browse files
committed
code cleanup of the badge.nvs_* code. (fixes issue SHA2017-badge#93)
1 parent 2788866 commit b45e4d1

File tree

1 file changed

+83
-34
lines changed

1 file changed

+83
-34
lines changed

esp32/modbadge.c

Lines changed: 83 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
* THE SOFTWARE.
2929
*/
3030

31+
#include <string.h>
32+
3133
#include "modbadge.h"
3234

3335
#include "py/mperrno.h"
@@ -42,13 +44,28 @@ STATIC mp_obj_t badge_init_() {
4244
}
4345
STATIC MP_DEFINE_CONST_FUN_OBJ_0(badge_init_obj, badge_init_);
4446

45-
// NVS
47+
/*** nvs access ***/
48+
49+
/* nvs: strings */
50+
static void _nvs_check_namespace_key(const char *namespace, const char *key) {
51+
if (strlen(namespace) == 0 || strlen(namespace) > 15) {
52+
mp_raise_msg(&mp_type_AttributeError, "Invalid namespace");
53+
}
54+
if (strlen(key) == 0 || strlen(key) > 15) {
55+
mp_raise_msg(&mp_type_AttributeError, "Invalid key");
56+
}
57+
}
4658

4759
STATIC mp_obj_t badge_nvs_get_str_(mp_uint_t n_args, const mp_obj_t *args) {
48-
mp_uint_t len;
49-
const char *namespace = mp_obj_str_get_data(args[0], &len);
50-
const char *key = mp_obj_str_get_data(args[1], &len);
51-
char value[256]; // TODO wut?
60+
const char *namespace = mp_obj_str_get_str(args[0]);
61+
const char *key = mp_obj_str_get_str(args[1]);
62+
_nvs_check_namespace_key(namespace, key);
63+
64+
// current max string length in esp-idf is 1984 bytes, but that
65+
// would abuse our stack too much. we only allow strings with a
66+
// max length of 255 chars.
67+
char value[256];
68+
5269
size_t length = sizeof(value);
5370
esp_err_t err = badge_nvs_get_str(namespace, key, value, &length);
5471
if (err != ESP_OK) {
@@ -57,71 +74,103 @@ STATIC mp_obj_t badge_nvs_get_str_(mp_uint_t n_args, const mp_obj_t *args) {
5774
}
5875
return mp_const_none;
5976
}
77+
6078
return mp_obj_new_str(value, length-1, false);
6179
}
6280
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(badge_nvs_get_str_obj, 2, 3, badge_nvs_get_str_);
6381

64-
STATIC mp_obj_t badge_nvs_set_str_(mp_obj_t namespace, mp_obj_t key, mp_obj_t value) {
65-
esp_err_t err = badge_nvs_set_str(mp_obj_str_get_str(namespace), mp_obj_str_get_str(key), mp_obj_str_get_str(value));
66-
if (err != ESP_OK) {
67-
mp_raise_msg(&mp_type_ValueError, "TODO error things");
82+
STATIC mp_obj_t badge_nvs_set_str_(mp_obj_t _namespace, mp_obj_t _key, mp_obj_t _value) {
83+
const char *namespace = mp_obj_str_get_str(_namespace);
84+
const char *key = mp_obj_str_get_str(_key);
85+
const char *value = mp_obj_str_get_str(_value);
86+
_nvs_check_namespace_key(namespace, key);
87+
if (strlen(value) > 255) {
88+
mp_raise_msg(&mp_type_AttributeError, "Value string too long");
6889
}
69-
return mp_const_none;
70-
}
71-
STATIC MP_DEFINE_CONST_FUN_OBJ_3(badge_nvs_set_str_obj, badge_nvs_set_str_);
7290

73-
STATIC mp_obj_t badge_nvs_set_u8_(mp_obj_t namespace, mp_obj_t key, mp_obj_t value) {
74-
uint8_t u8value = mp_obj_get_int(value);
75-
esp_err_t err = badge_nvs_set_u8(mp_obj_str_get_str(namespace), mp_obj_str_get_str(key), u8value);
91+
esp_err_t err = badge_nvs_set_str(namespace, key, value);
7692
if (err != ESP_OK) {
77-
mp_raise_msg(&mp_type_ValueError, "TODO error things");
93+
mp_raise_msg(&mp_type_ValueError, "Failed to store data in nvs");
7894
}
95+
7996
return mp_const_none;
8097
}
81-
STATIC MP_DEFINE_CONST_FUN_OBJ_3(badge_nvs_set_u8_obj, badge_nvs_set_u8_);
98+
STATIC MP_DEFINE_CONST_FUN_OBJ_3(badge_nvs_set_str_obj, badge_nvs_set_str_);
8299

100+
/* nvs: u8 */
83101
STATIC mp_obj_t badge_nvs_get_u8_(mp_uint_t n_args, const mp_obj_t *args) {
84-
mp_uint_t len;
85-
const char *namespace = mp_obj_str_get_data(args[0], &len);
86-
const char *key = mp_obj_str_get_data(args[1], &len);
87-
uint8_t u8value = mp_obj_get_int(args[2]);
88-
esp_err_t err = badge_nvs_get_u8(namespace, key, &u8value);
102+
const char *namespace = mp_obj_str_get_str(args[0]);
103+
const char *key = mp_obj_str_get_str(args[1]);
104+
_nvs_check_namespace_key(namespace, key);
105+
106+
uint8_t value = 0;
107+
esp_err_t err = badge_nvs_get_u8(namespace, key, &value);
89108
if (err != ESP_OK) {
90109
if (n_args > 2) {
91110
return args[2];
92111
}
93112
return mp_const_none;
94113
}
95-
return mp_obj_new_int(u8value);
114+
115+
return mp_obj_new_int(value);
96116
}
97117
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(badge_nvs_get_u8_obj, 2, 3, badge_nvs_get_u8_);
98118

99-
STATIC mp_obj_t badge_nvs_set_u16_(mp_obj_t namespace, mp_obj_t key, mp_obj_t value) {
100-
uint16_t u16value = mp_obj_get_int(value);
101-
esp_err_t err = badge_nvs_set_u16(mp_obj_str_get_str(namespace), mp_obj_str_get_str(key), u16value);
119+
STATIC mp_obj_t badge_nvs_set_u8_(mp_obj_t _namespace, mp_obj_t _key, mp_obj_t _value) {
120+
const char *namespace = mp_obj_str_get_str(_namespace);
121+
const char *key = mp_obj_str_get_str(_key);
122+
int value = mp_obj_get_int(_value);
123+
_nvs_check_namespace_key(namespace, key);
124+
if (value < 0 || value > 255) {
125+
mp_raise_msg(&mp_type_AttributeError, "Value out of range");
126+
}
127+
128+
esp_err_t err = badge_nvs_set_u8(namespace, key, value);
102129
if (err != ESP_OK) {
103-
mp_raise_msg(&mp_type_ValueError, "TODO error things");
130+
mp_raise_msg(&mp_type_ValueError, "Failed to store data in nvs");
104131
}
132+
105133
return mp_const_none;
106134
}
107-
STATIC MP_DEFINE_CONST_FUN_OBJ_3(badge_nvs_set_u16_obj, badge_nvs_set_u16_);
135+
STATIC MP_DEFINE_CONST_FUN_OBJ_3(badge_nvs_set_u8_obj, badge_nvs_set_u8_);
108136

137+
/* nvs: u16 */
109138
STATIC mp_obj_t badge_nvs_get_u16_(mp_uint_t n_args, const mp_obj_t *args) {
110-
mp_uint_t len;
111-
const char *namespace = mp_obj_str_get_data(args[0], &len);
112-
const char *key = mp_obj_str_get_data(args[1], &len);
113-
uint16_t u16value = mp_obj_get_int(args[2]);
114-
esp_err_t err = badge_nvs_get_u16(namespace, key, &u16value);
139+
const char *namespace = mp_obj_str_get_str(args[0]);
140+
const char *key = mp_obj_str_get_str(args[1]);
141+
_nvs_check_namespace_key(namespace, key);
142+
143+
uint16_t value = 0;
144+
esp_err_t err = badge_nvs_get_u16(namespace, key, &value);
115145
if (err != ESP_OK) {
116146
if (n_args > 2) {
117147
return args[2];
118148
}
119149
return mp_const_none;
120150
}
121-
return mp_obj_new_int(u16value);
151+
152+
return mp_obj_new_int(value);
122153
}
123154
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(badge_nvs_get_u16_obj, 2, 3, badge_nvs_get_u16_);
124155

156+
STATIC mp_obj_t badge_nvs_set_u16_(mp_obj_t _namespace, mp_obj_t _key, mp_obj_t _value) {
157+
const char *namespace = mp_obj_str_get_str(_namespace);
158+
const char *key = mp_obj_str_get_str(_key);
159+
int value = mp_obj_get_int(_value);
160+
_nvs_check_namespace_key(namespace, key);
161+
if (value < 0 || value > 65535) {
162+
mp_raise_msg(&mp_type_AttributeError, "Value out of range");
163+
}
164+
165+
esp_err_t err = badge_nvs_set_u16(namespace, key, value);
166+
if (err != ESP_OK) {
167+
mp_raise_msg(&mp_type_ValueError, "Failed to store data in nvs");
168+
}
169+
170+
return mp_const_none;
171+
}
172+
STATIC MP_DEFINE_CONST_FUN_OBJ_3(badge_nvs_set_u16_obj, badge_nvs_set_u16_);
173+
125174

126175
// EINK
127176

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy