diff options
author | Alan Coopersmith <alan.coopersmith@oracle.com> | 2013-04-10 21:43:40 -0700 |
---|---|---|
committer | Alan Coopersmith <alan.coopersmith@oracle.com> | 2013-04-13 21:39:08 -0700 |
commit | f6030dd569094fb29720a4bf54aec784b1edcac5 (patch) | |
tree | de36df8729bf5179dd6ce52ccbe8babd72003611 | |
parent | 1f260bfdcb8d83d6c21db70ad6ed0fa94e5f5abf (diff) |
Get rid of more duplication in error cleanup code in FSListFontsWithXInfo
Also get rely on free() to handle null pointers in cleanup code instead
of checking each one ourselves.
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
-rw-r--r-- | src/FSFontInfo.c | 142 |
1 files changed, 51 insertions, 91 deletions
diff --git a/src/FSFontInfo.c b/src/FSFontInfo.c index 2abff4f..b51e043 100644 --- a/src/FSFontInfo.c +++ b/src/FSFontInfo.c @@ -78,6 +78,7 @@ FSListFontsWithXInfo( fsPropInfo local_pi; fsPropOffset local_po; Status status; + Bool eat_data = True; GetReq(ListFontsWithXInfo, req); req->maxNames = maxNames; @@ -101,26 +102,8 @@ FSListFontsWithXInfo( SIZEOF(fsGenericReply)) >> 2), fsFalse); } if (!status) { - for (j = (i - 1); j >= 0; j--) { - FSfree(fhdr[j]); - FSfree(pi[j]); - FSfree(po[j]); - FSfree(pd[j]); - FSfree(flist[j]); - } - if (flist) - FSfree(flist); - if (fhdr) - FSfree(fhdr); - if (pi) - FSfree(pi); - if (po) - FSfree(po); - if (pd) - FSfree(pd); - - SyncHandle(); - return (char **) NULL; + eat_data = False; + goto badmem; } if (reply.nameLength == 0) /* got last reply in version 1 */ break; @@ -148,30 +131,16 @@ FSListFontsWithXInfo( ResizeArray(po, FSPropOffset) ResizeArray(pd, unsigned char) } else { - if (!(fhdr = FSmalloc(sizeof(FSXFontInfoHeader *) * size))) - goto clearwire; - if (!(flist = FSmalloc(sizeof(char *) * size))) { - FSfree(fhdr); - goto clearwire; - } - if (!(pi = FSmalloc(sizeof(FSPropInfo *) * size))) { - FSfree(fhdr); - FSfree(flist); - goto clearwire; - } - if (!(po = FSmalloc(sizeof(FSPropOffset *) * size))) { - FSfree(fhdr); - FSfree(flist); - FSfree(pi); - goto clearwire; - } - if (!(pd = FSmalloc(sizeof(unsigned char *) * size))) { - FSfree(fhdr); - FSfree(flist); - FSfree(pi); - FSfree(po); - goto clearwire; +#define InitArray(var, type) \ + if ((var = FSmalloc(sizeof(type *) * size)) == NULL) { \ + goto badmem; \ } + + InitArray(fhdr, FSXFontInfoHeader) + InitArray(flist, char) + InitArray(pi, FSPropInfo) + InitArray(po, FSPropOffset) + InitArray(pd, unsigned char) } } fhdr[i] = FSmalloc(sizeof(FSXFontInfoHeader)); @@ -182,45 +151,33 @@ FSListFontsWithXInfo( /* alloc space for the name */ flist[i] = FSmalloc(reply.nameLength + 1); + if (!flist[i]) + goto cleanfhdr; if (FSProtocolVersion(svr) == 1) { /* get the name */ - if (!flist[i]) { - nbytes = (reply.nameLength + 3) & ~3; - _FSEatData(svr, (unsigned long) nbytes); - goto badmem; - } _FSReadPad(svr, flist[i], (long) reply.nameLength); flist[i][reply.nameLength] = '\0'; } pi[i] = FSmalloc(sizeof(FSPropInfo)); - if (!pi[i]) { - FSfree(fhdr[i]); - goto badmem; - } + if (!pi[i]) + goto cleanflist; _FSReadPad(svr, (char *) &local_pi, SIZEOF(fsPropInfo)); pi[i]->num_offsets = local_pi.num_offsets; pi[i]->data_len = local_pi.data_len; #if SIZE_MAX <= UINT_MAX if (pi[i]->num_offsets > SIZE_MAX / sizeof(FSPropOffset)) - goto badmem; + goto cleanpi; #endif po[i] = FSmalloc(pi[i]->num_offsets * sizeof(FSPropOffset)); - if (!po[i]) { - FSfree(fhdr[i]); - FSfree(pi[i]); - goto badmem; - } + if (!po[i]) + goto cleanpi; pd[i] = FSmalloc(pi[i]->data_len); - if (!pd[i]) { - FSfree(fhdr[i]); - FSfree(pi[i]); - FSfree(po[i]); - goto badmem; - } + if (!pd[i]) + goto cleanpo; /* get offsets */ for (j=0; j<pi[i]->num_offsets; j++) { @@ -241,11 +198,6 @@ FSListFontsWithXInfo( if (FSProtocolVersion(svr) != 1) { /* get the name */ - if (!flist[i]) { - nbytes = (reply.nameLength + 3) & ~3; - _FSEatData(svr, (unsigned long) nbytes); - goto badmem; - } _FSRead(svr, flist[i], (long) reply.nameLength); flist[i][reply.nameLength] = '\0'; @@ -254,7 +206,7 @@ FSListFontsWithXInfo( } /* avoid integer overflow */ if (i > INT_MAX - 1) { - goto badmem; + goto cleanpd; } } *info = fhdr; @@ -265,6 +217,18 @@ FSListFontsWithXInfo( SyncHandle(); return flist; +/* Error cleanup for when we're partway through filling in item #i in arrays */ +cleanpd: + FSfree(pd[i]); +cleanpo: + FSfree(po[i]); +cleanpi: + FSfree(pi[i]); +cleanflist: + FSfree(flist[i]); +cleanfhdr: + FSfree(fhdr[i]); +/* Error cleanup for all previously filled in items in the arrays */ badmem: for (j = (i - 1); j >= 0; j--) { FSfree(pi[j]); @@ -273,29 +237,25 @@ badmem: FSfree(flist[j]); FSfree(fhdr[j]); } - if (flist) - FSfree(flist); - if (fhdr) - FSfree(fhdr); - if (pi) - FSfree(pi); - if (po) - FSfree(po); - if (pd) - FSfree(pd); + FSfree(flist); + FSfree(fhdr); + FSfree(pi); + FSfree(po); + FSfree(pd); + if (eat_data) { + do { + fsPropInfo ti; -clearwire: - do { - fsPropInfo ti; - - _FSEatData(svr, (reply.nameLength + 3) & ~3); - _FSReadPad(svr, (char *) &ti, SIZEOF(fsPropInfo)); - _FSEatData(svr, (SIZEOF(fsPropOffset) * ti.num_offsets)); - _FSEatData(svr, ti.data_len); - } while (_FSReply(svr, (fsReply *) & reply, - ((SIZEOF(fsListFontsWithXInfoReply) - - SIZEOF(fsGenericReply)) >> 2), fsFalse) && (reply.nameLength != 0)); + _FSEatData(svr, (reply.nameLength + 3) & ~3); + _FSReadPad(svr, (char *) &ti, SIZEOF(fsPropInfo)); + _FSEatData(svr, (SIZEOF(fsPropOffset) * ti.num_offsets)); + _FSEatData(svr, ti.data_len); + } while (_FSReply(svr, (fsReply *) &reply, + ((SIZEOF(fsListFontsWithXInfoReply) + - SIZEOF(fsGenericReply)) >> 2), fsFalse) + && (reply.nameLength != 0)); + } SyncHandle(); return (char **) NULL; } |