Since we realloc 5 things in a row, and then check for failure, it's
quite possible one of our old pointers is now pointing to something
completely different, so instead update the pointers as we successfully
realloc them and then jump to the normal error processing cleanup if
one fails.

Signed-off-by: Alan Coopersmith <[email protected]>
---
 src/FSFontInfo.c |   57 ++++++++++++------------------------------------------
 1 file changed, 12 insertions(+), 45 deletions(-)

diff --git a/src/FSFontInfo.c b/src/FSFontInfo.c
index 0b71719..2abff4f 100644
--- a/src/FSFontInfo.c
+++ b/src/FSFontInfo.c
@@ -134,52 +134,19 @@ FSListFontsWithXInfo(
                goto badmem;
 
            if (fhdr) {
-               FSXFontInfoHeader **tmp_fhdr =
-                    FSrealloc(fhdr, sizeof(FSXFontInfoHeader *) * size);
-               char **tmp_flist =
-                    FSrealloc(flist, sizeof(char *) * size);
-               FSPropInfo **tmp_pi =
-                    FSrealloc(pi, sizeof(FSPropInfo *) * size);
-               FSPropOffset **tmp_po =
-                    FSrealloc(po, sizeof(FSPropOffset *) * size);
-               unsigned char **tmp_pd =
-                    FSrealloc(pd, sizeof(unsigned char *) * size);
-
-               if (!tmp_fhdr || !tmp_flist || !tmp_pi || !tmp_po || !tmp_pd) {
-                   for (j = (i - 1); j >= 0; j--) {
-                       FSfree(flist[j]);
-                       FSfree(fhdr[j]);
-                       FSfree(pi[j]);
-                       FSfree(po[j]);
-                       FSfree(pd[j]);
-                   }
-                   if (tmp_flist)
-                       FSfree(tmp_flist);
-                   else
-                       FSfree(flist);
-                   if (tmp_fhdr)
-                       FSfree(tmp_fhdr);
-                   else
-                       FSfree(fhdr);
-                   if (tmp_pi)
-                       FSfree(tmp_pi);
-                   else
-                       FSfree(pi);
-                   if (tmp_po)
-                       FSfree(tmp_po);
-                   else
-                       FSfree(po);
-                   if (tmp_pd)
-                       FSfree(tmp_pd);
-                   else
-                       FSfree(pd);
-                   goto clearwire;
+#define ResizeArray(var, type) { \
+                   type **tmp = FSrealloc(var, sizeof(type *) * size); \
+                   if (tmp)                                            \
+                       var = tmp;                                      \
+                   else                                                \
+                       goto badmem;                                    \
                }
-               fhdr = tmp_fhdr;
-               flist = tmp_flist;
-               pi = tmp_pi;
-               po = tmp_po;
-               pd = tmp_pd;
+
+               ResizeArray(fhdr, FSXFontInfoHeader)
+               ResizeArray(flist, char)
+               ResizeArray(pi, FSPropInfo)
+               ResizeArray(po, FSPropOffset)
+               ResizeArray(pd, unsigned char)
            } else {
                if (!(fhdr = FSmalloc(sizeof(FSXFontInfoHeader *) * size)))
                    goto clearwire;
-- 
1.7.9.2

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to