[poppler] goo/gmem.cc goo/gmem.h
Albert Astals Cid
aacid at kemper.freedesktop.org
Sat Mar 21 05:24:38 PDT 2009
goo/gmem.cc | 92 +++++++++++++++++++++++++++++-------------------------------
goo/gmem.h | 4 +-
2 files changed, 48 insertions(+), 48 deletions(-)
New commits:
commit 50c4ee413929e5a70133839e3cde039da738fab2
Author: Albert Astals Cid <aacid at kde.org>
Date: Wed Mar 18 22:00:05 2009 +0100
Add more _checkoverflow variants, rework internals
diff --git a/goo/gmem.cc b/goo/gmem.cc
index ca41928..298d5dd 100644
--- a/goo/gmem.cc
+++ b/goo/gmem.cc
@@ -14,7 +14,7 @@
// under GPL version 2 or later
//
// Copyright (C) 2005 Takashi Iwai <tiwai at suse.de>
-// Copyright (C) 2007, 2008 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2007-2009 Albert Astals Cid <aacid at kde.org>
// Copyright (C) 2008 Jonathan Kew <jonathan_kew at sil.org>
//
// To see a description of the changes please see the Changelog file that
@@ -63,7 +63,7 @@ static int gMemInUse = 0;
#endif /* DEBUG_MEM */
-void *gmalloc(size_t size) GMEM_EXCEP {
+inline static void *gmalloc(size_t size, bool checkoverflow) GMEM_EXCEP {
#ifdef DEBUG_MEM
int size1;
char *mem;
@@ -80,7 +80,8 @@ void *gmalloc(size_t size) GMEM_EXCEP {
throw GMemException();
#else
fprintf(stderr, "Out of memory\n");
- exit(1);
+ if (checkoverflow) return NULL;
+ else exit(1);
#endif
}
hdr = (GMemHdr *)mem;
@@ -115,14 +116,23 @@ void *gmalloc(size_t size) GMEM_EXCEP {
throw GMemException();
#else
fprintf(stderr, "Out of memory\n");
- exit(1);
+ if (checkoverflow) return NULL;
+ else exit(1);
#endif
}
return p;
#endif
}
-void *grealloc(void *p, size_t size) GMEM_EXCEP {
+void *gmalloc(size_t size) GMEM_EXCEP {
+ return gmalloc(size, false);
+}
+
+void *gmalloc_checkoverflow(size_t size) GMEM_EXCEP {
+ return gmalloc(size, true);
+}
+
+inline static void *grealloc(void *p, size_t size, bool checkoverflow) GMEM_EXCEP {
#ifdef DEBUG_MEM
GMemHdr *hdr;
void *q;
@@ -137,11 +147,11 @@ void *grealloc(void *p, size_t size) GMEM_EXCEP {
if (p) {
hdr = (GMemHdr *)((char *)p - gMemHdrSize);
oldSize = hdr->size;
- q = gmalloc(size);
+ q = gmalloc(size, checkoverflow);
memcpy(q, p, size < oldSize ? size : oldSize);
gfree(p);
} else {
- q = gmalloc(size);
+ q = gmalloc(size, checkoverflow);
}
return q;
#else
@@ -163,32 +173,23 @@ void *grealloc(void *p, size_t size) GMEM_EXCEP {
throw GMemException();
#else
fprintf(stderr, "Out of memory\n");
- exit(1);
+ if (checkoverflow) return NULL;
+ else exit(1);
#endif
}
return q;
#endif
}
-void *gmallocn(int nObjs, int objSize) GMEM_EXCEP {
- int n;
+void *grealloc(void *p, size_t size) GMEM_EXCEP {
+ return grealloc(p, size, false);
+}
- if (nObjs == 0) {
- return NULL;
- }
- n = nObjs * objSize;
- if (objSize <= 0 || nObjs < 0 || nObjs >= INT_MAX / objSize) {
-#if USE_EXCEPTIONS
- throw GMemException();
-#else
- fprintf(stderr, "Bogus memory allocation size\n");
- exit(1);
-#endif
- }
- return gmalloc(n);
+void *grealloc_checkoverflow(void *p, size_t size) GMEM_EXCEP {
+ return grealloc(p, size, true);
}
-void *gmallocn_checkoverflow(int nObjs, int objSize) GMEM_EXCEP {
+inline static void *gmallocn(int nObjs, int objSize, bool checkoverflow) GMEM_EXCEP {
int n;
if (nObjs == 0) {
@@ -200,34 +201,22 @@ void *gmallocn_checkoverflow(int nObjs, int objSize) GMEM_EXCEP {
throw GMemException();
#else
fprintf(stderr, "Bogus memory allocation size\n");
- return NULL;
+ if (checkoverflow) return NULL;
+ else exit(1);
#endif
}
- return gmalloc(n);
+ return gmalloc(n, checkoverflow);
}
-void *greallocn(void *p, int nObjs, int objSize) GMEM_EXCEP {
- int n;
+void *gmallocn(int nObjs, int objSize) GMEM_EXCEP {
+ return gmallocn(nObjs, objSize, false);
+}
- if (nObjs == 0) {
- if (p) {
- gfree(p);
- }
- return NULL;
- }
- n = nObjs * objSize;
- if (objSize <= 0 || nObjs < 0 || nObjs >= INT_MAX / objSize) {
-#if USE_EXCEPTIONS
- throw GMemException();
-#else
- fprintf(stderr, "Bogus memory allocation size\n");
- exit(1);
-#endif
- }
- return grealloc(p, n);
+void *gmallocn_checkoverflow(int nObjs, int objSize) GMEM_EXCEP {
+ return gmallocn(nObjs, objSize, true);
}
-void *greallocn_checkoverflow(void *p, int nObjs, int objSize) GMEM_EXCEP {
+inline static void *greallocn(void *p, int nObjs, int objSize, bool checkoverflow) GMEM_EXCEP {
int n;
if (nObjs == 0) {
@@ -242,10 +231,19 @@ void *greallocn_checkoverflow(void *p, int nObjs, int objSize) GMEM_EXCEP {
throw GMemException();
#else
fprintf(stderr, "Bogus memory allocation size\n");
- return NULL;
+ if (checkoverflow) return NULL;
+ else exit(1);
#endif
}
- return grealloc(p, n);
+ return grealloc(p, n, checkoverflow);
+}
+
+void *greallocn(void *p, int nObjs, int objSize) GMEM_EXCEP {
+ return greallocn(p, nObjs, objSize, false);
+}
+
+void *greallocn_checkoverflow(void *p, int nObjs, int objSize) GMEM_EXCEP {
+ return greallocn(p, nObjs, objSize, true);
}
void gfree(void *p) {
diff --git a/goo/gmem.h b/goo/gmem.h
index 5258fa7..96d834d 100644
--- a/goo/gmem.h
+++ b/goo/gmem.h
@@ -14,7 +14,7 @@
// under GPL version 2 or later
//
// Copyright (C) 2005 Takashi Iwai <tiwai at suse.de>
-// Copyright (C) 2007, 2008 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2007-2009 Albert Astals Cid <aacid at kde.org>
// Copyright (C) 2008 Jonathan Kew <jonathan_kew at sil.org>
//
// To see a description of the changes please see the Changelog file that
@@ -53,12 +53,14 @@ extern "C" {
* returns NULL.
*/
extern void *gmalloc(size_t size) GMEM_EXCEP;
+extern void *gmalloc_checkoverflow(size_t size) GMEM_EXCEP;
/*
* Same as realloc, but prints error message and exits if realloc()
* returns NULL. If <p> is NULL, calls malloc instead of realloc().
*/
extern void *grealloc(void *p, size_t size) GMEM_EXCEP;
+extern void *grealloc_checkoverflow(size_t size) GMEM_EXCEP;
/*
* These are similar to gmalloc and grealloc, but take an object count
More information about the poppler
mailing list