summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Gusarov <dottedmag@dottedmag.net>2010-05-06 00:16:24 +0700
committerMikhail Gusarov <dottedmag@dottedmag.net>2010-05-13 00:20:32 +0700
commite983848ab44b0769f97f6207f1aa8b4f127be6a9 (patch)
tree8720b60558a3a5fab7b968ab514f1f9ec71863e9
parent4f0006c2203abe0b7660c5068d6afe236f9bd2a4 (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.h14
-rw-r--r--os/utils.c108
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;
}