diff options
author | Robin Watts <Robin.Watts@artifex.com> | 2011-05-31 15:49:39 +0100 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2011-05-31 17:28:21 +0200 |
commit | 97b83d84e3d10ccd298f9c54713323a3e41ce7f3 (patch) | |
tree | 4877fbe7f4d2afff109b3bafa11bed6c013afd5b /fitz | |
parent | 89bf9896bd9d05500ac6494452a1b9d9cf8a67cb (diff) | |
download | mupdf-97b83d84e3d10ccd298f9c54713323a3e41ce7f3.tar.xz |
Fix assert in scale: see Bug 692245.
Bug 692245 gives a file that produces a runtime assert in mupdf due to an
extremely large ctm offset (unrepresentable in a float). We fix our code
here so that such floats are always read as 1.0.
In this particular case, the exact value read doesn't seem to matter. We
match acrobat. We pick 1.0 rather than 0.0 as this is less likely to
provoke division by 0 errors later on.
Diffstat (limited to 'fitz')
-rw-r--r-- | fitz/base_string.c | 18 | ||||
-rw-r--r-- | fitz/fitz.h | 3 |
2 files changed, 21 insertions, 0 deletions
diff --git a/fitz/base_string.c b/fitz/base_string.c index 72a7a556..76748e20 100644 --- a/fitz/base_string.c +++ b/fitz/base_string.c @@ -245,3 +245,21 @@ runelen(int c) char str[10]; return runetochar(str, &c); } + +float fz_atof(const char *s) +{ + double d; + + /* The errno voodoo here checks for us reading numbers that are too + * big to fit into a double. The checks for FLT_MAX ensure that we + * don't read a number that's OK as a double and then become invalid + * as we convert to a float. */ + errno = 0; + d = strtod(s, NULL); + if (errno == ERANGE || d > FLT_MAX || d < -FLT_MAX) { + /* Return 1.0, as it's a small known value that won't cause a + * divide by 0. */ + return 1.0; + } + return (float)d; +} diff --git a/fitz/fitz.h b/fitz/fitz.h index 9ba9d0b1..28306cfc 100644 --- a/fitz/fitz.h +++ b/fitz/fitz.h @@ -151,6 +151,9 @@ char *fz_strsep(char **stringp, const char *delim); int fz_strlcpy(char *dst, const char *src, int n); int fz_strlcat(char *dst, const char *src, int n); +/* Range checking atof */ +float fz_atof(const char *s); + /* utf-8 encoding and decoding */ int chartorune(int *rune, char *str); int runetochar(char *str, int *rune); |