|
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 (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 (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->inputEnt > (UINT_MAX - len) / p->inputChan / 1) |
| 4886 |
goto overflow; |
| 4887 |
|
| 4825 |
len += 1 * (p->inputChan * p->inputEnt); |
4888 |
len += 1 * (p->inputChan * p->inputEnt); |
| 4826 |
len += 1 * (p->outputChan * uipow(p->clutPoints,p->inputChan)); |
4889 |
if (uipow(p->clutPoints,p->inputChan, &pw) || |
|
|
4890 |
pw > (UINT_MAX - len) / p->outputChan / 1) |
| 4891 |
goto overflow; |
| 4892 |
|
| 4893 |
len += 1 * (p->outputChan * pw); |
| 4894 |
if (p->outputEnt > (UINT_MAX - len) / p->outputChan / 1) |
| 4895 |
goto overflow; |
| 4896 |
|
| 4827 |
len += 1 * (p->outputChan * p->outputEnt); |
4897 |
len += 1 * (p->outputChan * p->outputEnt); |
| 4828 |
} else { |
4898 |
} else { |
| 4829 |
len += 52; /* tag and header */ |
4899 |
len += 52; /* tag and header */ |
|
|
4900 |
if (p->inputEnt > (UINT_MAX - len) / p->inputChan / 2) |
| 4901 |
goto overflow; |
| 4902 |
|
| 4830 |
len += 2 * (p->inputChan * p->inputEnt); |
4903 |
len += 2 * (p->inputChan * p->inputEnt); |
| 4831 |
len += 2 * (p->outputChan * uipow(p->clutPoints,p->inputChan)); |
4904 |
if (uipow(p->clutPoints,p->inputChan, &pw) || |
|
|
4905 |
pw > (UINT_MAX - len) / p->outputChan / 2) |
| 4906 |
goto overflow; |
| 4907 |
|
| 4908 |
len += 2 * (p->outputChan * pw); |
| 4909 |
if (p->outputEnt > (UINT_MAX - len) / p->outputChan / 2) |
| 4910 |
goto overflow; |
| 4911 |
|
| 4832 |
len += 2 * (p->outputChan * p->outputEnt); |
4912 |
len += 2 * (p->outputChan * p->outputEnt); |
| 4833 |
} |
4913 |
} |
| 4834 |
return len; |
4914 |
return len; |
|
|
4915 |
|
| 4916 |
overflow: |
| 4917 |
p->icp->errc = 1; |
| 4918 |
return (unsigned int) -1; |
| 4835 |
} |
4919 |
} |
| 4836 |
|
4920 |
|
| 4837 |
/* read the object, return 0 on success, error code on fail */ |
4921 |
/* 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; |
4928 |
icc *icp = p->icp; |
| 4845 |
int rv = 0; |
4929 |
int rv = 0; |
| 4846 |
unsigned long i, j, g, size; |
4930 |
unsigned long i, j, g, size; |
|
|
4931 |
unsigned int pw; |
| 4847 |
char *bp, *buf; |
4932 |
char *bp, *buf; |
| 4848 |
|
4933 |
|
| 4849 |
if (len < 4) { |
4934 |
if (len < 4) { |
|
Lines 4904-4909
static int icmLut_read(
Link Here
|
| 4904 |
return icp->errc = 1; |
4989 |
return icp->errc = 1; |
| 4905 |
} |
4990 |
} |
| 4906 |
|
4991 |
|
|
|
4992 |
if (p->clutPoints > 100) { |
| 4993 |
sprintf(icp->err,"icmLut_read: too many clutPoints"); |
| 4994 |
return icp->errc = 1; |
| 4995 |
} |
| 4996 |
|
| 4907 |
/* Read 3x3 transform matrix */ |
4997 |
/* Read 3x3 transform matrix */ |
| 4908 |
for (j = 0; j < 3; j++) { /* Rows */ |
4998 |
for (j = 0; j < 3; j++) { /* Rows */ |
| 4909 |
for (i = 0; i < 3; i++) { /* Columns */ |
4999 |
for (i = 0; i < 3; i++) { /* Columns */ |
|
Lines 4921-4933
static int icmLut_read(
Link Here
|
| 4921 |
bp = buf+52; |
5011 |
bp = buf+52; |
| 4922 |
} |
5012 |
} |
| 4923 |
|
5013 |
|
| 4924 |
if (len < icmLut_get_size((icmBase *)p)) { |
5014 |
if (len < icmLut_get_size((icmBase *)p) || icp->errc) { |
| 4925 |
sprintf(icp->err,"icmLut_read: Tag too small for contents"); |
5015 |
sprintf(icp->err,"icmLut_read: Tag too small for contents"); |
| 4926 |
icp->al->free(icp->al, buf); |
5016 |
icp->al->free(icp->al, buf); |
| 4927 |
return icp->errc = 1; |
5017 |
return icp->errc = 1; |
| 4928 |
} |
5018 |
} |
| 4929 |
|
5019 |
|
| 4930 |
/* Read the input tables */ |
5020 |
/* Read the input tables */ |
|
|
5021 |
if (p->inputChan > UINT_MAX / p->inputEnt) { |
| 5022 |
sprintf(icp->err,"icmLut_read: overflow"); |
| 5023 |
icp->al->free(icp->al, buf); |
| 5024 |
return icp->errc = 1; |
| 5025 |
} |
| 4931 |
size = (p->inputChan * p->inputEnt); |
5026 |
size = (p->inputChan * p->inputEnt); |
| 4932 |
if ((rv = p->allocate((icmBase *)p)) != 0) { |
5027 |
if ((rv = p->allocate((icmBase *)p)) != 0) { |
| 4933 |
icp->al->free(icp->al, buf); |
5028 |
icp->al->free(icp->al, buf); |
|
Lines 4942-4948
static int icmLut_read(
Link Here
|
| 4942 |
} |
5037 |
} |
| 4943 |
|
5038 |
|
| 4944 |
/* Read the clut table */ |
5039 |
/* Read the clut table */ |
| 4945 |
size = (p->outputChan * uipow(p->clutPoints,p->inputChan)); |
5040 |
if (uipow(p->clutPoints,p->inputChan,&pw) || |
|
|
5041 |
pw > UINT_MAX / p->outputChan) { |
| 5042 |
sprintf(icp->err,"icmLut_read: overflow"); |
| 5043 |
icp->al->free(icp->al, buf); |
| 5044 |
return icp->errc = 1; |
| 5045 |
} |
| 5046 |
size = (p->outputChan * pw); |
| 4946 |
if ((rv = p->allocate((icmBase *)p)) != 0) { |
5047 |
if ((rv = p->allocate((icmBase *)p)) != 0) { |
| 4947 |
icp->al->free(icp->al, buf); |
5048 |
icp->al->free(icp->al, buf); |
| 4948 |
return rv; |
5049 |
return rv; |
|
Lines 4956-4961
static int icmLut_read(
Link Here
|
| 4956 |
} |
5057 |
} |
| 4957 |
|
5058 |
|
| 4958 |
/* Read the output tables */ |
5059 |
/* Read the output tables */ |
|
|
5060 |
if (p->outputEnt > UINT_MAX / p->outputChan) { |
| 5061 |
sprintf(icp->err,"icmLut_read: overflow"); |
| 5062 |
icp->al->free(icp->al, buf); |
| 5063 |
return icp->errc = 1; |
| 5064 |
} |
| 4959 |
size = (p->outputChan * p->outputEnt); |
5065 |
size = (p->outputChan * p->outputEnt); |
| 4960 |
if ((rv = p->allocate((icmBase *)p)) != 0) { |
5066 |
if ((rv = p->allocate((icmBase *)p)) != 0) { |
| 4961 |
icp->al->free(icp->al, buf); |
5067 |
icp->al->free(icp->al, buf); |
|
Lines 4995-5006
static int icmLut_write(
Link Here
|
| 4995 |
icmLut *p = (icmLut *)pp; |
5101 |
icmLut *p = (icmLut *)pp; |
| 4996 |
icc *icp = p->icp; |
5102 |
icc *icp = p->icp; |
| 4997 |
unsigned long i,j; |
5103 |
unsigned long i,j; |
| 4998 |
unsigned int len, size; |
5104 |
unsigned int len, size, pw; |
| 4999 |
char *bp, *buf; /* Buffer to write from */ |
5105 |
char *bp, *buf; /* Buffer to write from */ |
| 5000 |
int rv = 0; |
5106 |
int rv = 0; |
| 5001 |
|
5107 |
|
| 5002 |
/* Allocate a file write buffer */ |
5108 |
/* Allocate a file write buffer */ |
| 5003 |
len = p->get_size((icmBase *)p); |
5109 |
len = p->get_size((icmBase *)p); |
|
|
5110 |
if (icp->errc) |
| 5111 |
return icp->errc; |
| 5004 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
5112 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 5005 |
sprintf(icp->err,"icmLut_write malloc() failed"); |
5113 |
sprintf(icp->err,"icmLut_write malloc() failed"); |
| 5006 |
return icp->errc = 2; |
5114 |
return icp->errc = 2; |
|
Lines 5066-5071
static int icmLut_write(
Link Here
|
| 5066 |
} |
5174 |
} |
| 5067 |
|
5175 |
|
| 5068 |
/* Write the input tables */ |
5176 |
/* Write the input tables */ |
|
|
5177 |
if (p->inputChan > UINT_MAX / p->inputEnt) { |
| 5178 |
sprintf(icp->err,"icmLut_write: overflow"); |
| 5179 |
icp->al->free(icp->al, buf); |
| 5180 |
return icp->errc = 1; |
| 5181 |
} |
| 5069 |
size = (p->inputChan * p->inputEnt); |
5182 |
size = (p->inputChan * p->inputEnt); |
| 5070 |
if (p->ttype == icSigLut8Type) { |
5183 |
if (p->ttype == icSigLut8Type) { |
| 5071 |
for (i = 0; i < size; i++, bp += 1) { |
5184 |
for (i = 0; i < size; i++, bp += 1) { |
|
Lines 5086-5092
static int icmLut_write(
Link Here
|
| 5086 |
} |
5199 |
} |
| 5087 |
|
5200 |
|
| 5088 |
/* Write the clut table */ |
5201 |
/* Write the clut table */ |
| 5089 |
size = (p->outputChan * uipow(p->clutPoints,p->inputChan)); |
5202 |
if (uipow(p->clutPoints,p->inputChan,&pw) || |
|
|
5203 |
pw > UINT_MAX / p->outputChan) { |
| 5204 |
sprintf(icp->err,"icmLut_write: overflow"); |
| 5205 |
icp->al->free(icp->al, buf); |
| 5206 |
return icp->errc = 1; |
| 5207 |
} |
| 5208 |
size = (p->outputChan * pw); |
| 5090 |
if (p->ttype == icSigLut8Type) { |
5209 |
if (p->ttype == icSigLut8Type) { |
| 5091 |
for (i = 0; i < size; i++, bp += 1) { |
5210 |
for (i = 0; i < size; i++, bp += 1) { |
| 5092 |
if ((rv = write_DCS8Number(p->clutTable[i], bp)) != 0) { |
5211 |
if ((rv = write_DCS8Number(p->clutTable[i], bp)) != 0) { |
|
Lines 5106-5111
static int icmLut_write(
Link Here
|
| 5106 |
} |
5225 |
} |
| 5107 |
|
5226 |
|
| 5108 |
/* Write the output tables */ |
5227 |
/* Write the output tables */ |
|
|
5228 |
if (p->outputEnt > UINT_MAX / p->outputChan) { |
| 5229 |
sprintf(icp->err,"icmLut_write: overflow"); |
| 5230 |
icp->al->free(icp->al, buf); |
| 5231 |
return icp->errc = 1; |
| 5232 |
} |
| 5109 |
size = (p->outputChan * p->outputEnt); |
5233 |
size = (p->outputChan * p->outputEnt); |
| 5110 |
if (p->ttype == icSigLut8Type) { |
5234 |
if (p->ttype == icSigLut8Type) { |
| 5111 |
for (i = 0; i < size; i++, bp += 1) { |
5235 |
for (i = 0; i < size; i++, bp += 1) { |
|
Lines 5177-5183
static void icmLut_dump(
Link Here
|
| 5177 |
if (p->inputChan > MAX_CHAN) { |
5301 |
if (p->inputChan > MAX_CHAN) { |
| 5178 |
fprintf(op," !!Can't dump > %d input channel CLUT table!!\n",MAX_CHAN); |
5302 |
fprintf(op," !!Can't dump > %d input channel CLUT table!!\n",MAX_CHAN); |
| 5179 |
} else { |
5303 |
} else { |
| 5180 |
size = (p->outputChan * uipow(p->clutPoints,p->inputChan)); |
5304 |
unsigned int pw; |
|
|
5305 |
if (uipow(p->clutPoints,p->inputChan,&pw) || |
| 5306 |
pw > UINT_MAX / p->outputChan) { |
| 5307 |
fprintf(op,"Would overflow.\n"); |
| 5308 |
return; |
| 5309 |
} |
| 5310 |
size = (p->outputChan * pw); |
| 5181 |
for (j = 0; j < p->inputChan; j++) |
5311 |
for (j = 0; j < p->inputChan; j++) |
| 5182 |
ii[j] = 0; |
5312 |
ii[j] = 0; |
| 5183 |
for (i = 0; i < size;) { |
5313 |
for (i = 0; i < size;) { |
|
Lines 5216-5222
static void icmLut_dump(
Link Here
|
| 5216 |
static int icmLut_allocate( |
5346 |
static int icmLut_allocate( |
| 5217 |
icmBase *pp |
5347 |
icmBase *pp |
| 5218 |
) { |
5348 |
) { |
| 5219 |
unsigned int i, j, g, size; |
5349 |
unsigned int i, j, g, size, pw; |
| 5220 |
icmLut *p = (icmLut *)pp; |
5350 |
icmLut *p = (icmLut *)pp; |
| 5221 |
icc *icp = p->icp; |
5351 |
icc *icp = p->icp; |
| 5222 |
|
5352 |
|
|
Lines 5231-5236
static int icmLut_allocate(
Link Here
|
| 5231 |
return icp->errc = 1; |
5361 |
return icp->errc = 1; |
| 5232 |
} |
5362 |
} |
| 5233 |
|
5363 |
|
|
|
5364 |
if (p->inputChan > UINT_MAX / p->inputEnt) { |
| 5365 |
sprintf(icp->err,"icmLut_alloc: too many entries"); |
| 5366 |
return icp->errc = 1; |
| 5367 |
} |
| 5234 |
size = (p->inputChan * p->inputEnt); |
5368 |
size = (p->inputChan * p->inputEnt); |
| 5235 |
if (size != p->inputTable_size) { |
5369 |
if (size != p->inputTable_size) { |
| 5236 |
if (p->inputTable != NULL) |
5370 |
if (p->inputTable != NULL) |
|
Lines 5241-5247
static int icmLut_allocate(
Link Here
|
| 5241 |
} |
5375 |
} |
| 5242 |
p->inputTable_size = size; |
5376 |
p->inputTable_size = size; |
| 5243 |
} |
5377 |
} |
| 5244 |
size = (p->outputChan * uipow(p->clutPoints,p->inputChan)); |
5378 |
if (uipow(p->clutPoints,p->inputChan,&pw) || |
|
|
5379 |
pw > UINT_MAX / p->outputChan) { |
| 5380 |
sprintf(icp->err,"icmLut_alloc: overflow"); |
| 5381 |
return icp->errc = 1; |
| 5382 |
} |
| 5383 |
size = (p->outputChan * pw); |
| 5245 |
if (size != p->clutTable_size) { |
5384 |
if (size != p->clutTable_size) { |
| 5246 |
if (p->clutTable != NULL) |
5385 |
if (p->clutTable != NULL) |
| 5247 |
icp->al->free(icp->al, p->clutTable); |
5386 |
icp->al->free(icp->al, p->clutTable); |
|
Lines 5251-5256
static int icmLut_allocate(
Link Here
|
| 5251 |
} |
5390 |
} |
| 5252 |
p->clutTable_size = size; |
5391 |
p->clutTable_size = size; |
| 5253 |
} |
5392 |
} |
|
|
5393 |
if (p->outputEnt > UINT_MAX / p->outputChan) { |
| 5394 |
sprintf(icp->err,"icmLut_alloc: overflow"); |
| 5395 |
return icp->errc = 1; |
| 5396 |
} |
| 5254 |
size = (p->outputChan * p->outputEnt); |
5397 |
size = (p->outputChan * p->outputEnt); |
| 5255 |
if (size != p->outputTable_size) { |
5398 |
if (size != p->outputTable_size) { |
| 5256 |
if (p->outputTable != NULL) |
5399 |
if (p->outputTable != NULL) |
|
Lines 5441-5446
static int icmMeasurement_write(
Link Here
|
| 5441 |
|
5584 |
|
| 5442 |
/* Allocate a file write buffer */ |
5585 |
/* Allocate a file write buffer */ |
| 5443 |
len = p->get_size((icmBase *)p); |
5586 |
len = p->get_size((icmBase *)p); |
|
|
5587 |
if (icp->errc) |
| 5588 |
return icp->errc; |
| 5444 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
5589 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 5445 |
sprintf(icp->err,"icmMeasurement_write malloc() failed"); |
5590 |
sprintf(icp->err,"icmMeasurement_write malloc() failed"); |
| 5446 |
return icp->errc = 2; |
5591 |
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 */ |
5857 |
len += p->nDeviceCoords * 1; /* bytes for each named color */ |
| 5713 |
} |
5858 |
} |
| 5714 |
} else { /* Named Color 2 */ |
5859 |
} else { /* Named Color 2 */ |
|
|
5860 |
unsigned int col; |
| 5715 |
len += 8; /* 8 bytes for tag and padding */ |
5861 |
len += 8; /* 8 bytes for tag and padding */ |
| 5716 |
len += 4; /* 4 for vendor specific flags */ |
5862 |
len += 4; /* 4 for vendor specific flags */ |
| 5717 |
len += 4; /* 4 for count of named colors */ |
5863 |
len += 4; /* 4 for count of named colors */ |
| 5718 |
len += 4; /* 4 for number of device coords */ |
5864 |
len += 4; /* 4 for number of device coords */ |
| 5719 |
len += 32; /* 32 for prefix of color names */ |
5865 |
len += 32; /* 32 for prefix of color names */ |
| 5720 |
len += 32; /* 32 for suffix of color names */ |
5866 |
len += 32; /* 32 for suffix of color names */ |
| 5721 |
len += p->count * (32 + 6 + p->nDeviceCoords * 2); /* bytes for each named color */ |
5867 |
col = 32 + 6 + p->nDeviceCoords * 2; |
|
|
5868 |
if (p->nDeviceCoords > (UINT_MAX - (32 + 6)) / 2 || |
| 5869 |
col > (UINT_MAX - len) / p->count) { |
| 5870 |
p->icp->errc = 1; |
| 5871 |
return (unsigned int) -1; |
| 5872 |
} |
| 5873 |
len += p->count * col; /* bytes for each named color */ |
| 5722 |
} |
5874 |
} |
| 5723 |
return len; |
5875 |
return len; |
| 5724 |
} |
5876 |
} |
|
Lines 5882-5887
static int icmNamedColor_write(
Link Here
|
| 5882 |
|
6034 |
|
| 5883 |
/* Allocate a file write buffer */ |
6035 |
/* Allocate a file write buffer */ |
| 5884 |
len = p->get_size((icmBase *)p); |
6036 |
len = p->get_size((icmBase *)p); |
|
|
6037 |
if (icp->errc) |
| 6038 |
return icp->errc; |
| 5885 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
6039 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 5886 |
sprintf(icp->err,"icmNamedColor_write malloc() failed"); |
6040 |
sprintf(icp->err,"icmNamedColor_write malloc() failed"); |
| 5887 |
return icp->errc = 2; |
6041 |
return icp->errc = 2; |
|
Lines 6109-6117
static unsigned int icmTextDescription_g
Link Here
|
| 6109 |
) { |
6263 |
) { |
| 6110 |
icmTextDescription *p = (icmTextDescription *)pp; |
6264 |
icmTextDescription *p = (icmTextDescription *)pp; |
| 6111 |
unsigned int len = 0; |
6265 |
unsigned int len = 0; |
|
|
6266 |
if (p->size > UINT_MAX - (8 + 4 + 8)) { |
| 6267 |
p->icp->errc = 1; |
| 6268 |
return (unsigned int) -1; |
| 6269 |
} |
| 6112 |
len += 8; /* 8 bytes for tag and padding */ |
6270 |
len += 8; /* 8 bytes for tag and padding */ |
| 6113 |
len += 4 + p->size; /* Ascii string length + ascii string */ |
6271 |
len += 4 + p->size; /* Ascii string length + ascii string */ |
| 6114 |
len += 8 + 2 * p->ucSize; /* Unicode language code + length + string */ |
6272 |
len += 8; /* Unicode language code + length */ |
|
|
6273 |
if (p->ucSize > (UINT_MAX - len) / 2) { |
| 6274 |
p->icp->errc = 1; |
| 6275 |
return (unsigned int) -1; |
| 6276 |
} |
| 6277 |
len += 2 * p->ucSize; /* Unicode string */ |
| 6278 |
if (len > (UINT_MAX - (3 + 67))) { |
| 6279 |
p->icp->errc = 1; |
| 6280 |
return (unsigned int) -1; |
| 6281 |
} |
| 6115 |
len += 3 + 67; /* ScriptCode code, length string */ |
6282 |
len += 3 + 67; /* ScriptCode code, length string */ |
| 6116 |
return len; |
6283 |
return len; |
| 6117 |
} |
6284 |
} |
|
Lines 6294-6299
static int icmTextDescription_write(
Link Here
|
| 6294 |
|
6461 |
|
| 6295 |
/* Allocate a file write buffer */ |
6462 |
/* Allocate a file write buffer */ |
| 6296 |
len = p->get_size((icmBase *)p); |
6463 |
len = p->get_size((icmBase *)p); |
|
|
6464 |
if (icp->errc) |
| 6465 |
return icp->errc; |
| 6297 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
6466 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 6298 |
sprintf(icp->err,"icmTextDescription_write malloc() failed"); |
6467 |
sprintf(icp->err,"icmTextDescription_write malloc() failed"); |
| 6299 |
return icp->errc = 2; |
6468 |
return icp->errc = 2; |
|
Lines 6544-6550
static int icmTextDescription_allocate(
Link Here
|
| 6544 |
if (p->ucSize != p->uc_size) { |
6713 |
if (p->ucSize != p->uc_size) { |
| 6545 |
if (p->ucDesc != NULL) |
6714 |
if (p->ucDesc != NULL) |
| 6546 |
icp->al->free(icp->al, p->ucDesc); |
6715 |
icp->al->free(icp->al, p->ucDesc); |
| 6547 |
if ((p->ucDesc = (ORD16 *) icp->al->malloc(icp->al, p->ucSize * sizeof(ORD16))) == NULL) { |
6716 |
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"); |
6717 |
sprintf(icp->err,"icmTextDescription_alloc: malloc() of Unicode description failed"); |
| 6549 |
return icp->errc = 2; |
6718 |
return icp->errc = 2; |
| 6550 |
} |
6719 |
} |
|
Lines 6820-6825
static int icmProfileSequenceDesc_read(
Link Here
|
| 6820 |
bp += 8; /* Skip padding */ |
6989 |
bp += 8; /* Skip padding */ |
| 6821 |
|
6990 |
|
| 6822 |
p->count = read_UInt32Number(bp); /* Number of sequence descriptions */ |
6991 |
p->count = read_UInt32Number(bp); /* Number of sequence descriptions */ |
|
|
6992 |
if (p->count > 1000) { |
| 6993 |
sprintf(icp->err,"icmProfileSequenceDesc_read: too many sequence descriptions"); |
| 6994 |
icp->al->free(icp->al, buf); |
| 6995 |
return icp->errc = 1; |
| 6996 |
} |
| 6997 |
|
| 6823 |
bp += 4; |
6998 |
bp += 4; |
| 6824 |
|
6999 |
|
| 6825 |
/* Read all the sequence descriptions */ |
7000 |
/* Read all the sequence descriptions */ |
|
Lines 6852-6857
static int icmProfileSequenceDesc_write(
Link Here
|
| 6852 |
|
7027 |
|
| 6853 |
/* Allocate a file write buffer */ |
7028 |
/* Allocate a file write buffer */ |
| 6854 |
len = p->get_size((icmBase *)p); |
7029 |
len = p->get_size((icmBase *)p); |
|
|
7030 |
if (icp->errc) |
| 7031 |
return icp->errc; |
| 6855 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
7032 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 6856 |
sprintf(icp->err,"icmProfileSequenceDesc_write malloc() failed"); |
7033 |
sprintf(icp->err,"icmProfileSequenceDesc_write malloc() failed"); |
| 6857 |
return icp->errc = 2; |
7034 |
return icp->errc = 2; |
|
Lines 6922-6928
static int icmProfileSequenceDesc_alloca
Link Here
|
| 6922 |
if (p->count != p->_count) { |
7099 |
if (p->count != p->_count) { |
| 6923 |
if (p->data != NULL) |
7100 |
if (p->data != NULL) |
| 6924 |
icp->al->free(icp->al, p->data); |
7101 |
icp->al->free(icp->al, p->data); |
| 6925 |
if ((p->data = (icmDescStruct *) icp->al->malloc(icp->al, p->count * sizeof(icmDescStruct))) == NULL) { |
7102 |
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"); |
7103 |
sprintf(icp->err,"icmProfileSequenceDesc_allocate Allocation of DescStruct array failed"); |
| 6927 |
return icp->errc = 2; |
7104 |
return icp->errc = 2; |
| 6928 |
} |
7105 |
} |
|
Lines 7041-7046
static int icmSignature_write(
Link Here
|
| 7041 |
|
7218 |
|
| 7042 |
/* Allocate a file write buffer */ |
7219 |
/* Allocate a file write buffer */ |
| 7043 |
len = p->get_size((icmBase *)p); |
7220 |
len = p->get_size((icmBase *)p); |
|
|
7221 |
if (icp->errc) |
| 7222 |
return icp->errc; |
| 7044 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
7223 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 7045 |
sprintf(icp->err,"icmSignature_write malloc() failed"); |
7224 |
sprintf(icp->err,"icmSignature_write malloc() failed"); |
| 7046 |
return icp->errc = 2; |
7225 |
return icp->errc = 2; |
|
Lines 7156-7161
static unsigned int icmScreening_get_siz
Link Here
|
| 7156 |
icmScreening *p = (icmScreening *)pp; |
7335 |
icmScreening *p = (icmScreening *)pp; |
| 7157 |
unsigned int len = 0; |
7336 |
unsigned int len = 0; |
| 7158 |
len += 16; /* 16 bytes for tag, padding, flag & channeles */ |
7337 |
len += 16; /* 16 bytes for tag, padding, flag & channeles */ |
|
|
7338 |
if (p->channels > (UINT_MAX - len) / 12) { |
| 7339 |
p->icp->errc = 1; |
| 7340 |
return (unsigned int) -1; |
| 7341 |
} |
| 7159 |
len += p->channels * 12; /* 12 bytes for each channel */ |
7342 |
len += p->channels * 12; /* 12 bytes for each channel */ |
| 7160 |
return len; |
7343 |
return len; |
| 7161 |
} |
7344 |
} |
|
Lines 7235-7240
static int icmScreening_write(
Link Here
|
| 7235 |
|
7418 |
|
| 7236 |
/* Allocate a file write buffer */ |
7419 |
/* Allocate a file write buffer */ |
| 7237 |
len = p->get_size((icmBase *)p); |
7420 |
len = p->get_size((icmBase *)p); |
|
|
7421 |
if (icp->errc) |
| 7422 |
return icp->errc; |
| 7238 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
7423 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 7239 |
sprintf(icp->err,"icmScreening_write malloc() failed"); |
7424 |
sprintf(icp->err,"icmScreening_write malloc() failed"); |
| 7240 |
return icp->errc = 2; |
7425 |
return icp->errc = 2; |
|
Lines 7315-7321
static int icmScreening_allocate(
Link Here
|
| 7315 |
if (p->channels != p->_channels) { |
7500 |
if (p->channels != p->_channels) { |
| 7316 |
if (p->data != NULL) |
7501 |
if (p->data != NULL) |
| 7317 |
icp->al->free(icp->al, p->data); |
7502 |
icp->al->free(icp->al, p->data); |
| 7318 |
if ((p->data = (icmScreeningData *) icp->al->malloc(icp->al, p->channels * sizeof(icmScreeningData))) == NULL) { |
7503 |
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"); |
7504 |
sprintf(icp->err,"icmScreening_alloc: malloc() of icmScreening data failed"); |
| 7320 |
return icp->errc = 2; |
7505 |
return icp->errc = 2; |
| 7321 |
} |
7506 |
} |
|
Lines 7366-7375
static unsigned int icmUcrBg_get_size(
Link Here
|
| 7366 |
icmUcrBg *p = (icmUcrBg *)pp; |
7551 |
icmUcrBg *p = (icmUcrBg *)pp; |
| 7367 |
unsigned int len = 0; |
7552 |
unsigned int len = 0; |
| 7368 |
len += 8; /* 8 bytes for tag and padding */ |
7553 |
len += 8; /* 8 bytes for tag and padding */ |
|
|
7554 |
if (p->UCRcount > (UINT_MAX - len - 4) / 2) |
| 7555 |
goto overflow; |
| 7556 |
|
| 7369 |
len += 4 + p->UCRcount * 2; /* Undercolor Removal */ |
7557 |
len += 4 + p->UCRcount * 2; /* Undercolor Removal */ |
|
|
7558 |
if (p->BGcount > (UINT_MAX - len - 4 - p->size) / 2) |
| 7559 |
goto overflow; |
| 7560 |
|
| 7370 |
len += 4 + p->BGcount * 2; /* Black Generation */ |
7561 |
len += 4 + p->BGcount * 2; /* Black Generation */ |
| 7371 |
len += p->size; /* Description string */ |
7562 |
len += p->size; /* Description string */ |
| 7372 |
return len; |
7563 |
return len; |
|
|
7564 |
|
| 7565 |
overflow: |
| 7566 |
p->icp->errc = 1; |
| 7567 |
return (unsigned int) -1; |
| 7373 |
} |
7568 |
} |
| 7374 |
|
7569 |
|
| 7375 |
/* read the object, return 0 on success, error code on fail */ |
7570 |
/* read the object, return 0 on success, error code on fail */ |
|
Lines 7498-7503
static int icmUcrBg_write(
Link Here
|
| 7498 |
|
7693 |
|
| 7499 |
/* Allocate a file write buffer */ |
7694 |
/* Allocate a file write buffer */ |
| 7500 |
len = p->get_size((icmBase *)p); |
7695 |
len = p->get_size((icmBase *)p); |
|
|
7696 |
if (icp->errc) |
| 7697 |
return icp->errc; |
| 7501 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
7698 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 7502 |
sprintf(icp->err,"icmUcrBg_write malloc() failed"); |
7699 |
sprintf(icp->err,"icmUcrBg_write malloc() failed"); |
| 7503 |
return icp->errc = 2; |
7700 |
return icp->errc = 2; |
|
Lines 7663-7669
static int icmUcrBg_allocate(
Link Here
|
| 7663 |
if (p->UCRcount != p->UCR_count) { |
7860 |
if (p->UCRcount != p->UCR_count) { |
| 7664 |
if (p->UCRcurve != NULL) |
7861 |
if (p->UCRcurve != NULL) |
| 7665 |
icp->al->free(icp->al, p->UCRcurve); |
7862 |
icp->al->free(icp->al, p->UCRcurve); |
| 7666 |
if ((p->UCRcurve = (double *) icp->al->malloc(icp->al, p->UCRcount * sizeof(double))) == NULL) { |
7863 |
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"); |
7864 |
sprintf(icp->err,"icmUcrBg_allocate: malloc() of UCR curve data failed"); |
| 7668 |
return icp->errc = 2; |
7865 |
return icp->errc = 2; |
| 7669 |
} |
7866 |
} |
|
Lines 7672-7678
static int icmUcrBg_allocate(
Link Here
|
| 7672 |
if (p->BGcount != p->BG_count) { |
7869 |
if (p->BGcount != p->BG_count) { |
| 7673 |
if (p->BGcurve != NULL) |
7870 |
if (p->BGcurve != NULL) |
| 7674 |
icp->al->free(icp->al, p->BGcurve); |
7871 |
icp->al->free(icp->al, p->BGcurve); |
| 7675 |
if ((p->BGcurve = (double *) icp->al->malloc(icp->al, p->BGcount * sizeof(double))) == NULL) { |
7872 |
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"); |
7873 |
sprintf(icp->err,"icmUcrBg_allocate: malloc() of BG curve data failed"); |
| 7677 |
return icp->errc = 2; |
7874 |
return icp->errc = 2; |
| 7678 |
} |
7875 |
} |
|
Lines 7743-7748
static unsigned int icmVideoCardGamma_ge
Link Here
|
| 7743 |
len += 2; /* 2 bytes for channels */ |
7940 |
len += 2; /* 2 bytes for channels */ |
| 7744 |
len += 2; /* 2 for entry count */ |
7941 |
len += 2; /* 2 for entry count */ |
| 7745 |
len += 2; /* 2 for entry size */ |
7942 |
len += 2; /* 2 for entry size */ |
|
|
7943 |
if (p->u.table.channels > |
| 7944 |
(UINT_MAX - len) / |
| 7945 |
p->u.table.entryCount / |
| 7946 |
p->u.table.entrySize) { |
| 7947 |
p->icp->errc = 1; |
| 7948 |
return (unsigned int) -1; |
| 7949 |
} |
| 7746 |
len += ( p->u.table.channels * /* compute table size */ |
7950 |
len += ( p->u.table.channels * /* compute table size */ |
| 7747 |
p->u.table.entryCount * |
7951 |
p->u.table.entryCount * |
| 7748 |
p->u.table.entrySize ); |
7952 |
p->u.table.entrySize ); |
|
Lines 7762-7771
static int icmVideoCardGamma_read(
Link Here
|
| 7762 |
) { |
7966 |
) { |
| 7763 |
icmVideoCardGamma *p = (icmVideoCardGamma *)pp; |
7967 |
icmVideoCardGamma *p = (icmVideoCardGamma *)pp; |
| 7764 |
icc *icp = p->icp; |
7968 |
icc *icp = p->icp; |
| 7765 |
int rv, c; |
7969 |
int rv; |
| 7766 |
char *bp, *buf; |
7970 |
char *bp, *buf; |
| 7767 |
unsigned char *pchar; |
7971 |
unsigned char *pchar; |
| 7768 |
unsigned short *pshort; |
7972 |
unsigned short *pshort; |
|
|
7973 |
unsigned long c; |
| 7769 |
|
7974 |
|
| 7770 |
if (len < 18) { |
7975 |
if (len < 18) { |
| 7771 |
sprintf(icp->err,"icmVideoCardGamma_read: Tag too small to be legal"); |
7976 |
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); |
8008 |
p->u.table.channels = read_UInt16Number(bp+12); |
| 7804 |
p->u.table.entryCount = read_UInt16Number(bp+14); |
8009 |
p->u.table.entryCount = read_UInt16Number(bp+14); |
| 7805 |
p->u.table.entrySize = read_UInt16Number(bp+16); |
8010 |
p->u.table.entrySize = read_UInt16Number(bp+16); |
|
|
8011 |
if (p->u.table.entrySize > 65530 || p->u.table.entrySize == 0) { |
| 8012 |
sprintf(icp->err,"icmVideoCardGamma_read: Too many entries (or none)"); |
| 8013 |
return icp->errc = 1; |
| 8014 |
} |
| 8015 |
if (p->u.table.channels > |
| 8016 |
UINT_MAX / p->u.table.entryCount / p->u.table.entrySize) { |
| 8017 |
sprintf(icp->err,"icmVideoCardGamma_read: Overflow reading tag"); |
| 8018 |
return icp->errc = 1; |
| 8019 |
} |
| 7806 |
if (len-18 < p->u.table.channels*p->u.table.entryCount*p->u.table.entrySize) { |
8020 |
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"); |
8021 |
sprintf(icp->err,"icmVideoCardGamma_read: Tag too small to be legal"); |
| 7808 |
return icp->errc = 1; |
8022 |
return icp->errc = 1; |
|
Lines 7871-7876
static int icmVideoCardGamma_write(
Link Here
|
| 7871 |
|
8085 |
|
| 7872 |
/* Allocate a file write buffer */ |
8086 |
/* Allocate a file write buffer */ |
| 7873 |
len = p->get_size((icmBase *)p); |
8087 |
len = p->get_size((icmBase *)p); |
|
|
8088 |
if (icp->errc) |
| 8089 |
return icp->errc; |
| 7874 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
8090 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 7875 |
sprintf(icp->err,"icmViewingConditions_write malloc() failed"); |
8091 |
sprintf(icp->err,"icmViewingConditions_write malloc() failed"); |
| 7876 |
return icp->errc = 2; |
8092 |
return icp->errc = 2; |
|
Lines 8049-8055
static int icmVideoCardGamma_allocate(
Link Here
|
| 8049 |
) { |
8265 |
) { |
| 8050 |
icmVideoCardGamma *p = (icmVideoCardGamma *)pp; |
8266 |
icmVideoCardGamma *p = (icmVideoCardGamma *)pp; |
| 8051 |
icc *icp = p->icp; |
8267 |
icc *icp = p->icp; |
| 8052 |
int size; |
8268 |
unsigned int size; |
| 8053 |
|
8269 |
|
| 8054 |
/* note: allocation is only relevant for table type |
8270 |
/* note: allocation is only relevant for table type |
| 8055 |
* and in that case the channels, entryCount, and entrySize |
8271 |
* and in that case the channels, entryCount, and entrySize |
|
Lines 8059-8064
static int icmVideoCardGamma_allocate(
Link Here
|
| 8059 |
if (p->tagType == icmVideoCardGammaTableType) { |
8275 |
if (p->tagType == icmVideoCardGammaTableType) { |
| 8060 |
if (p->u.table.data != NULL) |
8276 |
if (p->u.table.data != NULL) |
| 8061 |
icp->al->free(icp->al, p->u.table.data); |
8277 |
icp->al->free(icp->al, p->u.table.data); |
|
|
8278 |
if (p->u.table.channels > UINT_MAX / p->u.table.entryCount) { |
| 8279 |
sprintf(icp->err,"icmVideoCardGamma_alloc: table too large"); |
| 8280 |
return icp->errc = 1; |
| 8281 |
} |
| 8062 |
size = (p->u.table.channels * |
8282 |
size = (p->u.table.channels * |
| 8063 |
p->u.table.entryCount); |
8283 |
p->u.table.entryCount); |
| 8064 |
switch (p->u.table.entrySize) { |
8284 |
switch (p->u.table.entrySize) { |
|
Lines 8066-8071
static int icmVideoCardGamma_allocate(
Link Here
|
| 8066 |
size *= sizeof(unsigned char); |
8286 |
size *= sizeof(unsigned char); |
| 8067 |
break; |
8287 |
break; |
| 8068 |
case 2: |
8288 |
case 2: |
|
|
8289 |
if (size > UINT_MAX / sizeof(unsigned short)) { |
| 8290 |
sprintf(icp->err,"icmVideoCardGamma_alloc: table too large"); |
| 8291 |
return icp->errc = 1; |
| 8292 |
} |
| 8069 |
size *= sizeof(unsigned short); |
8293 |
size *= sizeof(unsigned short); |
| 8070 |
break; |
8294 |
break; |
| 8071 |
default: |
8295 |
default: |
|
Lines 8201-8206
static int icmViewingConditions_write(
Link Here
|
| 8201 |
|
8425 |
|
| 8202 |
/* Allocate a file write buffer */ |
8426 |
/* Allocate a file write buffer */ |
| 8203 |
len = p->get_size((icmBase *)p); |
8427 |
len = p->get_size((icmBase *)p); |
|
|
8428 |
if (icp->errc) |
| 8429 |
return icp->errc; |
| 8204 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
8430 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 8205 |
sprintf(icp->err,"icmViewingConditions_write malloc() failed"); |
8431 |
sprintf(icp->err,"icmViewingConditions_write malloc() failed"); |
| 8206 |
return icp->errc = 2; |
8432 |
return icp->errc = 2; |
|
Lines 8433-8438
static int icmCrdInfo_write(
Link Here
|
| 8433 |
|
8659 |
|
| 8434 |
/* Allocate a file write buffer */ |
8660 |
/* Allocate a file write buffer */ |
| 8435 |
len = p->get_size((icmBase *)p); |
8661 |
len = p->get_size((icmBase *)p); |
|
|
8662 |
if (icp->errc) |
| 8663 |
return icp->errc; |
| 8436 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
8664 |
if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { |
| 8437 |
sprintf(icp->err,"icmCrdInfo_write malloc() failed"); |
8665 |
sprintf(icp->err,"icmCrdInfo_write malloc() failed"); |
| 8438 |
return icp->errc = 2; |
8666 |
return icp->errc = 2; |
|
Lines 8736-8741
static int icmHeader_write(
Link Here
|
| 8736 |
int rv = 0; |
8964 |
int rv = 0; |
| 8737 |
|
8965 |
|
| 8738 |
len = p->get_size(p); |
8966 |
len = p->get_size(p); |
|
|
8967 |
if (icp->errc) |
| 8968 |
return icp->errc; |
| 8739 |
if ((buf = (char *) icp->al->calloc(icp->al,1,len)) == NULL) { /* Zero it - some CMS are fussy */ |
8969 |
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"); |
8970 |
sprintf(icp->err,"icmHeader_write calloc() failed"); |
| 8741 |
return icp->errc = 2; |
8971 |
return icp->errc = 2; |
|
Lines 9245-9257
static int icc_read(
Link Here
|
| 9245 |
} |
9475 |
} |
| 9246 |
|
9476 |
|
| 9247 |
p->count = read_UInt32Number(tcbuf); /* Tag count */ |
9477 |
p->count = read_UInt32Number(tcbuf); /* Tag count */ |
|
|
9478 |
if (p->count > 100) { |
| 9479 |
sprintf(p->err,"icc_read: too many table tags"); |
| 9480 |
return p->errc = 1; |
| 9481 |
} |
| 9248 |
if (p->count > 0) { |
9482 |
if (p->count > 0) { |
| 9249 |
char *bp, *buf; |
9483 |
char *bp, *buf; |
| 9250 |
if ((p->data = (icmTag *) p->al->malloc(p->al, p->count * sizeof(icmTag))) == NULL) { |
9484 |
if ((p->data = (icmTag *) p->al->calloc(p->al, p->count, sizeof(icmTag))) == NULL) { |
| 9251 |
sprintf(p->err,"icc_read: Tag table malloc() failed"); |
9485 |
sprintf(p->err,"icc_read: Tag table malloc() failed"); |
| 9252 |
return p->errc = 2; |
9486 |
return p->errc = 2; |
| 9253 |
} |
9487 |
} |
| 9254 |
|
9488 |
|
|
|
9489 |
if (p->count > (UINT_MAX - 4) / 12) { |
| 9490 |
sprintf(p->err,"icc_read: overflow"); |
| 9491 |
p->al->free(p->al, p->data); |
| 9492 |
p->data = NULL; |
| 9493 |
return p->errc = 1; |
| 9494 |
} |
| 9255 |
len = 4 + p->count * 12; |
9495 |
len = 4 + p->count * 12; |
| 9256 |
if ((buf = (char *) p->al->malloc(p->al, len)) == NULL) { |
9496 |
if ((buf = (char *) p->al->malloc(p->al, len)) == NULL) { |
| 9257 |
sprintf(p->err,"icc_read: Tag table read buffer malloc() failed"); |
9497 |
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; |
9521 |
return p->errc = 1; |
| 9282 |
} |
9522 |
} |
| 9283 |
p->data[i].size = read_UInt32Number(bp + 8); |
9523 |
p->data[i].size = read_UInt32Number(bp + 8); |
|
|
9524 |
if (p->data[i].offset + p->data[i].size > |
| 9525 |
p->header->size) { |
| 9526 |
sprintf(p->err,"icc_read: tag out of bounds"); |
| 9527 |
p->al->free(p->al, p->data); |
| 9528 |
p->data = NULL; |
| 9529 |
p->al->free(p->al, buf); |
| 9530 |
return p->errc = 1; |
| 9531 |
} |
| 9284 |
if ( p->fp->seek(p->fp, of + p->data[i].offset) != 0 |
9532 |
if ( p->fp->seek(p->fp, of + p->data[i].offset) != 0 |
| 9285 |
|| p->fp->read(p->fp, tcbuf, 1, 4) != 4) { |
9533 |
|| p->fp->read(p->fp, tcbuf, 1, 4) != 4) { |
| 9286 |
sprintf(p->err,"icc_read: fseek() or fread() failed on tag headers"); |
9534 |
sprintf(p->err,"icc_read: fseek() or fread() failed on tag headers"); |
|
Lines 9321-9328
static unsigned int icc_get_size(
Link Here
|
| 9321 |
} |
9569 |
} |
| 9322 |
|
9570 |
|
| 9323 |
size += p->header->get_size(p->header); |
9571 |
size += p->header->get_size(p->header); |
|
|
9572 |
if (p->errc) |
| 9573 |
return (unsigned int) -1; |
| 9324 |
|
9574 |
|
| 9325 |
size = DO_ALIGN(size); |
9575 |
size = DO_ALIGN(size); |
|
|
9576 |
if (size == 0 || p->count > (UINT_MAX - 4 - size) / 12) { |
| 9577 |
p->errc = 1; |
| 9578 |
return (unsigned int) -1; |
| 9579 |
} |
| 9326 |
size += 4 + p->count * 12; /* Tag table length */ |
9580 |
size += 4 + p->count * 12; /* Tag table length */ |
| 9327 |
|
9581 |
|
| 9328 |
/* Reset touched flag for each tag type */ |
9582 |
/* 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 */ |
9591 |
/* Get size for each tag type, skipping links */ |
| 9338 |
for (i = 0; i < p->count; i++) { |
9592 |
for (i = 0; i < p->count; i++) { |
| 9339 |
if (p->data[i].objp->touched == 0) { /* Not alllowed for previously */ |
9593 |
if (p->data[i].objp->touched == 0) { /* Not alllowed for previously */ |
|
|
9594 |
unsigned int obj_size; |
| 9340 |
size = DO_ALIGN(size); |
9595 |
size = DO_ALIGN(size); |
| 9341 |
size += p->data[i].objp->get_size(p->data[i].objp); |
9596 |
obj_size = p->data[i].objp->get_size(p->data[i].objp); |
|
|
9597 |
if (size == 0 || p->errc || |
| 9598 |
obj_size > UINT_MAX - size) |
| 9599 |
return (unsigned int) -1; |
| 9600 |
size += obj_size; |
| 9342 |
p->data[i].objp->touched = 1; /* Don't account for this again */ |
9601 |
p->data[i].objp->touched = 1; /* Don't account for this again */ |
| 9343 |
} |
9602 |
} |
| 9344 |
} |
9603 |
} |
|
Lines 9373-9381
static int icc_write(
Link Here
|
| 9373 |
} |
9632 |
} |
| 9374 |
|
9633 |
|
| 9375 |
size += p->header->get_size(p->header); |
9634 |
size += p->header->get_size(p->header); |
|
|
9635 |
if (p->errc) |
| 9636 |
return p->errc; |
| 9376 |
|
9637 |
|
|
|
9638 |
if (p->count > (UINT_MAX - 4 - len) / 12) { |
| 9639 |
sprintf(p->err,"icc_write: too many tags"); |
| 9640 |
return p->errc = 1; |
| 9641 |
} |
| 9377 |
len = 4 + p->count * 12; /* Tag table length */ |
9642 |
len = 4 + p->count * 12; /* Tag table length */ |
| 9378 |
size = DO_ALIGN(size); |
9643 |
size = DO_ALIGN(size); |
|
|
9644 |
if (size == 0 || size > UINT_MAX - len) { |
| 9645 |
sprintf(p->err,"icc_write: overflow writing tag table"); |
| 9646 |
return p->errc = 1; |
| 9647 |
} |
| 9379 |
size += len; |
9648 |
size += len; |
| 9380 |
|
9649 |
|
| 9381 |
/* Allocate memory buffer for tag table */ |
9650 |
/* Allocate memory buffer for tag table */ |
|
Lines 9406-9411
static int icc_write(
Link Here
|
| 9406 |
size = DO_ALIGN(size); |
9675 |
size = DO_ALIGN(size); |
| 9407 |
p->data[i].offset = size; /* Profile relative target */ |
9676 |
p->data[i].offset = size; /* Profile relative target */ |
| 9408 |
p->data[i].size = p->data[i].objp->get_size(p->data[i].objp); |
9677 |
p->data[i].size = p->data[i].objp->get_size(p->data[i].objp); |
|
|
9678 |
if (size == 0 || |
| 9679 |
p->errc || p->data[i].size > UINT_MAX - size) { |
| 9680 |
sprintf(p->err,"icc_write: internal error - overflow?"); |
| 9681 |
p->al->free(p->al, buf); |
| 9682 |
return p->errc; |
| 9683 |
} |
| 9409 |
size += p->data[i].size; |
9684 |
size += p->data[i].size; |
| 9410 |
p->data[i].objp->touched = 1; /* Allocated space for it */ |
9685 |
p->data[i].objp->touched = 1; /* Allocated space for it */ |
| 9411 |
} else { /* must be linked - copy allocation */ |
9686 |
} else { /* must be linked - copy allocation */ |
|
Lines 9529-9534
static icmBase *icc_add_tag(
Link Here
|
| 9529 |
} |
9804 |
} |
| 9530 |
|
9805 |
|
| 9531 |
/* Make space in tag table for new tag item */ |
9806 |
/* Make space in tag table for new tag item */ |
|
|
9807 |
if (p->count > SIZE_MAX / sizeof(icmTag) - 1) { |
| 9808 |
sprintf(p->err,"icc_add_tag: overflow"); |
| 9809 |
p->errc = 1; |
| 9810 |
return NULL; |
| 9811 |
} |
| 9532 |
if (p->data == NULL) |
9812 |
if (p->data == NULL) |
| 9533 |
tp = p->al->malloc(p->al, (p->count+1) * sizeof(icmTag)); |
9813 |
tp = p->al->malloc(p->al, (p->count+1) * sizeof(icmTag)); |
| 9534 |
else |
9814 |
else |
|
Lines 9612-9617
static icmBase *icc_link_tag(
Link Here
|
| 9612 |
} |
9892 |
} |
| 9613 |
|
9893 |
|
| 9614 |
/* Make space in tag table for new tag item */ |
9894 |
/* Make space in tag table for new tag item */ |
|
|
9895 |
if (p->count > UINT_MAX / sizeof(icmTag) - 1) { |
| 9896 |
sprintf(p->err,"icc_link_tag: overflow"); |
| 9897 |
p->errc = 1; |
| 9898 |
return NULL; |
| 9899 |
} |
| 9615 |
if (p->data == NULL) |
9900 |
if (p->data == NULL) |
| 9616 |
tp = p->al->malloc(p->al, (p->count+1) * sizeof(icmTag)); |
9901 |
tp = p->al->malloc(p->al, (p->count+1) * sizeof(icmTag)); |
| 9617 |
else |
9902 |
else |