From ae70f5c6479514690c7b1aea57f26650ce918779 Mon Sep 17 00:00:00 2001 From: Morten Welinder Date: Thu, 15 Feb 2001 21:23:50 +0000 Subject: [PATCH] (PSDRV_AFMGetCharMetrics): Use unsigned chars (since isspace is used). (PSDRV_AFMParse): Don't crash on missing font name. Use unsigned chars. Fix peculiar inconsistent indentation. Don't leak a FILE. Catch problematic files with no line feed in them. Don't mix characters and integers. Don't overrun the buffer. --- dlls/wineps/afm.c | 64 ++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/dlls/wineps/afm.c b/dlls/wineps/afm.c index c051e56a38d..46e95951464 100644 --- a/dlls/wineps/afm.c +++ b/dlls/wineps/afm.c @@ -34,8 +34,8 @@ FONTFAMILY *PSDRV_AFMFontList = NULL; */ static void PSDRV_AFMGetCharMetrics(AFM *afm, FILE *fp) { - char line[256], valbuf[256]; - char *cp, *item, *value, *curpos, *endpos; + unsigned char line[256], valbuf[256]; + unsigned char *cp, *item, *value, *curpos, *endpos; int i; AFMMETRICS *metric; @@ -63,7 +63,7 @@ static void PSDRV_AFMGetCharMetrics(AFM *afm, FILE *fp) while(isspace(*value)) value++; cp = endpos = strchr(value, ';'); - if (!cp) { ERR("missing ;, failed.\n"); return; } + if (!cp) { ERR("missing ;, failed. [%s]\n", line); return; } while(isspace(*--cp)) ; memcpy(valbuf, value, cp - value + 1); @@ -126,11 +126,12 @@ static void PSDRV_AFMGetCharMetrics(AFM *afm, FILE *fp) static AFM *PSDRV_AFMParse(char const *file) { FILE *fp; - char buf[256]; - char *value; + unsigned char buf[256]; + unsigned char *value; AFM *afm; - char *cp; + unsigned char *cp; int afmfile = 0; + int c; TRACE("parsing '%s'\n", file); @@ -146,31 +147,29 @@ static AFM *PSDRV_AFMParse(char const *file) } cp = buf; - while ( ( *cp = fgetc ( fp ) ) != EOF ) { - if ( *cp == '\r' || *cp == '\n' || cp - buf == sizeof(buf)-1 ) { - if ( cp == buf ) - continue; - *(cp+1)='\0'; - } - else { - cp ++; - continue; - } - - cp = buf + strlen(buf); - do { - *cp = '\0'; - cp--; - } while(cp > buf && isspace(*cp)); - cp = buf; - - if ( afmfile == 0 && strncmp ( buf, "StartFontMetrics", 16 ) ) { - HeapFree ( PSDRV_Heap, 0, afm ); - return NULL; + while ( ( c = fgetc ( fp ) ) != EOF ) { + *cp = c; + if ( *cp == '\r' || *cp == '\n' || cp - buf == sizeof(buf)-2 ) { + if ( cp == buf ) + continue; + *(cp+1)='\0'; } else { - afmfile = 1; + cp ++; + continue; } + + cp = buf + strlen(buf); + do { + *cp = '\0'; + cp--; + } while(cp > buf && isspace(*cp)); + + cp = buf; + + if ( afmfile == 0 && strncmp ( buf, "StartFontMetrics", 16 ) ) + break; + afmfile = 1; value = strchr(buf, ' '); if(value) @@ -276,8 +275,15 @@ static AFM *PSDRV_AFMParse(char const *file) } fclose(fp); - if(afm->FontName == NULL) + if (afmfile == 0) { + HeapFree ( PSDRV_Heap, 0, afm ); + return NULL; + } + + if(afm->FontName == NULL) { WARN("%s contains no FontName.\n", file); + afm->FontName = HEAP_strdupA(PSDRV_Heap, 0, "nofont"); + } if(afm->FullName == NULL) afm->FullName = HEAP_strdupA(PSDRV_Heap, 0, afm->FontName); if(afm->FamilyName == NULL)