Patch by Takashi IWAI <tiwai@xxxxxxx> (CC:) to check the return values of read (), write (), and lseek () and fix some other compiler warnings. Should make the code more robust.
diff -ru fontconfig-2.3.93.20060131.orig/fc-cat/fc-cat.c fontconfig-2.3.93.20060131/fc-cat/fc-cat.c --- fontconfig-2.3.93.20060131.orig/fc-cat/fc-cat.c 2006-01-30 17:54:22.000000000 +0100 +++ fontconfig-2.3.93.20060131/fc-cat/fc-cat.c 2006-01-31 19:23:11.000000000 +0100 @@ -196,7 +196,7 @@ while (1) { - char * dir, * ls; + char * dir; FcCacheReadString (fd, name_buf, sizeof (name_buf)); if (!strlen(name_buf)) break; @@ -241,7 +241,6 @@ { int fd; char * current_arch_machine_name; - char candidate_arch_machine_name[9+MACHINE_SIGNATURE_SIZE]; off_t current_arch_start = 0; char subdirName[FC_MAX_FILE_LEN + 1 + 12 + 1]; static char name_buf[8192], *dir; @@ -411,7 +410,7 @@ if (i >= argc) usage (argv[0]); - if (name_buf = FcCacheFileRead (fs, dirs, argv[i])) + if ((name_buf = FcCacheFileRead (fs, dirs, argv[i])) != 0) FcCachePrintSet (fs, dirs, name_buf); else { fontconfig-2.3.93.20060131/fc-catã? ã??ã?«ç?ºè¦?: fc-cat.c.orig diff -ru fontconfig-2.3.93.20060131.orig/src/fccache.c fontconfig-2.3.93.20060131/src/fccache.c --- fontconfig-2.3.93.20060131.orig/src/fccache.c 2006-01-31 11:25:37.000000000 +0100 +++ fontconfig-2.3.93.20060131/src/fccache.c 2006-01-31 19:31:07.000000000 +0100 @@ -251,10 +251,18 @@ (config_time.set && cache_stat.st_mtime < config_time.time)) { FcCache md; + off_t off; FcStrSetAdd (staleDirs, FcStrCopy ((FcChar8 *)name_buf)); - read (cache->fd, &md, sizeof (FcCache)); - lseek (cache->fd, FcCacheNextOffset (lseek(cache->fd, 0, SEEK_CUR)) + md.count, SEEK_SET); + if (read (cache->fd, &md, sizeof (FcCache)) != sizeof(FcCache)) { + perror ("read metadata"); + goto bail1; + } + off = FcCacheNextOffset (lseek(cache->fd, 0, SEEK_CUR)) + md.count; + if (lseek (cache->fd, off, SEEK_SET) != off) { + perror ("lseek"); + goto bail1; + } continue; } @@ -468,16 +476,33 @@ if (dir->name) { const char * d = (const char *)FcConfigNormalizeFontDir (config, (const FcChar8 *)dir->name); - + off_t off; + FcCacheWriteString (fd, d); for (i = 0; i < dir->subdirs->size; i++) FcCacheWriteString (fd, (char *)dir->subdirs->strs[i]); FcCacheWriteString (fd, ""); - write (fd, &dir->metadata, sizeof(FcCache)); - lseek (fd, FcCacheNextOffset (lseek(fd, 0, SEEK_CUR)), SEEK_SET); - write (fd, dir->ent, dir->metadata.count); + if (write (fd, &dir->metadata, sizeof(FcCache)) != sizeof(FcCache)) + { + perror ("write metadata"); + free (dir->ent); + continue; + } + off = FcCacheNextOffset (lseek(fd, 0, SEEK_CUR)); + if (lseek (fd, off, SEEK_SET) != off) + { + perror ("lseek"); + free (dir->ent); + continue; + } + if (write (fd, dir->ent, dir->metadata.count) != dir->metadata.count) + { + perror ("write dirent"); + free (dir->ent); + continue; + } free (dir->ent); } } @@ -1025,7 +1050,8 @@ void * current_dir_block; off_t pos; - read(fd, &metadata, sizeof(FcCache)); + if (read(fd, &metadata, sizeof(FcCache)) != sizeof(FcCache)) + return FcFalse; if (metadata.magic != FC_CACHE_MAGIC) return FcFalse; @@ -1238,11 +1264,20 @@ FcCacheWriteString (fd, (char *)dirs->strs[i]); FcCacheWriteString (fd, ""); - write (fd, &metadata, sizeof(FcCache)); + if (write (fd, &metadata, sizeof(FcCache)) != sizeof(FcCache)) { + perror("write metadata"); + goto bail5; + } if (metadata.count) { - lseek (fd, FcCacheNextOffset (lseek(fd, 0, SEEK_END)), SEEK_SET); - write (fd, current_dir_block, metadata.count); + off_t off = FcCacheNextOffset (lseek(fd, 0, SEEK_END)); + if (lseek (fd, off, SEEK_SET) != off) + perror("lseek"); + else { + if (write (fd, current_dir_block, metadata.count) != + metadata.count) + perror("write current_dir_block"); + } free (current_dir_block); } fontconfig-2.3.93.20060131/srcã? ã??ã?«ç?ºè¦?: fccache.c.orig diff -ru fontconfig-2.3.93.20060131.orig/src/fcxml.c fontconfig-2.3.93.20060131/src/fcxml.c --- fontconfig-2.3.93.20060131.orig/src/fcxml.c 2006-01-26 17:14:29.000000000 +0100 +++ fontconfig-2.3.93.20060131/src/fcxml.c 2006-01-31 19:23:11.000000000 +0100 @@ -493,10 +493,10 @@ { if (parse->name) fprintf (stderr, "Fontconfig %s: \"%s\", line %d: ", s, - parse->name, XML_GetCurrentLineNumber (parse->parser)); + parse->name, (int)XML_GetCurrentLineNumber (parse->parser)); else fprintf (stderr, "Fontconfig %s: line %d: ", s, - XML_GetCurrentLineNumber (parse->parser)); + (int)XML_GetCurrentLineNumber (parse->parser)); if (severe >= FcSevereError) parse->error = FcTrue; }
-- Mike FABIAN <mfabian@xxxxxxx> http://www.suse.de/~mfabian 睡眠不足はいい仕事の敵だ。
_______________________________________________ Fontconfig mailing list Fontconfig@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/fontconfig