diff options
author | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2017-09-10 09:55:18 +0300 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2017-09-10 09:55:18 +0300 |
commit | 9b4666dad55be2cc978b3dd5da89fd11da0c3cfc (patch) | |
tree | 632ce83c49ee2c8942e2c8bc6a7ae4b804964bf2 | |
parent | 5671a11b815b526289837ec4f132e5c94a02e9b6 (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.c | 17 |
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) )) |