summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2017-09-10 09:55:18 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2017-09-10 09:55:18 +0300
commit9b4666dad55be2cc978b3dd5da89fd11da0c3cfc (patch)
tree632ce83c49ee2c8942e2c8bc6a7ae4b804964bf2
parent5671a11b815b526289837ec4f132e5c94a02e9b6 (diff)
esp8266/posix_helpers: Set ENOMEM on memory alloc failure.
POSIX requires malloc(), etc. to set ENOMEM on the failure, and e.g. BerkeleyDB relies on this: http://pubs.opengroup.org/onlinepubs/9699919799/functions/malloc.html This should fix confusing OSError exceptions with 0 error code when working with btree module.
-rw-r--r--ports/esp8266/posix_helpers.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/ports/esp8266/posix_helpers.c b/ports/esp8266/posix_helpers.c
index f8e4880d2..1fc677c5c 100644
--- a/ports/esp8266/posix_helpers.c
+++ b/ports/esp8266/posix_helpers.c
@@ -26,22 +26,33 @@
#include <stdint.h>
#include <stdio.h>
+#include <errno.h>
#include "py/mphal.h"
#include "py/gc.h"
// Functions for external libs like axTLS, BerkeleyDB, etc.
void *malloc(size_t size) {
- return gc_alloc(size, false);
+ void *p = gc_alloc(size, false);
+ if (p == NULL) {
+ // POSIX requires ENOMEM to be set in case of error
+ errno = ENOMEM;
+ }
+ return p;
}
void free(void *ptr) {
gc_free(ptr);
}
void *calloc(size_t nmemb, size_t size) {
- return m_malloc0(nmemb * size);
+ return malloc(nmemb * size);
}
void *realloc(void *ptr, size_t size) {
- return gc_realloc(ptr, size, true);
+ void *p = gc_realloc(ptr, size, true);
+ if (p == NULL) {
+ // POSIX requires ENOMEM to be set in case of error
+ errno = ENOMEM;
+ }
+ return p;
}
#define PLATFORM_HTONL(_n) ((uint32_t)( (((_n) & 0xff) << 24) | (((_n) & 0xff00) << 8) | (((_n) >> 8) & 0xff00) | (((_n) >> 24) & 0xff) ))