diff options
author | Mikhail Gusarov <dottedmag@dottedmag.net> | 2010-05-06 00:16:24 +0700 |
---|---|---|
committer | Mikhail Gusarov <dottedmag@dottedmag.net> | 2010-05-13 00:20:32 +0700 |
commit | e983848ab44b0769f97f6207f1aa8b4f127be6a9 (patch) | |
tree | 8720b60558a3a5fab7b968ab514f1f9ec71863e9 | |
parent | 4f0006c2203abe0b7660c5068d6afe236f9bd2a4 (diff) |
Clean {X,XNF}{alloc,calloc,realloc,free,strdup} from pre-C89 baggage
C89 guarantees alignment of pointers returned from malloc/calloc/realloc, so
stop fiddling with alignment manually and just pass the arguments to library
functions.
Also convert silent error when negative size is passed into function into
warning in log file.
Signed-off-by: Mikhail Gusarov <dottedmag@dottedmag.net>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | include/os.h | 14 | ||||
-rw-r--r-- | os/utils.c | 108 |
2 files changed, 51 insertions, 71 deletions
diff --git a/include/os.h b/include/os.h index 3b07bdee9..b49117728 100644 --- a/include/os.h +++ b/include/os.h @@ -214,15 +214,15 @@ extern _X_EXPORT int set_font_authorizations( #ifndef _HAVE_XALLOC_DECLS #define _HAVE_XALLOC_DECLS -extern _X_EXPORT pointer Xalloc(unsigned long /*amount*/); -extern _X_EXPORT pointer Xcalloc(unsigned long /*amount*/); -extern _X_EXPORT pointer Xrealloc(pointer /*ptr*/, unsigned long /*amount*/); -extern _X_EXPORT void Xfree(pointer /*ptr*/); +extern _X_EXPORT void *Xalloc(unsigned long /*amount*/); +extern _X_EXPORT void *Xcalloc(unsigned long /*amount*/); +extern _X_EXPORT void *Xrealloc(void * /*ptr*/, unsigned long /*amount*/); +extern _X_EXPORT void Xfree(void * /*ptr*/); #endif -extern _X_EXPORT pointer XNFalloc(unsigned long /*amount*/); -extern _X_EXPORT pointer XNFcalloc(unsigned long /*amount*/); -extern _X_EXPORT pointer XNFrealloc(pointer /*ptr*/, unsigned long /*amount*/); +extern _X_EXPORT void *XNFalloc(unsigned long /*amount*/); +extern _X_EXPORT void *XNFcalloc(unsigned long /*amount*/); +extern _X_EXPORT void *XNFrealloc(void * /*ptr*/, unsigned long /*amount*/); extern _X_EXPORT char *Xstrdup(const char *s); extern _X_EXPORT char *XNFstrdup(const char *s); diff --git a/os/utils.c b/os/utils.c index 7ab7cc3db..3dffbd822 100644 --- a/os/utils.c +++ b/os/utils.c @@ -1024,32 +1024,30 @@ set_font_authorizations(char **authorizations, int *authlen, pointer client) void * Xalloc(unsigned long amount) { - void *ptr; + /* + * Xalloc used to return NULL when large amount of memory is requested. In + * order to catch the buggy callers this warning has been added, slated to + * removal by anyone who touches this code (or just looks at it) in 2011. + * + * -- Mikhail Gusarov + */ + if ((long)amount <= 0) + ErrorF("Warning: Xalloc: " + "requesting unpleasantly large amount of memory: %lu bytes.\n", + amount); - if ((long)amount <= 0) { - return NULL; - } - /* aligned extra on long word boundary */ - amount = (amount + (sizeof(long) - 1)) & ~(sizeof(long) - 1); - ptr = malloc(amount); - return ptr; + return malloc(amount); } /***************** - * XNFalloc - * "no failure" realloc + * XNFalloc + * "no failure" alloc *****************/ void * XNFalloc(unsigned long amount) { - void *ptr; - - if ((long)amount <= 0) - return NULL; - /* aligned extra on long word boundary */ - amount = (amount + (sizeof(long) - 1)) & ~(sizeof(long) - 1); - ptr = malloc(amount); + void *ptr = malloc(amount); if (!ptr) FatalError("Out of memory"); return ptr; @@ -1062,12 +1060,7 @@ XNFalloc(unsigned long amount) void * Xcalloc(unsigned long amount) { - void *ret; - - ret = Xalloc (amount); - if (ret) - bzero (ret, (int) amount); - return ret; + return calloc(1, amount); } /***************** @@ -1077,13 +1070,9 @@ Xcalloc(unsigned long amount) void * XNFcalloc(unsigned long amount) { - void *ret; - - ret = Xalloc (amount); - if (ret) - bzero (ret, (int) amount); - else if ((long)amount > 0) - FatalError("Out of memory"); + void *ret = calloc(1, amount); + if (!ret) + FatalError("XNFcalloc: Out of memory"); return ret; } @@ -1092,21 +1081,21 @@ XNFcalloc(unsigned long amount) *****************/ void * -Xrealloc(pointer ptr, unsigned long amount) +Xrealloc(void *ptr, unsigned long amount) { + /* + * Xrealloc used to return NULL when large amount of memory is requested. In + * order to catch the buggy callers this warning has been added, slated to + * removal by anyone who touches this code (or just looks at it) in 2011. + * + * -- Mikhail Gusarov + */ if ((long)amount <= 0) - { - if (ptr && !amount) - free(ptr); - return NULL; - } - amount = (amount + (sizeof(long) - 1)) & ~(sizeof(long) - 1); - if (ptr) - ptr = realloc(ptr, amount); - else - ptr = malloc(amount); + ErrorF("Warning: Xrealloc: " + "requesting unpleasantly large amount of memory: %lu bytes.\n", + amount); - return ptr; + return realloc(ptr, amount); } /***************** @@ -1115,14 +1104,12 @@ Xrealloc(pointer ptr, unsigned long amount) *****************/ void * -XNFrealloc(pointer ptr, unsigned long amount) +XNFrealloc(void *ptr, unsigned long amount) { - if ((ptr = Xrealloc(ptr, amount)) == NULL) - { - if ((long)amount > 0) - FatalError( "Out of memory" ); - } - return ptr; + void *ret = realloc(ptr, amount); + if (!ret) + FatalError("XNFrealloc: Out of memory"); + return ret; } /***************** @@ -1131,39 +1118,32 @@ XNFrealloc(pointer ptr, unsigned long amount) *****************/ void -Xfree(pointer ptr) +Xfree(void *ptr) { - if (ptr) - free(ptr); + free(ptr); } char * Xstrdup(const char *s) { - char *sd; - if (s == NULL) return NULL; - - sd = Xalloc(strlen(s) + 1); - if (sd != NULL) - strcpy(sd, s); - return sd; + return strdup(s); } - char * XNFstrdup(const char *s) { - char *sd; + char *ret; if (s == NULL) return NULL; - sd = XNFalloc(strlen(s) + 1); - strcpy(sd, s); - return sd; + ret = strdup(s); + if (!ret) + FatalError("XNFstrdup: Out of memory"); + return ret; } |