|
Lines 152-157
Link Here
|
| 152 |
* Various bug fixes and enhancements. |
152 |
* Various bug fixes and enhancements. |
| 153 |
*/ |
153 |
*/ |
| 154 |
|
154 |
|
|
|
155 |
#include <limits.h> |
| 156 |
#include <stdint.h> |
| 155 |
#include <stdio.h> |
157 |
#include <stdio.h> |
| 156 |
#include <stdlib.h> |
158 |
#include <stdlib.h> |
| 157 |
#include <stdarg.h> |
159 |
#include <stdarg.h> |
|
Lines 313-320
size_t count
Link Here
|
| 313 |
icmFileMem *p = (icmFileMem *)pp; |
315 |
icmFileMem *p = (icmFileMem *)pp; |
| 314 |
size_t len; |
316 |
size_t len; |
| 315 |
|
317 |
|
|
|
318 |
if (count > 0 && size > SIZE_MAX / count) |
| 319 |
return 0; |
| 320 |
|
| 316 |
len = size * count; |
321 |
len = size * count; |
| 317 |
if ((p->cur + len) >= p->end) { /* Too much */ |
322 |
if (len > (p->end - p->cur)) { /* Too much */ |
| 318 |
if (size > 0) |
323 |
if (size > 0) |
| 319 |
count = (p->end - p->cur)/size; |
324 |
count = (p->end - p->cur)/size; |
| 320 |
else |
325 |
else |
|
Lines 1634-1639
static int icmUInt8Array_write(
Link Here
|
| 1634 |
|
1639 |
|
| 1635 |
/* Allocate a file write buffer */ |
1640 |
/* Allocate a file write buffer */ |
| 1636 |
len = p->get_size((icmBase *)p); |
1641 |
len = p->get_size((icmBase *)p); |
|
|
1642 |
if (icp->errc) |
| 1643 |
return icp->errc; |
| 1637 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
1644 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 1638 |
sprintf(icp->err,"icmUInt8Array_write malloc() failed"); |
1645 |
sprintf(icp->err,"icmUInt8Array_write malloc() failed"); |
| 1639 |
return icp->errc = 2; |
1646 |
return icp->errc = 2; |
|
Lines 1698-1704
static int icmUInt8Array_allocate(
Link Here
|
| 1698 |
if (p->size != p->_size) { |
1705 |
if (p->size != p->_size) { |
| 1699 |
if (p->data != NULL) |
1706 |
if (p->data != NULL) |
| 1700 |
icp->al->free(icp->al, p->data); |
1707 |
icp->al->free(icp->al, p->data); |
| 1701 |
if ((p->data = (unsigned int *) icp->al->malloc(icp->al, p->size * sizeof(unsigned int))) == NULL) { |
1708 |
if ((p->data = (unsigned int *) icp->al->calloc(icp->al, p->size, sizeof(unsigned int))) == NULL) { |
| 1702 |
sprintf(icp->err,"icmUInt8Array_alloc: malloc() of icmUInt8Array data failed"); |
1709 |
sprintf(icp->err,"icmUInt8Array_alloc: malloc() of icmUInt8Array data failed"); |
| 1703 |
return icp->errc = 2; |
1710 |
return icp->errc = 2; |
| 1704 |
} |
1711 |
} |
|
Lines 1749-1754
static unsigned int icmUInt16Array_get_s
Link Here
|
| 1749 |
icmUInt16Array *p = (icmUInt16Array *)pp; |
1756 |
icmUInt16Array *p = (icmUInt16Array *)pp; |
| 1750 |
unsigned int len = 0; |
1757 |
unsigned int len = 0; |
| 1751 |
len += 8; /* 8 bytes for tag and padding */ |
1758 |
len += 8; /* 8 bytes for tag and padding */ |
|
|
1759 |
if (p->size > (UINT_MAX - len) / 2) { |
| 1760 |
p->icp->errc = 1; |
| 1761 |
return (unsigned int) -1; |
| 1762 |
} |
| 1752 |
len += p->size * 2; /* 2 bytes for each UInt16 */ |
1763 |
len += p->size * 2; /* 2 bytes for each UInt16 */ |
| 1753 |
return len; |
1764 |
return len; |
| 1754 |
} |
1765 |
} |
|
Lines 1821-1826
static int icmUInt16Array_write(
Link Here
|
| 1821 |
|
1832 |
|
| 1822 |
/* Allocate a file write buffer */ |
1833 |
/* Allocate a file write buffer */ |
| 1823 |
len = p->get_size((icmBase *)p); |
1834 |
len = p->get_size((icmBase *)p); |
|
|
1835 |
if (icp->errc) |
| 1836 |
return icp->errc; |
| 1824 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
1837 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 1825 |
sprintf(icp->err,"icmUInt16Array_write malloc() failed"); |
1838 |
sprintf(icp->err,"icmUInt16Array_write malloc() failed"); |
| 1826 |
return icp->errc = 2; |
1839 |
return icp->errc = 2; |
|
Lines 1885-1891
static int icmUInt16Array_allocate(
Link Here
|
| 1885 |
if (p->size != p->_size) { |
1898 |
if (p->size != p->_size) { |
| 1886 |
if (p->data != NULL) |
1899 |
if (p->data != NULL) |
| 1887 |
icp->al->free(icp->al, p->data); |
1900 |
icp->al->free(icp->al, p->data); |
| 1888 |
if ((p->data = (unsigned int *) icp->al->malloc(icp->al, p->size * sizeof(unsigned int))) == NULL) { |
1901 |
if ((p->data = (unsigned int *) icp->al->calloc(icp->al, p->size, sizeof(unsigned int))) == NULL) { |
| 1889 |
sprintf(icp->err,"icmUInt16Array_alloc: malloc() of icmUInt16Array data failed"); |
1902 |
sprintf(icp->err,"icmUInt16Array_alloc: malloc() of icmUInt16Array data failed"); |
| 1890 |
return icp->errc = 2; |
1903 |
return icp->errc = 2; |
| 1891 |
} |
1904 |
} |
|
Lines 1936-1941
static unsigned int icmUInt32Array_get_s
Link Here
|
| 1936 |
icmUInt32Array *p = (icmUInt32Array *)pp; |
1949 |
icmUInt32Array *p = (icmUInt32Array *)pp; |
| 1937 |
unsigned int len = 0; |
1950 |
unsigned int len = 0; |
| 1938 |
len += 8; /* 8 bytes for tag and padding */ |
1951 |
len += 8; /* 8 bytes for tag and padding */ |
|
|
1952 |
if (p->size > (UINT_MAX - len) / 4) { |
| 1953 |
p->icp->errc = 1; |
| 1954 |
return (unsigned int) -1; |
| 1955 |
} |
| 1939 |
len += p->size * 4; /* 4 bytes for each UInt32 */ |
1956 |
len += p->size * 4; /* 4 bytes for each UInt32 */ |
| 1940 |
return len; |
1957 |
return len; |
| 1941 |
} |
1958 |
} |
|
Lines 2008-2013
static int icmUInt32Array_write(
Link Here
|
| 2008 |
|
2025 |
|
| 2009 |
/* Allocate a file write buffer */ |
2026 |
/* Allocate a file write buffer */ |
| 2010 |
len = p->get_size((icmBase *)p); |
2027 |
len = p->get_size((icmBase *)p); |
|
|
2028 |
if (icp->errc) |
| 2029 |
return icp->errc; |
| 2011 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
2030 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 2012 |
sprintf(icp->err,"icmUInt32Array_write malloc() failed"); |
2031 |
sprintf(icp->err,"icmUInt32Array_write malloc() failed"); |
| 2013 |
return icp->errc = 2; |
2032 |
return icp->errc = 2; |
|
Lines 2072-2078
static int icmUInt32Array_allocate(
Link Here
|
| 2072 |
if (p->size != p->_size) { |
2091 |
if (p->size != p->_size) { |
| 2073 |
if (p->data != NULL) |
2092 |
if (p->data != NULL) |
| 2074 |
icp->al->free(icp->al, p->data); |
2093 |
icp->al->free(icp->al, p->data); |
| 2075 |
if ((p->data = (unsigned int *) icp->al->malloc(icp->al, p->size * sizeof(unsigned int))) == NULL) { |
2094 |
if ((p->data = (unsigned int *) icp->al->calloc(icp->al, p->size, sizeof(unsigned int))) == NULL) { |
| 2076 |
sprintf(icp->err,"icmUInt32Array_alloc: malloc() of icmUInt32Array data failed"); |
2095 |
sprintf(icp->err,"icmUInt32Array_alloc: malloc() of icmUInt32Array data failed"); |
| 2077 |
return icp->errc = 2; |
2096 |
return icp->errc = 2; |
| 2078 |
} |
2097 |
} |
|
Lines 2123-2128
static unsigned int icmUInt64Array_get_s
Link Here
|
| 2123 |
icmUInt64Array *p = (icmUInt64Array *)pp; |
2142 |
icmUInt64Array *p = (icmUInt64Array *)pp; |
| 2124 |
unsigned int len = 0; |
2143 |
unsigned int len = 0; |
| 2125 |
len += 8; /* 8 bytes for tag and padding */ |
2144 |
len += 8; /* 8 bytes for tag and padding */ |
|
|
2145 |
if (p->size > (UINT_MAX - len) / 8) { |
| 2146 |
p->icp->errc = 1; |
| 2147 |
return (unsigned int) -1; |
| 2148 |
} |
| 2126 |
len += p->size * 8; /* 8 bytes for each UInt64 */ |
2149 |
len += p->size * 8; /* 8 bytes for each UInt64 */ |
| 2127 |
return len; |
2150 |
return len; |
| 2128 |
} |
2151 |
} |
|
Lines 2195-2200
static int icmUInt64Array_write(
Link Here
|
| 2195 |
|
2218 |
|
| 2196 |
/* Allocate a file write buffer */ |
2219 |
/* Allocate a file write buffer */ |
| 2197 |
len = p->get_size((icmBase *)p); |
2220 |
len = p->get_size((icmBase *)p); |
|
|
2221 |
if (icp->errc) |
| 2222 |
return icp->errc; |
| 2198 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
2223 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 2199 |
sprintf(icp->err,"icmUInt64Array_write malloc() failed"); |
2224 |
sprintf(icp->err,"icmUInt64Array_write malloc() failed"); |
| 2200 |
return icp->errc = 2; |
2225 |
return icp->errc = 2; |
|
Lines 2259-2265
static int icmUInt64Array_allocate(
Link Here
|
| 2259 |
if (p->size != p->_size) { |
2284 |
if (p->size != p->_size) { |
| 2260 |
if (p->data != NULL) |
2285 |
if (p->data != NULL) |
| 2261 |
icp->al->free(icp->al, p->data); |
2286 |
icp->al->free(icp->al, p->data); |
| 2262 |
if ((p->data = (icmUint64 *) icp->al->malloc(icp->al, p->size * sizeof(icmUint64))) == NULL) { |
2287 |
if ((p->data = (icmUint64 *) icp->al->calloc(icp->al, p->size, sizeof(icmUint64))) == NULL) { |
| 2263 |
sprintf(icp->err,"icmUInt64Array_alloc: malloc() of icmUInt64Array data failed"); |
2288 |
sprintf(icp->err,"icmUInt64Array_alloc: malloc() of icmUInt64Array data failed"); |
| 2264 |
return icp->errc = 2; |
2289 |
return icp->errc = 2; |
| 2265 |
} |
2290 |
} |
|
Lines 2310-2315
static unsigned int icmU16Fixed16Array_g
Link Here
|
| 2310 |
icmU16Fixed16Array *p = (icmU16Fixed16Array *)pp; |
2335 |
icmU16Fixed16Array *p = (icmU16Fixed16Array *)pp; |
| 2311 |
unsigned int len = 0; |
2336 |
unsigned int len = 0; |
| 2312 |
len += 8; /* 8 bytes for tag and padding */ |
2337 |
len += 8; /* 8 bytes for tag and padding */ |
|
|
2338 |
if (p->size > (UINT_MAX - len) / 4) { |
| 2339 |
p->icp->errc = 1; |
| 2340 |
return (unsigned int) -1; |
| 2341 |
} |
| 2313 |
len += p->size * 4; /* 4 byte for each U16Fixed16 */ |
2342 |
len += p->size * 4; /* 4 byte for each U16Fixed16 */ |
| 2314 |
return len; |
2343 |
return len; |
| 2315 |
} |
2344 |
} |
|
Lines 2382-2387
static int icmU16Fixed16Array_write(
Link Here
|
| 2382 |
|
2411 |
|
| 2383 |
/* Allocate a file write buffer */ |
2412 |
/* Allocate a file write buffer */ |
| 2384 |
len = p->get_size((icmBase *)p); |
2413 |
len = p->get_size((icmBase *)p); |
|
|
2414 |
if (icp->errc) |
| 2415 |
return icp->errc; |
| 2385 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
2416 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 2386 |
sprintf(icp->err,"icmU16Fixed16Array_write malloc() failed"); |
2417 |
sprintf(icp->err,"icmU16Fixed16Array_write malloc() failed"); |
| 2387 |
return icp->errc = 2; |
2418 |
return icp->errc = 2; |
|
Lines 2446-2452
static int icmU16Fixed16Array_allocate(
Link Here
|
| 2446 |
if (p->size != p->_size) { |
2477 |
if (p->size != p->_size) { |
| 2447 |
if (p->data != NULL) |
2478 |
if (p->data != NULL) |
| 2448 |
icp->al->free(icp->al, p->data); |
2479 |
icp->al->free(icp->al, p->data); |
| 2449 |
if ((p->data = (double *) icp->al->malloc(icp->al, p->size * sizeof(double))) == NULL) { |
2480 |
if ((p->data = (double *) icp->al->calloc(icp->al, p->size, sizeof(double))) == NULL) { |
| 2450 |
sprintf(icp->err,"icmU16Fixed16Array_alloc: malloc() of icmU16Fixed16Array data failed"); |
2481 |
sprintf(icp->err,"icmU16Fixed16Array_alloc: malloc() of icmU16Fixed16Array data failed"); |
| 2451 |
return icp->errc = 2; |
2482 |
return icp->errc = 2; |
| 2452 |
} |
2483 |
} |
|
Lines 2497-2502
static unsigned int icmS15Fixed16Array_g
Link Here
|
| 2497 |
icmS15Fixed16Array *p = (icmS15Fixed16Array *)pp; |
2528 |
icmS15Fixed16Array *p = (icmS15Fixed16Array *)pp; |
| 2498 |
unsigned int len = 0; |
2529 |
unsigned int len = 0; |
| 2499 |
len += 8; /* 8 bytes for tag and padding */ |
2530 |
len += 8; /* 8 bytes for tag and padding */ |
|
|
2531 |
if (p->size > (UINT_MAX - len) / 4) { |
| 2532 |
p->icp->errc = 1; |
| 2533 |
return (unsigned int) - 1; |
| 2534 |
} |
| 2500 |
len += p->size * 4; /* 4 byte for each S15Fixed16 */ |
2535 |
len += p->size * 4; /* 4 byte for each S15Fixed16 */ |
| 2501 |
return len; |
2536 |
return len; |
| 2502 |
} |
2537 |
} |
|
Lines 2569-2574
static int icmS15Fixed16Array_write(
Link Here
|
| 2569 |
|
2604 |
|
| 2570 |
/* Allocate a file write buffer */ |
2605 |
/* Allocate a file write buffer */ |
| 2571 |
len = p->get_size((icmBase *)p); |
2606 |
len = p->get_size((icmBase *)p); |
|
|
2607 |
if (icp->errc) |
| 2608 |
return icp->errc; |
| 2572 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
2609 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 2573 |
sprintf(icp->err,"icmS15Fixed16Array_write malloc() failed"); |
2610 |
sprintf(icp->err,"icmS15Fixed16Array_write malloc() failed"); |
| 2574 |
return icp->errc = 2; |
2611 |
return icp->errc = 2; |
|
Lines 2633-2639
static int icmS15Fixed16Array_allocate(
Link Here
|
| 2633 |
if (p->size != p->_size) { |
2670 |
if (p->size != p->_size) { |
| 2634 |
if (p->data != NULL) |
2671 |
if (p->data != NULL) |
| 2635 |
icp->al->free(icp->al, p->data); |
2672 |
icp->al->free(icp->al, p->data); |
| 2636 |
if ((p->data = (double *) icp->al->malloc(icp->al, p->size * sizeof(double))) == NULL) { |
2673 |
if ((p->data = (double *) icp->al->calloc(icp->al, p->size, sizeof(double))) == NULL) { |
| 2637 |
sprintf(icp->err,"icmS15Fixed16Array_alloc: malloc() of icmS15Fixed16Array data failed"); |
2674 |
sprintf(icp->err,"icmS15Fixed16Array_alloc: malloc() of icmS15Fixed16Array data failed"); |
| 2638 |
return icp->errc = 2; |
2675 |
return icp->errc = 2; |
| 2639 |
} |
2676 |
} |
|
Lines 2726-2731
static unsigned int icmXYZArray_get_size
Link Here
|
| 2726 |
icmXYZArray *p = (icmXYZArray *)pp; |
2763 |
icmXYZArray *p = (icmXYZArray *)pp; |
| 2727 |
unsigned int len = 0; |
2764 |
unsigned int len = 0; |
| 2728 |
len += 8; /* 8 bytes for tag and padding */ |
2765 |
len += 8; /* 8 bytes for tag and padding */ |
|
|
2766 |
if (p->size > (UINT_MAX - len) / 12) { |
| 2767 |
p->icp->errc = 1; |
| 2768 |
return (unsigned int) - 1; |
| 2769 |
} |
| 2729 |
len += p->size * 12; /* 12 bytes for each XYZ */ |
2770 |
len += p->size * 12; /* 12 bytes for each XYZ */ |
| 2730 |
return len; |
2771 |
return len; |
| 2731 |
} |
2772 |
} |
|
Lines 2798-2803
static int icmXYZArray_write(
Link Here
|
| 2798 |
|
2839 |
|
| 2799 |
/* Allocate a file write buffer */ |
2840 |
/* Allocate a file write buffer */ |
| 2800 |
len = p->get_size((icmBase *)p); |
2841 |
len = p->get_size((icmBase *)p); |
|
|
2842 |
if (icp->errc) |
| 2843 |
return icp->errc; |
| 2801 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
2844 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 2802 |
sprintf(icp->err,"icmXYZArray_write malloc() failed"); |
2845 |
sprintf(icp->err,"icmXYZArray_write malloc() failed"); |
| 2803 |
return icp->errc = 2; |
2846 |
return icp->errc = 2; |
|
Lines 2865-2871
static int icmXYZArray_allocate(
Link Here
|
| 2865 |
if (p->size != p->_size) { |
2908 |
if (p->size != p->_size) { |
| 2866 |
if (p->data != NULL) |
2909 |
if (p->data != NULL) |
| 2867 |
icp->al->free(icp->al, p->data); |
2910 |
icp->al->free(icp->al, p->data); |
| 2868 |
if ((p->data = (icmXYZNumber *) icp->al->malloc(icp->al, p->size * sizeof(icmXYZNumber))) == NULL) { |
2911 |
if ((p->data = (icmXYZNumber *) icp->al->calloc(icp->al, p->size, sizeof(icmXYZNumber))) == NULL) { |
| 2869 |
sprintf(icp->err,"icmXYZArray_alloc: malloc() of icmXYZArray data failed"); |
2912 |
sprintf(icp->err,"icmXYZArray_alloc: malloc() of icmXYZArray data failed"); |
| 2870 |
return icp->errc = 2; |
2913 |
return icp->errc = 2; |
| 2871 |
} |
2914 |
} |
|
Lines 3001-3007
static int icmTable_setup_bwd(
Link Here
|
| 3001 |
int nf; /* Next free slot */ |
3044 |
int nf; /* Next free slot */ |
| 3002 |
if (rt->rlists[j] == NULL) { /* No allocation */ |
3045 |
if (rt->rlists[j] == NULL) { /* No allocation */ |
| 3003 |
as = 5; /* Start with space for 5 */ |
3046 |
as = 5; /* Start with space for 5 */ |
| 3004 |
if ((rt->rlists[j] = (int *) icp->al->malloc(icp->al, sizeof(int) * as)) == NULL) { |
3047 |
if ((rt->rlists[j] = (int *) icp->al->calloc(icp->al, sizeof(int), as)) == NULL) { |
| 3005 |
return 2; |
3048 |
return 2; |
| 3006 |
} |
3049 |
} |
| 3007 |
rt->rlists[j][0] = as; |
3050 |
rt->rlists[j][0] = as; |
|
Lines 3141-3146
static unsigned int icmCurve_get_size(
Link Here
|
| 3141 |
icmCurve *p = (icmCurve *)pp; |
3184 |
icmCurve *p = (icmCurve *)pp; |
| 3142 |
unsigned int len = 0; |
3185 |
unsigned int len = 0; |
| 3143 |
len += 12; /* 12 bytes for tag, padding and count */ |
3186 |
len += 12; /* 12 bytes for tag, padding and count */ |
|
|
3187 |
if (p->size > (UINT_MAX - len) / 2) { |
| 3188 |
p->icp->errc = 1; |
| 3189 |
return (unsigned int) - 1; |
| 3190 |
} |
| 3144 |
len += p->size * 2; /* 2 bytes for each UInt16 */ |
3191 |
len += p->size * 2; /* 2 bytes for each UInt16 */ |
| 3145 |
return len; |
3192 |
return len; |
| 3146 |
} |
3193 |
} |
|
Lines 3238-3243
static int icmCurve_write(
Link Here
|
| 3238 |
|
3285 |
|
| 3239 |
/* Allocate a file write buffer */ |
3286 |
/* Allocate a file write buffer */ |
| 3240 |
len = p->get_size((icmBase *)p); |
3287 |
len = p->get_size((icmBase *)p); |
|
|
3288 |
if (icp->errc) |
| 3289 |
return icp->errc; |
| 3241 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
3290 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 3242 |
sprintf(icp->err,"icmCurve_write malloc() failed"); |
3291 |
sprintf(icp->err,"icmCurve_write malloc() failed"); |
| 3243 |
return icp->errc = 2; |
3292 |
return icp->errc = 2; |
|
Lines 3347-3353
static int icmCurve_allocate(
Link Here
|
| 3347 |
if (p->size != p->_size) { |
3396 |
if (p->size != p->_size) { |
| 3348 |
if (p->data != NULL) |
3397 |
if (p->data != NULL) |
| 3349 |
icp->al->free(icp->al, p->data); |
3398 |
icp->al->free(icp->al, p->data); |
| 3350 |
if ((p->data = (double *) icp->al->malloc(icp->al, p->size * sizeof(double))) == NULL) { |
3399 |
if ((p->data = (double *) icp->al->calloc(icp->al, p->size, sizeof(double))) == NULL) { |
| 3351 |
sprintf(icp->err,"icmCurve_alloc: malloc() of icmCurve data failed"); |
3400 |
sprintf(icp->err,"icmCurve_alloc: malloc() of icmCurve data failed"); |
| 3352 |
return icp->errc = 2; |
3401 |
return icp->errc = 2; |
| 3353 |
} |
3402 |
} |
|
Lines 3493-3498
static int icmData_write(
Link Here
|
| 3493 |
|
3542 |
|
| 3494 |
/* Allocate a file write buffer */ |
3543 |
/* Allocate a file write buffer */ |
| 3495 |
len = p->get_size((icmBase *)p); |
3544 |
len = p->get_size((icmBase *)p); |
|
|
3545 |
if (icp->errc) |
| 3546 |
return icp->errc; |
| 3496 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
3547 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 3497 |
sprintf(icp->err,"icmData_write malloc() failed"); |
3548 |
sprintf(icp->err,"icmData_write malloc() failed"); |
| 3498 |
return icp->errc = 2; |
3549 |
return icp->errc = 2; |
|
Lines 3745-3750
static int icmText_write(
Link Here
|
| 3745 |
|
3796 |
|
| 3746 |
/* Allocate a file write buffer */ |
3797 |
/* Allocate a file write buffer */ |
| 3747 |
len = p->get_size((icmBase *)p); |
3798 |
len = p->get_size((icmBase *)p); |
|
|
3799 |
if (icp->errc) |
| 3800 |
return icp->errc; |
| 3748 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
3801 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 3749 |
sprintf(icp->err,"icmText_write malloc() failed"); |
3802 |
sprintf(icp->err,"icmText_write malloc() failed"); |
| 3750 |
return icp->errc = 2; |
3803 |
return icp->errc = 2; |
|
Lines 4038-4043
static int icmDateTimeNumber_write(
Link Here
|
| 4038 |
|
4091 |
|
| 4039 |
/* Allocate a file write buffer */ |
4092 |
/* Allocate a file write buffer */ |
| 4040 |
len = p->get_size((icmBase *)p); |
4093 |
len = p->get_size((icmBase *)p); |
|
|
4094 |
if (icp->errc) |
| 4095 |
return icp->errc; |
| 4041 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
4096 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 4042 |
sprintf(icp->err,"icmDateTimeNumber_write malloc() failed"); |
4097 |
sprintf(icp->err,"icmDateTimeNumber_write malloc() failed"); |
| 4043 |
return icp->errc = 2; |
4098 |
return icp->errc = 2; |
|
Lines 4128-4138
static icmBase *new_icmDateTimeNumber(
Link Here
|
| 4128 |
/* icmLut object */ |
4183 |
/* icmLut object */ |
| 4129 |
|
4184 |
|
| 4130 |
/* Utility function - raise one integer to an integer power */ |
4185 |
/* Utility function - raise one integer to an integer power */ |
| 4131 |
static unsigned int uipow(unsigned int a, unsigned int b) { |
4186 |
static int uipow(unsigned int a, unsigned int b, unsigned int *ret) { |
| 4132 |
unsigned int rv = 1; |
4187 |
unsigned int rv = 1; |
| 4133 |
for (; b > 0; b--) |
4188 |
for (; b > 0; b--) { |
|
|
4189 |
if (a > 0 && rv > UINT_MAX / a) |
| 4190 |
return 1; |
| 4134 |
rv *= a; |
4191 |
rv *= a; |
| 4135 |
return rv; |
4192 |
} |
|
|
4193 |
*ret = rv; |
| 4194 |
return 0; |
| 4136 |
} |
4195 |
} |
| 4137 |
|
4196 |
|
| 4138 |
/* - - - - - - - - - - - - - - - - */ |
4197 |
/* - - - - - - - - - - - - - - - - */ |
|
Lines 4268-4274
double *in /* Input array[outputChan] *
Link Here
|
| 4268 |
if (p->inputChan <= 8) { |
4327 |
if (p->inputChan <= 8) { |
| 4269 |
gw = GW; /* Use stack allocation */ |
4328 |
gw = GW; /* Use stack allocation */ |
| 4270 |
} else { |
4329 |
} else { |
| 4271 |
if ((gw = (double *) icp->al->malloc(icp->al, (1 << p->inputChan) * sizeof(double))) == NULL) { |
4330 |
if ((gw = (double *) icp->al->calloc(icp->al, (1 << p->inputChan), sizeof(double))) == NULL) { |
| 4272 |
sprintf(icp->err,"icmLut_lookup_clut: malloc() failed"); |
4331 |
sprintf(icp->err,"icmLut_lookup_clut: malloc() failed"); |
| 4273 |
return icp->errc = 2; |
4332 |
return icp->errc = 2; |
| 4274 |
} |
4333 |
} |
|
Lines 4819-4837
static unsigned int icmLut_get_size(
Link Here
|
| 4819 |
) { |
4878 |
) { |
| 4820 |
icmLut *p = (icmLut *)pp; |
4879 |
icmLut *p = (icmLut *)pp; |
| 4821 |
unsigned int len = 0; |
4880 |
unsigned int len = 0; |
|
|
4881 |
unsigned int pw; |
| 4822 |
|
4882 |
|
| 4823 |
if (p->ttype == icSigLut8Type) { |
4883 |
if (p->ttype == icSigLut8Type) { |
| 4824 |
len += 48; /* tag and header */ |
4884 |
len += 48; /* tag and header */ |
|
|
4885 |
if (p->inputChan > 0 && |
| 4886 |
p->inputEnt > (UINT_MAX - len) / p->inputChan / 1) |
| 4887 |
goto overflow; |
| 4888 |
|
| 4825 |
len += 1 * (p->inputChan * p->inputEnt); |
4889 |
len += 1 * (p->inputChan * p->inputEnt); |
| 4826 |
len += 1 * (p->outputChan * uipow(p->clutPoints,p->inputChan)); |
4890 |
if (uipow(p->clutPoints,p->inputChan, &pw) || |
|
|
4891 |
(p->outputChan > 0 && |
| 4892 |
pw > (UINT_MAX - len) / p->outputChan / 1)) |
| 4893 |
goto overflow; |
| 4894 |
|
| 4895 |
len += 1 * (p->outputChan * pw); |
| 4896 |
if (p->outputChan > 0 && |
| 4897 |
p->outputEnt > (UINT_MAX - len) / p->outputChan / 1) |
| 4898 |
goto overflow; |
| 4899 |
|
| 4827 |
len += 1 * (p->outputChan * p->outputEnt); |
4900 |
len += 1 * (p->outputChan * p->outputEnt); |
| 4828 |
} else { |
4901 |
} else { |
| 4829 |
len += 52; /* tag and header */ |
4902 |
len += 52; /* tag and header */ |
|
|
4903 |
if (p->inputChan > 0 && |
| 4904 |
p->inputEnt > (UINT_MAX - len) / p->inputChan / 2) |
| 4905 |
goto overflow; |
| 4906 |
|
| 4830 |
len += 2 * (p->inputChan * p->inputEnt); |
4907 |
len += 2 * (p->inputChan * p->inputEnt); |
| 4831 |
len += 2 * (p->outputChan * uipow(p->clutPoints,p->inputChan)); |
4908 |
if (uipow(p->clutPoints,p->inputChan, &pw) || |
|
|
4909 |
(p->outputChan > 0 && |
| 4910 |
pw > (UINT_MAX - len) / p->outputChan / 2)) |
| 4911 |
goto overflow; |
| 4912 |
|
| 4913 |
len += 2 * (p->outputChan * pw); |
| 4914 |
if (p->outputChan > 0 && |
| 4915 |
p->outputEnt > (UINT_MAX - len) / p->outputChan / 2) |
| 4916 |
goto overflow; |
| 4917 |
|
| 4832 |
len += 2 * (p->outputChan * p->outputEnt); |
4918 |
len += 2 * (p->outputChan * p->outputEnt); |
| 4833 |
} |
4919 |
} |
| 4834 |
return len; |
4920 |
return len; |
|
|
4921 |
|
| 4922 |
overflow: |
| 4923 |
p->icp->errc = 1; |
| 4924 |
return (unsigned int) -1; |
| 4835 |
} |
4925 |
} |
| 4836 |
|
4926 |
|
| 4837 |
/* read the object, return 0 on success, error code on fail */ |
4927 |
/* read the object, return 0 on success, error code on fail */ |
|
Lines 4844-4849
static int icmLut_read(
Link Here
|
| 4844 |
icc *icp = p->icp; |
4934 |
icc *icp = p->icp; |
| 4845 |
int rv = 0; |
4935 |
int rv = 0; |
| 4846 |
unsigned long i, j, g, size; |
4936 |
unsigned long i, j, g, size; |
|
|
4937 |
unsigned int pw; |
| 4847 |
char *bp, *buf; |
4938 |
char *bp, *buf; |
| 4848 |
|
4939 |
|
| 4849 |
if (len < 4) { |
4940 |
if (len < 4) { |
|
Lines 4904-4909
static int icmLut_read(
Link Here
|
| 4904 |
return icp->errc = 1; |
4995 |
return icp->errc = 1; |
| 4905 |
} |
4996 |
} |
| 4906 |
|
4997 |
|
|
|
4998 |
if (p->clutPoints > 100) { |
| 4999 |
sprintf(icp->err,"icmLut_read: too many clutPoints"); |
| 5000 |
return icp->errc = 1; |
| 5001 |
} |
| 5002 |
|
| 4907 |
/* Read 3x3 transform matrix */ |
5003 |
/* Read 3x3 transform matrix */ |
| 4908 |
for (j = 0; j < 3; j++) { /* Rows */ |
5004 |
for (j = 0; j < 3; j++) { /* Rows */ |
| 4909 |
for (i = 0; i < 3; i++) { /* Columns */ |
5005 |
for (i = 0; i < 3; i++) { /* Columns */ |
|
Lines 4921-4933
static int icmLut_read(
Link Here
|
| 4921 |
bp = buf+52; |
5017 |
bp = buf+52; |
| 4922 |
} |
5018 |
} |
| 4923 |
|
5019 |
|
| 4924 |
if (len < icmLut_get_size((icmBase *)p)) { |
5020 |
if (len < icmLut_get_size((icmBase *)p) || icp->errc) { |
| 4925 |
sprintf(icp->err,"icmLut_read: Tag too small for contents"); |
5021 |
sprintf(icp->err,"icmLut_read: Tag too small for contents"); |
| 4926 |
icp->al->free(icp->al, buf); |
5022 |
icp->al->free(icp->al, buf); |
| 4927 |
return icp->errc = 1; |
5023 |
return icp->errc = 1; |
| 4928 |
} |
5024 |
} |
| 4929 |
|
5025 |
|
| 4930 |
/* Read the input tables */ |
5026 |
/* Read the input tables */ |
|
|
5027 |
if (p->inputEnt > 0 && p->inputChan > UINT_MAX / p->inputEnt) { |
| 5028 |
sprintf(icp->err,"icmLut_read: overflow"); |
| 5029 |
icp->al->free(icp->al, buf); |
| 5030 |
return icp->errc = 1; |
| 5031 |
} |
| 4931 |
size = (p->inputChan * p->inputEnt); |
5032 |
size = (p->inputChan * p->inputEnt); |
| 4932 |
if ((rv = p->allocate((icmBase *)p)) != 0) { |
5033 |
if ((rv = p->allocate((icmBase *)p)) != 0) { |
| 4933 |
icp->al->free(icp->al, buf); |
5034 |
icp->al->free(icp->al, buf); |
|
Lines 4942-4948
static int icmLut_read(
Link Here
|
| 4942 |
} |
5043 |
} |
| 4943 |
|
5044 |
|
| 4944 |
/* Read the clut table */ |
5045 |
/* Read the clut table */ |
| 4945 |
size = (p->outputChan * uipow(p->clutPoints,p->inputChan)); |
5046 |
if (uipow(p->clutPoints,p->inputChan,&pw) || |
|
|
5047 |
(p->outputChan > 0 && |
| 5048 |
pw > UINT_MAX / p->outputChan)) { |
| 5049 |
sprintf(icp->err,"icmLut_read: overflow"); |
| 5050 |
icp->al->free(icp->al, buf); |
| 5051 |
return icp->errc = 1; |
| 5052 |
} |
| 5053 |
size = (p->outputChan * pw); |
| 4946 |
if ((rv = p->allocate((icmBase *)p)) != 0) { |
5054 |
if ((rv = p->allocate((icmBase *)p)) != 0) { |
| 4947 |
icp->al->free(icp->al, buf); |
5055 |
icp->al->free(icp->al, buf); |
| 4948 |
return rv; |
5056 |
return rv; |
|
Lines 4956-4961
static int icmLut_read(
Link Here
|
| 4956 |
} |
5064 |
} |
| 4957 |
|
5065 |
|
| 4958 |
/* Read the output tables */ |
5066 |
/* Read the output tables */ |
|
|
5067 |
if (p->outputChan > 0 && p->outputEnt > UINT_MAX / p->outputChan) { |
| 5068 |
sprintf(icp->err,"icmLut_read: overflow"); |
| 5069 |
icp->al->free(icp->al, buf); |
| 5070 |
return icp->errc = 1; |
| 5071 |
} |
| 4959 |
size = (p->outputChan * p->outputEnt); |
5072 |
size = (p->outputChan * p->outputEnt); |
| 4960 |
if ((rv = p->allocate((icmBase *)p)) != 0) { |
5073 |
if ((rv = p->allocate((icmBase *)p)) != 0) { |
| 4961 |
icp->al->free(icp->al, buf); |
5074 |
icp->al->free(icp->al, buf); |
|
Lines 4995-5006
static int icmLut_write(
Link Here
|
| 4995 |
icmLut *p = (icmLut *)pp; |
5108 |
icmLut *p = (icmLut *)pp; |
| 4996 |
icc *icp = p->icp; |
5109 |
icc *icp = p->icp; |
| 4997 |
unsigned long i,j; |
5110 |
unsigned long i,j; |
| 4998 |
unsigned int len, size; |
5111 |
unsigned int len, size, pw; |
| 4999 |
char *bp, *buf; /* Buffer to write from */ |
5112 |
char *bp, *buf; /* Buffer to write from */ |
| 5000 |
int rv = 0; |
5113 |
int rv = 0; |
| 5001 |
|
5114 |
|
| 5002 |
/* Allocate a file write buffer */ |
5115 |
/* Allocate a file write buffer */ |
| 5003 |
len = p->get_size((icmBase *)p); |
5116 |
len = p->get_size((icmBase *)p); |
|
|
5117 |
if (icp->errc) |
| 5118 |
return icp->errc; |
| 5004 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
5119 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 5005 |
sprintf(icp->err,"icmLut_write malloc() failed"); |
5120 |
sprintf(icp->err,"icmLut_write malloc() failed"); |
| 5006 |
return icp->errc = 2; |
5121 |
return icp->errc = 2; |
|
Lines 5066-5071
static int icmLut_write(
Link Here
|
| 5066 |
} |
5181 |
} |
| 5067 |
|
5182 |
|
| 5068 |
/* Write the input tables */ |
5183 |
/* Write the input tables */ |
|
|
5184 |
if (p->inputEnt > 0 && p->inputChan > UINT_MAX / p->inputEnt) { |
| 5185 |
sprintf(icp->err,"icmLut_write: overflow"); |
| 5186 |
icp->al->free(icp->al, buf); |
| 5187 |
return icp->errc = 1; |
| 5188 |
} |
| 5069 |
size = (p->inputChan * p->inputEnt); |
5189 |
size = (p->inputChan * p->inputEnt); |
| 5070 |
if (p->ttype == icSigLut8Type) { |
5190 |
if (p->ttype == icSigLut8Type) { |
| 5071 |
for (i = 0; i < size; i++, bp += 1) { |
5191 |
for (i = 0; i < size; i++, bp += 1) { |
|
Lines 5086-5092
static int icmLut_write(
Link Here
|
| 5086 |
} |
5206 |
} |
| 5087 |
|
5207 |
|
| 5088 |
/* Write the clut table */ |
5208 |
/* Write the clut table */ |
| 5089 |
size = (p->outputChan * uipow(p->clutPoints,p->inputChan)); |
5209 |
if (uipow(p->clutPoints,p->inputChan,&pw) || |
|
|
5210 |
(p->outputChan > 0 && |
| 5211 |
pw > UINT_MAX / p->outputChan)) { |
| 5212 |
sprintf(icp->err,"icmLut_write: overflow"); |
| 5213 |
icp->al->free(icp->al, buf); |
| 5214 |
return icp->errc = 1; |
| 5215 |
} |
| 5216 |
size = (p->outputChan * pw); |
| 5090 |
if (p->ttype == icSigLut8Type) { |
5217 |
if (p->ttype == icSigLut8Type) { |
| 5091 |
for (i = 0; i < size; i++, bp += 1) { |
5218 |
for (i = 0; i < size; i++, bp += 1) { |
| 5092 |
if ((rv = write_DCS8Number(p->clutTable[i], bp)) != 0) { |
5219 |
if ((rv = write_DCS8Number(p->clutTable[i], bp)) != 0) { |
|
Lines 5106-5111
static int icmLut_write(
Link Here
|
| 5106 |
} |
5233 |
} |
| 5107 |
|
5234 |
|
| 5108 |
/* Write the output tables */ |
5235 |
/* Write the output tables */ |
|
|
5236 |
if (p->outputChan > 0 && p->outputEnt > UINT_MAX / p->outputChan) { |
| 5237 |
sprintf(icp->err,"icmLut_write: overflow"); |
| 5238 |
icp->al->free(icp->al, buf); |
| 5239 |
return icp->errc = 1; |
| 5240 |
} |
| 5109 |
size = (p->outputChan * p->outputEnt); |
5241 |
size = (p->outputChan * p->outputEnt); |
| 5110 |
if (p->ttype == icSigLut8Type) { |
5242 |
if (p->ttype == icSigLut8Type) { |
| 5111 |
for (i = 0; i < size; i++, bp += 1) { |
5243 |
for (i = 0; i < size; i++, bp += 1) { |
|
Lines 5177-5183
static void icmLut_dump(
Link Here
|
| 5177 |
if (p->inputChan > MAX_CHAN) { |
5309 |
if (p->inputChan > MAX_CHAN) { |
| 5178 |
fprintf(op," !!Can't dump > %d input channel CLUT table!!\n",MAX_CHAN); |
5310 |
fprintf(op," !!Can't dump > %d input channel CLUT table!!\n",MAX_CHAN); |
| 5179 |
} else { |
5311 |
} else { |
| 5180 |
size = (p->outputChan * uipow(p->clutPoints,p->inputChan)); |
5312 |
unsigned int pw; |
|
|
5313 |
if (uipow(p->clutPoints,p->inputChan,&pw) || |
| 5314 |
(p->outputChan > 0 && |
| 5315 |
pw > UINT_MAX / p->outputChan)) { |
| 5316 |
fprintf(op,"Would overflow.\n"); |
| 5317 |
return; |
| 5318 |
} |
| 5319 |
size = (p->outputChan * pw); |
| 5181 |
for (j = 0; j < p->inputChan; j++) |
5320 |
for (j = 0; j < p->inputChan; j++) |
| 5182 |
ii[j] = 0; |
5321 |
ii[j] = 0; |
| 5183 |
for (i = 0; i < size;) { |
5322 |
for (i = 0; i < size;) { |
|
Lines 5216-5222
static void icmLut_dump(
Link Here
|
| 5216 |
static int icmLut_allocate( |
5355 |
static int icmLut_allocate( |
| 5217 |
icmBase *pp |
5356 |
icmBase *pp |
| 5218 |
) { |
5357 |
) { |
| 5219 |
unsigned int i, j, g, size; |
5358 |
unsigned int i, j, g, size, pw; |
| 5220 |
icmLut *p = (icmLut *)pp; |
5359 |
icmLut *p = (icmLut *)pp; |
| 5221 |
icc *icp = p->icp; |
5360 |
icc *icp = p->icp; |
| 5222 |
|
5361 |
|
|
Lines 5231-5236
static int icmLut_allocate(
Link Here
|
| 5231 |
return icp->errc = 1; |
5370 |
return icp->errc = 1; |
| 5232 |
} |
5371 |
} |
| 5233 |
|
5372 |
|
|
|
5373 |
if (p->inputEnt > 0 && p->inputChan > UINT_MAX / p->inputEnt) { |
| 5374 |
sprintf(icp->err,"icmLut_alloc: too many entries"); |
| 5375 |
return icp->errc = 1; |
| 5376 |
} |
| 5234 |
size = (p->inputChan * p->inputEnt); |
5377 |
size = (p->inputChan * p->inputEnt); |
| 5235 |
if (size != p->inputTable_size) { |
5378 |
if (size != p->inputTable_size) { |
| 5236 |
if (p->inputTable != NULL) |
5379 |
if (p->inputTable != NULL) |
|
Lines 5241-5247
static int icmLut_allocate(
Link Here
|
| 5241 |
} |
5384 |
} |
| 5242 |
p->inputTable_size = size; |
5385 |
p->inputTable_size = size; |
| 5243 |
} |
5386 |
} |
| 5244 |
size = (p->outputChan * uipow(p->clutPoints,p->inputChan)); |
5387 |
if (uipow(p->clutPoints,p->inputChan,&pw) || |
|
|
5388 |
(p->outputChan > 0 && |
| 5389 |
pw > UINT_MAX / p->outputChan)) { |
| 5390 |
sprintf(icp->err,"icmLut_alloc: overflow"); |
| 5391 |
return icp->errc = 1; |
| 5392 |
} |
| 5393 |
size = (p->outputChan * pw); |
| 5245 |
if (size != p->clutTable_size) { |
5394 |
if (size != p->clutTable_size) { |
| 5246 |
if (p->clutTable != NULL) |
5395 |
if (p->clutTable != NULL) |
| 5247 |
icp->al->free(icp->al, p->clutTable); |
5396 |
icp->al->free(icp->al, p->clutTable); |
|
Lines 5251-5256
static int icmLut_allocate(
Link Here
|
| 5251 |
} |
5400 |
} |
| 5252 |
p->clutTable_size = size; |
5401 |
p->clutTable_size = size; |
| 5253 |
} |
5402 |
} |
|
|
5403 |
if (p->outputChan > 0 && p->outputEnt > UINT_MAX / p->outputChan) { |
| 5404 |
sprintf(icp->err,"icmLut_alloc: overflow"); |
| 5405 |
return icp->errc = 1; |
| 5406 |
} |
| 5254 |
size = (p->outputChan * p->outputEnt); |
5407 |
size = (p->outputChan * p->outputEnt); |
| 5255 |
if (size != p->outputTable_size) { |
5408 |
if (size != p->outputTable_size) { |
| 5256 |
if (p->outputTable != NULL) |
5409 |
if (p->outputTable != NULL) |
|
Lines 5441-5446
static int icmMeasurement_write(
Link Here
|
| 5441 |
|
5594 |
|
| 5442 |
/* Allocate a file write buffer */ |
5595 |
/* Allocate a file write buffer */ |
| 5443 |
len = p->get_size((icmBase *)p); |
5596 |
len = p->get_size((icmBase *)p); |
|
|
5597 |
if (icp->errc) |
| 5598 |
return icp->errc; |
| 5444 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
5599 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 5445 |
sprintf(icp->err,"icmMeasurement_write malloc() failed"); |
5600 |
sprintf(icp->err,"icmMeasurement_write malloc() failed"); |
| 5446 |
return icp->errc = 2; |
5601 |
return icp->errc = 2; |
|
Lines 5712-5724
static unsigned int icmNamedColor_get_si
Link Here
|
| 5712 |
len += p->nDeviceCoords * 1; /* bytes for each named color */ |
5867 |
len += p->nDeviceCoords * 1; /* bytes for each named color */ |
| 5713 |
} |
5868 |
} |
| 5714 |
} else { /* Named Color 2 */ |
5869 |
} else { /* Named Color 2 */ |
|
|
5870 |
unsigned int col; |
| 5715 |
len += 8; /* 8 bytes for tag and padding */ |
5871 |
len += 8; /* 8 bytes for tag and padding */ |
| 5716 |
len += 4; /* 4 for vendor specific flags */ |
5872 |
len += 4; /* 4 for vendor specific flags */ |
| 5717 |
len += 4; /* 4 for count of named colors */ |
5873 |
len += 4; /* 4 for count of named colors */ |
| 5718 |
len += 4; /* 4 for number of device coords */ |
5874 |
len += 4; /* 4 for number of device coords */ |
| 5719 |
len += 32; /* 32 for prefix of color names */ |
5875 |
len += 32; /* 32 for prefix of color names */ |
| 5720 |
len += 32; /* 32 for suffix of color names */ |
5876 |
len += 32; /* 32 for suffix of color names */ |
| 5721 |
len += p->count * (32 + 6 + p->nDeviceCoords * 2); /* bytes for each named color */ |
5877 |
col = 32 + 6 + p->nDeviceCoords * 2; |
|
|
5878 |
if (p->nDeviceCoords > (UINT_MAX - (32 + 6)) / 2 || |
| 5879 |
(p->count > 0 && col > (UINT_MAX - len) / p->count)) { |
| 5880 |
p->icp->errc = 1; |
| 5881 |
return (unsigned int) -1; |
| 5882 |
} |
| 5883 |
len += p->count * col; /* bytes for each named color */ |
| 5722 |
} |
5884 |
} |
| 5723 |
return len; |
5885 |
return len; |
| 5724 |
} |
5886 |
} |
|
Lines 5882-5887
static int icmNamedColor_write(
Link Here
|
| 5882 |
|
6044 |
|
| 5883 |
/* Allocate a file write buffer */ |
6045 |
/* Allocate a file write buffer */ |
| 5884 |
len = p->get_size((icmBase *)p); |
6046 |
len = p->get_size((icmBase *)p); |
|
|
6047 |
if (icp->errc) |
| 6048 |
return icp->errc; |
| 5885 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
6049 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 5886 |
sprintf(icp->err,"icmNamedColor_write malloc() failed"); |
6050 |
sprintf(icp->err,"icmNamedColor_write malloc() failed"); |
| 5887 |
return icp->errc = 2; |
6051 |
return icp->errc = 2; |
|
Lines 6109-6117
static unsigned int icmTextDescription_g
Link Here
|
| 6109 |
) { |
6273 |
) { |
| 6110 |
icmTextDescription *p = (icmTextDescription *)pp; |
6274 |
icmTextDescription *p = (icmTextDescription *)pp; |
| 6111 |
unsigned int len = 0; |
6275 |
unsigned int len = 0; |
|
|
6276 |
if (p->size > UINT_MAX - (8 + 4 + 8)) { |
| 6277 |
p->icp->errc = 1; |
| 6278 |
return (unsigned int) -1; |
| 6279 |
} |
| 6112 |
len += 8; /* 8 bytes for tag and padding */ |
6280 |
len += 8; /* 8 bytes for tag and padding */ |
| 6113 |
len += 4 + p->size; /* Ascii string length + ascii string */ |
6281 |
len += 4 + p->size; /* Ascii string length + ascii string */ |
| 6114 |
len += 8 + 2 * p->ucSize; /* Unicode language code + length + string */ |
6282 |
len += 8; /* Unicode language code + length */ |
|
|
6283 |
if (p->ucSize > (UINT_MAX - len) / 2) { |
| 6284 |
p->icp->errc = 1; |
| 6285 |
return (unsigned int) -1; |
| 6286 |
} |
| 6287 |
len += 2 * p->ucSize; /* Unicode string */ |
| 6288 |
if (len > (UINT_MAX - (3 + 67))) { |
| 6289 |
p->icp->errc = 1; |
| 6290 |
return (unsigned int) -1; |
| 6291 |
} |
| 6115 |
len += 3 + 67; /* ScriptCode code, length string */ |
6292 |
len += 3 + 67; /* ScriptCode code, length string */ |
| 6116 |
return len; |
6293 |
return len; |
| 6117 |
} |
6294 |
} |
|
Lines 6294-6299
static int icmTextDescription_write(
Link Here
|
| 6294 |
|
6471 |
|
| 6295 |
/* Allocate a file write buffer */ |
6472 |
/* Allocate a file write buffer */ |
| 6296 |
len = p->get_size((icmBase *)p); |
6473 |
len = p->get_size((icmBase *)p); |
|
|
6474 |
if (icp->errc) |
| 6475 |
return icp->errc; |
| 6297 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
6476 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 6298 |
sprintf(icp->err,"icmTextDescription_write malloc() failed"); |
6477 |
sprintf(icp->err,"icmTextDescription_write malloc() failed"); |
| 6299 |
return icp->errc = 2; |
6478 |
return icp->errc = 2; |
|
Lines 6544-6550
static int icmTextDescription_allocate(
Link Here
|
| 6544 |
if (p->ucSize != p->uc_size) { |
6723 |
if (p->ucSize != p->uc_size) { |
| 6545 |
if (p->ucDesc != NULL) |
6724 |
if (p->ucDesc != NULL) |
| 6546 |
icp->al->free(icp->al, p->ucDesc); |
6725 |
icp->al->free(icp->al, p->ucDesc); |
| 6547 |
if ((p->ucDesc = (ORD16 *) icp->al->malloc(icp->al, p->ucSize * sizeof(ORD16))) == NULL) { |
6726 |
if ((p->ucDesc = (ORD16 *) icp->al->calloc(icp->al, p->ucSize, sizeof(ORD16))) == NULL) { |
| 6548 |
sprintf(icp->err,"icmTextDescription_alloc: malloc() of Unicode description failed"); |
6727 |
sprintf(icp->err,"icmTextDescription_alloc: malloc() of Unicode description failed"); |
| 6549 |
return icp->errc = 2; |
6728 |
return icp->errc = 2; |
| 6550 |
} |
6729 |
} |
|
Lines 6820-6825
static int icmProfileSequenceDesc_read(
Link Here
|
| 6820 |
bp += 8; /* Skip padding */ |
6999 |
bp += 8; /* Skip padding */ |
| 6821 |
|
7000 |
|
| 6822 |
p->count = read_UInt32Number(bp); /* Number of sequence descriptions */ |
7001 |
p->count = read_UInt32Number(bp); /* Number of sequence descriptions */ |
|
|
7002 |
if (p->count > 1000) { |
| 7003 |
sprintf(icp->err,"icmProfileSequenceDesc_read: too many sequence descriptions"); |
| 7004 |
icp->al->free(icp->al, buf); |
| 7005 |
return icp->errc = 1; |
| 7006 |
} |
| 7007 |
|
| 6823 |
bp += 4; |
7008 |
bp += 4; |
| 6824 |
|
7009 |
|
| 6825 |
/* Read all the sequence descriptions */ |
7010 |
/* Read all the sequence descriptions */ |
|
Lines 6852-6857
static int icmProfileSequenceDesc_write(
Link Here
|
| 6852 |
|
7037 |
|
| 6853 |
/* Allocate a file write buffer */ |
7038 |
/* Allocate a file write buffer */ |
| 6854 |
len = p->get_size((icmBase *)p); |
7039 |
len = p->get_size((icmBase *)p); |
|
|
7040 |
if (icp->errc) |
| 7041 |
return icp->errc; |
| 6855 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
7042 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 6856 |
sprintf(icp->err,"icmProfileSequenceDesc_write malloc() failed"); |
7043 |
sprintf(icp->err,"icmProfileSequenceDesc_write malloc() failed"); |
| 6857 |
return icp->errc = 2; |
7044 |
return icp->errc = 2; |
|
Lines 6922-6928
static int icmProfileSequenceDesc_alloca
Link Here
|
| 6922 |
if (p->count != p->_count) { |
7109 |
if (p->count != p->_count) { |
| 6923 |
if (p->data != NULL) |
7110 |
if (p->data != NULL) |
| 6924 |
icp->al->free(icp->al, p->data); |
7111 |
icp->al->free(icp->al, p->data); |
| 6925 |
if ((p->data = (icmDescStruct *) icp->al->malloc(icp->al, p->count * sizeof(icmDescStruct))) == NULL) { |
7112 |
if ((p->data = (icmDescStruct *) icp->al->calloc(icp->al, p->count, sizeof(icmDescStruct))) == NULL) { |
| 6926 |
sprintf(icp->err,"icmProfileSequenceDesc_allocate Allocation of DescStruct array failed"); |
7113 |
sprintf(icp->err,"icmProfileSequenceDesc_allocate Allocation of DescStruct array failed"); |
| 6927 |
return icp->errc = 2; |
7114 |
return icp->errc = 2; |
| 6928 |
} |
7115 |
} |
|
Lines 7041-7046
static int icmSignature_write(
Link Here
|
| 7041 |
|
7228 |
|
| 7042 |
/* Allocate a file write buffer */ |
7229 |
/* Allocate a file write buffer */ |
| 7043 |
len = p->get_size((icmBase *)p); |
7230 |
len = p->get_size((icmBase *)p); |
|
|
7231 |
if (icp->errc) |
| 7232 |
return icp->errc; |
| 7044 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
7233 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 7045 |
sprintf(icp->err,"icmSignature_write malloc() failed"); |
7234 |
sprintf(icp->err,"icmSignature_write malloc() failed"); |
| 7046 |
return icp->errc = 2; |
7235 |
return icp->errc = 2; |
|
Lines 7156-7161
static unsigned int icmScreening_get_siz
Link Here
|
| 7156 |
icmScreening *p = (icmScreening *)pp; |
7345 |
icmScreening *p = (icmScreening *)pp; |
| 7157 |
unsigned int len = 0; |
7346 |
unsigned int len = 0; |
| 7158 |
len += 16; /* 16 bytes for tag, padding, flag & channeles */ |
7347 |
len += 16; /* 16 bytes for tag, padding, flag & channeles */ |
|
|
7348 |
if (p->channels > (UINT_MAX - len) / 12) { |
| 7349 |
p->icp->errc = 1; |
| 7350 |
return (unsigned int) -1; |
| 7351 |
} |
| 7159 |
len += p->channels * 12; /* 12 bytes for each channel */ |
7352 |
len += p->channels * 12; /* 12 bytes for each channel */ |
| 7160 |
return len; |
7353 |
return len; |
| 7161 |
} |
7354 |
} |
|
Lines 7235-7240
static int icmScreening_write(
Link Here
|
| 7235 |
|
7428 |
|
| 7236 |
/* Allocate a file write buffer */ |
7429 |
/* Allocate a file write buffer */ |
| 7237 |
len = p->get_size((icmBase *)p); |
7430 |
len = p->get_size((icmBase *)p); |
|
|
7431 |
if (icp->errc) |
| 7432 |
return icp->errc; |
| 7238 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
7433 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 7239 |
sprintf(icp->err,"icmScreening_write malloc() failed"); |
7434 |
sprintf(icp->err,"icmScreening_write malloc() failed"); |
| 7240 |
return icp->errc = 2; |
7435 |
return icp->errc = 2; |
|
Lines 7315-7321
static int icmScreening_allocate(
Link Here
|
| 7315 |
if (p->channels != p->_channels) { |
7510 |
if (p->channels != p->_channels) { |
| 7316 |
if (p->data != NULL) |
7511 |
if (p->data != NULL) |
| 7317 |
icp->al->free(icp->al, p->data); |
7512 |
icp->al->free(icp->al, p->data); |
| 7318 |
if ((p->data = (icmScreeningData *) icp->al->malloc(icp->al, p->channels * sizeof(icmScreeningData))) == NULL) { |
7513 |
if ((p->data = (icmScreeningData *) icp->al->calloc(icp->al, p->channels, sizeof(icmScreeningData))) == NULL) { |
| 7319 |
sprintf(icp->err,"icmScreening_alloc: malloc() of icmScreening data failed"); |
7514 |
sprintf(icp->err,"icmScreening_alloc: malloc() of icmScreening data failed"); |
| 7320 |
return icp->errc = 2; |
7515 |
return icp->errc = 2; |
| 7321 |
} |
7516 |
} |
|
Lines 7366-7375
static unsigned int icmUcrBg_get_size(
Link Here
|
| 7366 |
icmUcrBg *p = (icmUcrBg *)pp; |
7561 |
icmUcrBg *p = (icmUcrBg *)pp; |
| 7367 |
unsigned int len = 0; |
7562 |
unsigned int len = 0; |
| 7368 |
len += 8; /* 8 bytes for tag and padding */ |
7563 |
len += 8; /* 8 bytes for tag and padding */ |
|
|
7564 |
if (p->UCRcount > (UINT_MAX - len - 4) / 2) |
| 7565 |
goto overflow; |
| 7566 |
|
| 7369 |
len += 4 + p->UCRcount * 2; /* Undercolor Removal */ |
7567 |
len += 4 + p->UCRcount * 2; /* Undercolor Removal */ |
|
|
7568 |
if (p->BGcount > (UINT_MAX - len - 4 - p->size) / 2) |
| 7569 |
goto overflow; |
| 7570 |
|
| 7370 |
len += 4 + p->BGcount * 2; /* Black Generation */ |
7571 |
len += 4 + p->BGcount * 2; /* Black Generation */ |
| 7371 |
len += p->size; /* Description string */ |
7572 |
len += p->size; /* Description string */ |
| 7372 |
return len; |
7573 |
return len; |
|
|
7574 |
|
| 7575 |
overflow: |
| 7576 |
p->icp->errc = 1; |
| 7577 |
return (unsigned int) -1; |
| 7373 |
} |
7578 |
} |
| 7374 |
|
7579 |
|
| 7375 |
/* read the object, return 0 on success, error code on fail */ |
7580 |
/* read the object, return 0 on success, error code on fail */ |
|
Lines 7498-7503
static int icmUcrBg_write(
Link Here
|
| 7498 |
|
7703 |
|
| 7499 |
/* Allocate a file write buffer */ |
7704 |
/* Allocate a file write buffer */ |
| 7500 |
len = p->get_size((icmBase *)p); |
7705 |
len = p->get_size((icmBase *)p); |
|
|
7706 |
if (icp->errc) |
| 7707 |
return icp->errc; |
| 7501 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
7708 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 7502 |
sprintf(icp->err,"icmUcrBg_write malloc() failed"); |
7709 |
sprintf(icp->err,"icmUcrBg_write malloc() failed"); |
| 7503 |
return icp->errc = 2; |
7710 |
return icp->errc = 2; |
|
Lines 7663-7669
static int icmUcrBg_allocate(
Link Here
|
| 7663 |
if (p->UCRcount != p->UCR_count) { |
7870 |
if (p->UCRcount != p->UCR_count) { |
| 7664 |
if (p->UCRcurve != NULL) |
7871 |
if (p->UCRcurve != NULL) |
| 7665 |
icp->al->free(icp->al, p->UCRcurve); |
7872 |
icp->al->free(icp->al, p->UCRcurve); |
| 7666 |
if ((p->UCRcurve = (double *) icp->al->malloc(icp->al, p->UCRcount * sizeof(double))) == NULL) { |
7873 |
if ((p->UCRcurve = (double *) icp->al->calloc(icp->al, p->UCRcount, sizeof(double))) == NULL) { |
| 7667 |
sprintf(icp->err,"icmUcrBg_allocate: malloc() of UCR curve data failed"); |
7874 |
sprintf(icp->err,"icmUcrBg_allocate: malloc() of UCR curve data failed"); |
| 7668 |
return icp->errc = 2; |
7875 |
return icp->errc = 2; |
| 7669 |
} |
7876 |
} |
|
Lines 7672-7678
static int icmUcrBg_allocate(
Link Here
|
| 7672 |
if (p->BGcount != p->BG_count) { |
7879 |
if (p->BGcount != p->BG_count) { |
| 7673 |
if (p->BGcurve != NULL) |
7880 |
if (p->BGcurve != NULL) |
| 7674 |
icp->al->free(icp->al, p->BGcurve); |
7881 |
icp->al->free(icp->al, p->BGcurve); |
| 7675 |
if ((p->BGcurve = (double *) icp->al->malloc(icp->al, p->BGcount * sizeof(double))) == NULL) { |
7882 |
if ((p->BGcurve = (double *) icp->al->calloc(icp->al, p->BGcount, sizeof(double))) == NULL) { |
| 7676 |
sprintf(icp->err,"icmUcrBg_allocate: malloc() of BG curve data failed"); |
7883 |
sprintf(icp->err,"icmUcrBg_allocate: malloc() of BG curve data failed"); |
| 7677 |
return icp->errc = 2; |
7884 |
return icp->errc = 2; |
| 7678 |
} |
7885 |
} |
|
Lines 7743-7748
static unsigned int icmVideoCardGamma_ge
Link Here
|
| 7743 |
len += 2; /* 2 bytes for channels */ |
7950 |
len += 2; /* 2 bytes for channels */ |
| 7744 |
len += 2; /* 2 for entry count */ |
7951 |
len += 2; /* 2 for entry count */ |
| 7745 |
len += 2; /* 2 for entry size */ |
7952 |
len += 2; /* 2 for entry size */ |
|
|
7953 |
if (p->u.table.entryCount > 0 && |
| 7954 |
p->u.table.entrySize > 0 && |
| 7955 |
p->u.table.channels > |
| 7956 |
(UINT_MAX - len) / |
| 7957 |
p->u.table.entryCount / |
| 7958 |
p->u.table.entrySize) { |
| 7959 |
p->icp->errc = 1; |
| 7960 |
return (unsigned int) -1; |
| 7961 |
} |
| 7746 |
len += ( p->u.table.channels * /* compute table size */ |
7962 |
len += ( p->u.table.channels * /* compute table size */ |
| 7747 |
p->u.table.entryCount * |
7963 |
p->u.table.entryCount * |
| 7748 |
p->u.table.entrySize ); |
7964 |
p->u.table.entrySize ); |
|
Lines 7762-7771
static int icmVideoCardGamma_read(
Link Here
|
| 7762 |
) { |
7978 |
) { |
| 7763 |
icmVideoCardGamma *p = (icmVideoCardGamma *)pp; |
7979 |
icmVideoCardGamma *p = (icmVideoCardGamma *)pp; |
| 7764 |
icc *icp = p->icp; |
7980 |
icc *icp = p->icp; |
| 7765 |
int rv, c; |
7981 |
int rv; |
| 7766 |
char *bp, *buf; |
7982 |
char *bp, *buf; |
| 7767 |
unsigned char *pchar; |
7983 |
unsigned char *pchar; |
| 7768 |
unsigned short *pshort; |
7984 |
unsigned short *pshort; |
|
|
7985 |
unsigned long c; |
| 7769 |
|
7986 |
|
| 7770 |
if (len < 18) { |
7987 |
if (len < 18) { |
| 7771 |
sprintf(icp->err,"icmVideoCardGamma_read: Tag too small to be legal"); |
7988 |
sprintf(icp->err,"icmVideoCardGamma_read: Tag too small to be legal"); |
|
Lines 7803-7808
static int icmVideoCardGamma_read(
Link Here
|
| 7803 |
p->u.table.channels = read_UInt16Number(bp+12); |
8020 |
p->u.table.channels = read_UInt16Number(bp+12); |
| 7804 |
p->u.table.entryCount = read_UInt16Number(bp+14); |
8021 |
p->u.table.entryCount = read_UInt16Number(bp+14); |
| 7805 |
p->u.table.entrySize = read_UInt16Number(bp+16); |
8022 |
p->u.table.entrySize = read_UInt16Number(bp+16); |
|
|
8023 |
if (p->u.table.entrySize > 65530 || p->u.table.entrySize == 0) { |
| 8024 |
sprintf(icp->err,"icmVideoCardGamma_read: Too many entries (or none)"); |
| 8025 |
return icp->errc = 1; |
| 8026 |
} |
| 8027 |
if (p->u.table.entryCount > 0 && p->u.table.entrySize > 0 && |
| 8028 |
p->u.table.channels > |
| 8029 |
UINT_MAX / p->u.table.entryCount / p->u.table.entrySize) { |
| 8030 |
sprintf(icp->err,"icmVideoCardGamma_read: Overflow reading tag"); |
| 8031 |
return icp->errc = 1; |
| 8032 |
} |
| 7806 |
if (len-18 < p->u.table.channels*p->u.table.entryCount*p->u.table.entrySize) { |
8033 |
if (len-18 < p->u.table.channels*p->u.table.entryCount*p->u.table.entrySize) { |
| 7807 |
sprintf(icp->err,"icmVideoCardGamma_read: Tag too small to be legal"); |
8034 |
sprintf(icp->err,"icmVideoCardGamma_read: Tag too small to be legal"); |
| 7808 |
return icp->errc = 1; |
8035 |
return icp->errc = 1; |
|
Lines 7871-7876
static int icmVideoCardGamma_write(
Link Here
|
| 7871 |
|
8098 |
|
| 7872 |
/* Allocate a file write buffer */ |
8099 |
/* Allocate a file write buffer */ |
| 7873 |
len = p->get_size((icmBase *)p); |
8100 |
len = p->get_size((icmBase *)p); |
|
|
8101 |
if (icp->errc) |
| 8102 |
return icp->errc; |
| 7874 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
8103 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 7875 |
sprintf(icp->err,"icmViewingConditions_write malloc() failed"); |
8104 |
sprintf(icp->err,"icmViewingConditions_write malloc() failed"); |
| 7876 |
return icp->errc = 2; |
8105 |
return icp->errc = 2; |
|
Lines 8049-8055
static int icmVideoCardGamma_allocate(
Link Here
|
| 8049 |
) { |
8278 |
) { |
| 8050 |
icmVideoCardGamma *p = (icmVideoCardGamma *)pp; |
8279 |
icmVideoCardGamma *p = (icmVideoCardGamma *)pp; |
| 8051 |
icc *icp = p->icp; |
8280 |
icc *icp = p->icp; |
| 8052 |
int size; |
8281 |
unsigned int size; |
| 8053 |
|
8282 |
|
| 8054 |
/* note: allocation is only relevant for table type |
8283 |
/* note: allocation is only relevant for table type |
| 8055 |
* and in that case the channels, entryCount, and entrySize |
8284 |
* and in that case the channels, entryCount, and entrySize |
|
Lines 8059-8064
static int icmVideoCardGamma_allocate(
Link Here
|
| 8059 |
if (p->tagType == icmVideoCardGammaTableType) { |
8288 |
if (p->tagType == icmVideoCardGammaTableType) { |
| 8060 |
if (p->u.table.data != NULL) |
8289 |
if (p->u.table.data != NULL) |
| 8061 |
icp->al->free(icp->al, p->u.table.data); |
8290 |
icp->al->free(icp->al, p->u.table.data); |
|
|
8291 |
if (p->u.table.entryCount > 0 && |
| 8292 |
p->u.table.channels > UINT_MAX / p->u.table.entryCount) { |
| 8293 |
sprintf(icp->err,"icmVideoCardGamma_alloc: table too large"); |
| 8294 |
return icp->errc = 1; |
| 8295 |
} |
| 8062 |
size = (p->u.table.channels * |
8296 |
size = (p->u.table.channels * |
| 8063 |
p->u.table.entryCount); |
8297 |
p->u.table.entryCount); |
| 8064 |
switch (p->u.table.entrySize) { |
8298 |
switch (p->u.table.entrySize) { |
|
Lines 8066-8071
static int icmVideoCardGamma_allocate(
Link Here
|
| 8066 |
size *= sizeof(unsigned char); |
8300 |
size *= sizeof(unsigned char); |
| 8067 |
break; |
8301 |
break; |
| 8068 |
case 2: |
8302 |
case 2: |
|
|
8303 |
if (size > UINT_MAX / sizeof(unsigned short)) { |
| 8304 |
sprintf(icp->err,"icmVideoCardGamma_alloc: table too large"); |
| 8305 |
return icp->errc = 1; |
| 8306 |
} |
| 8069 |
size *= sizeof(unsigned short); |
8307 |
size *= sizeof(unsigned short); |
| 8070 |
break; |
8308 |
break; |
| 8071 |
default: |
8309 |
default: |
|
Lines 8201-8206
static int icmViewingConditions_write(
Link Here
|
| 8201 |
|
8439 |
|
| 8202 |
/* Allocate a file write buffer */ |
8440 |
/* Allocate a file write buffer */ |
| 8203 |
len = p->get_size((icmBase *)p); |
8441 |
len = p->get_size((icmBase *)p); |
|
|
8442 |
if (icp->errc) |
| 8443 |
return icp->errc; |
| 8204 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
8444 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 8205 |
sprintf(icp->err,"icmViewingConditions_write malloc() failed"); |
8445 |
sprintf(icp->err,"icmViewingConditions_write malloc() failed"); |
| 8206 |
return icp->errc = 2; |
8446 |
return icp->errc = 2; |
|
Lines 8433-8438
static int icmCrdInfo_write(
Link Here
|
| 8433 |
|
8673 |
|
| 8434 |
/* Allocate a file write buffer */ |
8674 |
/* Allocate a file write buffer */ |
| 8435 |
len = p->get_size((icmBase *)p); |
8675 |
len = p->get_size((icmBase *)p); |
|
|
8676 |
if (icp->errc) |
| 8677 |
return icp->errc; |
| 8436 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
8678 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 8437 |
sprintf(icp->err,"icmCrdInfo_write malloc() failed"); |
8679 |
sprintf(icp->err,"icmCrdInfo_write malloc() failed"); |
| 8438 |
return icp->errc = 2; |
8680 |
return icp->errc = 2; |
|
Lines 8736-8741
static int icmHeader_write(
Link Here
|
| 8736 |
int rv = 0; |
8978 |
int rv = 0; |
| 8737 |
|
8979 |
|
| 8738 |
len = p->get_size(p); |
8980 |
len = p->get_size(p); |
|
|
8981 |
if (icp->errc) |
| 8982 |
return icp->errc; |
| 8739 |
if ((buf = (char *) icp->al->calloc(icp->al,1,len)) == NULL) { /* Zero it - some CMS are fussy */ |
8983 |
if ((buf = (char *) icp->al->calloc(icp->al,1,len)) == NULL) { /* Zero it - some CMS are fussy */ |
| 8740 |
sprintf(icp->err,"icmHeader_write calloc() failed"); |
8984 |
sprintf(icp->err,"icmHeader_write calloc() failed"); |
| 8741 |
return icp->errc = 2; |
8985 |
return icp->errc = 2; |
|
Lines 9245-9257
static int icc_read(
Link Here
|
| 9245 |
} |
9489 |
} |
| 9246 |
|
9490 |
|
| 9247 |
p->count = read_UInt32Number(tcbuf); /* Tag count */ |
9491 |
p->count = read_UInt32Number(tcbuf); /* Tag count */ |
|
|
9492 |
if (p->count > 100) { |
| 9493 |
sprintf(p->err,"icc_read: too many table tags"); |
| 9494 |
return p->errc = 1; |
| 9495 |
} |
| 9248 |
if (p->count > 0) { |
9496 |
if (p->count > 0) { |
| 9249 |
char *bp, *buf; |
9497 |
char *bp, *buf; |
| 9250 |
if ((p->data = (icmTag *) p->al->malloc(p->al, p->count * sizeof(icmTag))) == NULL) { |
9498 |
if ((p->data = (icmTag *) p->al->calloc(p->al, p->count, sizeof(icmTag))) == NULL) { |
| 9251 |
sprintf(p->err,"icc_read: Tag table malloc() failed"); |
9499 |
sprintf(p->err,"icc_read: Tag table malloc() failed"); |
| 9252 |
return p->errc = 2; |
9500 |
return p->errc = 2; |
| 9253 |
} |
9501 |
} |
| 9254 |
|
9502 |
|
|
|
9503 |
if (p->count > (UINT_MAX - 4) / 12) { |
| 9504 |
sprintf(p->err,"icc_read: overflow"); |
| 9505 |
p->al->free(p->al, p->data); |
| 9506 |
p->data = NULL; |
| 9507 |
return p->errc = 1; |
| 9508 |
} |
| 9255 |
len = 4 + p->count * 12; |
9509 |
len = 4 + p->count * 12; |
| 9256 |
if ((buf = (char *) p->al->malloc(p->al, len)) == NULL) { |
9510 |
if ((buf = (char *) p->al->malloc(p->al, len)) == NULL) { |
| 9257 |
sprintf(p->err,"icc_read: Tag table read buffer malloc() failed"); |
9511 |
sprintf(p->err,"icc_read: Tag table read buffer malloc() failed"); |
|
Lines 9281-9286
static int icc_read(
Link Here
|
| 9281 |
return p->errc = 1; |
9535 |
return p->errc = 1; |
| 9282 |
} |
9536 |
} |
| 9283 |
p->data[i].size = read_UInt32Number(bp + 8); |
9537 |
p->data[i].size = read_UInt32Number(bp + 8); |
|
|
9538 |
if (p->data[i].offset + p->data[i].size > |
| 9539 |
p->header->size) { |
| 9540 |
sprintf(p->err,"icc_read: tag out of bounds"); |
| 9541 |
p->al->free(p->al, p->data); |
| 9542 |
p->data = NULL; |
| 9543 |
p->al->free(p->al, buf); |
| 9544 |
return p->errc = 1; |
| 9545 |
} |
| 9284 |
if ( p->fp->seek(p->fp, of + p->data[i].offset) != 0 |
9546 |
if ( p->fp->seek(p->fp, of + p->data[i].offset) != 0 |
| 9285 |
|| p->fp->read(p->fp, tcbuf, 1, 4) != 4) { |
9547 |
|| p->fp->read(p->fp, tcbuf, 1, 4) != 4) { |
| 9286 |
sprintf(p->err,"icc_read: fseek() or fread() failed on tag headers"); |
9548 |
sprintf(p->err,"icc_read: fseek() or fread() failed on tag headers"); |
|
Lines 9321-9328
static unsigned int icc_get_size(
Link Here
|
| 9321 |
} |
9583 |
} |
| 9322 |
|
9584 |
|
| 9323 |
size += p->header->get_size(p->header); |
9585 |
size += p->header->get_size(p->header); |
|
|
9586 |
if (p->errc) |
| 9587 |
return (unsigned int) -1; |
| 9324 |
|
9588 |
|
| 9325 |
size = DO_ALIGN(size); |
9589 |
size = DO_ALIGN(size); |
|
|
9590 |
if (size == 0 || p->count > (UINT_MAX - 4 - size) / 12) { |
| 9591 |
p->errc = 1; |
| 9592 |
return (unsigned int) -1; |
| 9593 |
} |
| 9326 |
size += 4 + p->count * 12; /* Tag table length */ |
9594 |
size += 4 + p->count * 12; /* Tag table length */ |
| 9327 |
|
9595 |
|
| 9328 |
/* Reset touched flag for each tag type */ |
9596 |
/* Reset touched flag for each tag type */ |
|
Lines 9337-9344
static unsigned int icc_get_size(
Link Here
|
| 9337 |
/* Get size for each tag type, skipping links */ |
9605 |
/* Get size for each tag type, skipping links */ |
| 9338 |
for (i = 0; i < p->count; i++) { |
9606 |
for (i = 0; i < p->count; i++) { |
| 9339 |
if (p->data[i].objp->touched == 0) { /* Not alllowed for previously */ |
9607 |
if (p->data[i].objp->touched == 0) { /* Not alllowed for previously */ |
|
|
9608 |
unsigned int obj_size; |
| 9340 |
size = DO_ALIGN(size); |
9609 |
size = DO_ALIGN(size); |
| 9341 |
size += p->data[i].objp->get_size(p->data[i].objp); |
9610 |
obj_size = p->data[i].objp->get_size(p->data[i].objp); |
|
|
9611 |
if (size == 0 || p->errc || |
| 9612 |
obj_size > UINT_MAX - size) |
| 9613 |
return (unsigned int) -1; |
| 9614 |
size += obj_size; |
| 9342 |
p->data[i].objp->touched = 1; /* Don't account for this again */ |
9615 |
p->data[i].objp->touched = 1; /* Don't account for this again */ |
| 9343 |
} |
9616 |
} |
| 9344 |
} |
9617 |
} |
|
Lines 9373-9381
static int icc_write(
Link Here
|
| 9373 |
} |
9646 |
} |
| 9374 |
|
9647 |
|
| 9375 |
size += p->header->get_size(p->header); |
9648 |
size += p->header->get_size(p->header); |
|
|
9649 |
if (p->errc) |
| 9650 |
return p->errc; |
| 9376 |
|
9651 |
|
|
|
9652 |
if (p->count > (UINT_MAX - 4 - len) / 12) { |
| 9653 |
sprintf(p->err,"icc_write: too many tags"); |
| 9654 |
return p->errc = 1; |
| 9655 |
} |
| 9377 |
len = 4 + p->count * 12; /* Tag table length */ |
9656 |
len = 4 + p->count * 12; /* Tag table length */ |
| 9378 |
size = DO_ALIGN(size); |
9657 |
size = DO_ALIGN(size); |
|
|
9658 |
if (size == 0 || size > UINT_MAX - len) { |
| 9659 |
sprintf(p->err,"icc_write: overflow writing tag table"); |
| 9660 |
return p->errc = 1; |
| 9661 |
} |
| 9379 |
size += len; |
9662 |
size += len; |
| 9380 |
|
9663 |
|
| 9381 |
/* Allocate memory buffer for tag table */ |
9664 |
/* Allocate memory buffer for tag table */ |
|
Lines 9406-9411
static int icc_write(
Link Here
|
| 9406 |
size = DO_ALIGN(size); |
9689 |
size = DO_ALIGN(size); |
| 9407 |
p->data[i].offset = size; /* Profile relative target */ |
9690 |
p->data[i].offset = size; /* Profile relative target */ |
| 9408 |
p->data[i].size = p->data[i].objp->get_size(p->data[i].objp); |
9691 |
p->data[i].size = p->data[i].objp->get_size(p->data[i].objp); |
|
|
9692 |
if (size == 0 || |
| 9693 |
p->errc || p->data[i].size > UINT_MAX - size) { |
| 9694 |
sprintf(p->err,"icc_write: internal error - overflow?"); |
| 9695 |
p->al->free(p->al, buf); |
| 9696 |
return p->errc; |
| 9697 |
} |
| 9409 |
size += p->data[i].size; |
9698 |
size += p->data[i].size; |
| 9410 |
p->data[i].objp->touched = 1; /* Allocated space for it */ |
9699 |
p->data[i].objp->touched = 1; /* Allocated space for it */ |
| 9411 |
} else { /* must be linked - copy allocation */ |
9700 |
} else { /* must be linked - copy allocation */ |
|
Lines 9529-9534
static icmBase *icc_add_tag(
Link Here
|
| 9529 |
} |
9818 |
} |
| 9530 |
|
9819 |
|
| 9531 |
/* Make space in tag table for new tag item */ |
9820 |
/* Make space in tag table for new tag item */ |
|
|
9821 |
if (p->count > (UINT_MAX / sizeof(icmTag)) - 1) { |
| 9822 |
sprintf(p->err,"icc_add_tag: overflow"); |
| 9823 |
p->errc = 1; |
| 9824 |
return NULL; |
| 9825 |
} |
| 9532 |
if (p->data == NULL) |
9826 |
if (p->data == NULL) |
| 9533 |
tp = p->al->malloc(p->al, (p->count+1) * sizeof(icmTag)); |
9827 |
tp = p->al->malloc(p->al, (p->count+1) * sizeof(icmTag)); |
| 9534 |
else |
9828 |
else |
|
Lines 9612-9617
static icmBase *icc_link_tag(
Link Here
|
| 9612 |
} |
9906 |
} |
| 9613 |
|
9907 |
|
| 9614 |
/* Make space in tag table for new tag item */ |
9908 |
/* Make space in tag table for new tag item */ |
|
|
9909 |
if (p->count > (UINT_MAX / sizeof(icmTag)) - 1) { |
| 9910 |
sprintf(p->err,"icc_link_tag: overflow"); |
| 9911 |
p->errc = 1; |
| 9912 |
return NULL; |
| 9913 |
} |
| 9615 |
if (p->data == NULL) |
9914 |
if (p->data == NULL) |
| 9616 |
tp = p->al->malloc(p->al, (p->count+1) * sizeof(icmTag)); |
9915 |
tp = p->al->malloc(p->al, (p->count+1) * sizeof(icmTag)); |
| 9617 |
else |
9916 |
else |