1 /* Integration test to ensure we issue FILE * leak diagnostics for
2 this particular non-trivial case.
3 Adapted from zlib/contrib/minizip/mztools.c, with all #includes
6 /* { dg-do "compile" } */
7 /* { dg-additional-options "-fsigned-char" } */
9 /* Minimal replacement of system headers. */
11 typedef __SIZE_TYPE__
size_t;
12 #define NULL ((void *) 0)
14 typedef struct _IO_FILE
FILE;
15 extern FILE *fopen(const char *__restrict __filename
,
16 const char *__restrict __modes
);
17 extern size_t fread (void *__restrict __ptr
, size_t __size
,
18 size_t __n
, FILE *__restrict __stream
);
19 extern size_t fwrite (const void *__restrict __ptr
, size_t __size
,
20 size_t __n
, FILE *__restrict __s
);
21 extern int fclose (FILE *__stream
);
22 extern int remove (const char *__filename
)
23 __attribute__ ((__nothrow__
, __leaf__
));
25 extern void *malloc (size_t __size
)
26 __attribute__ ((__nothrow__
, __leaf__
))
27 __attribute__ ((__malloc__
));
28 extern void free (void *__ptr
)
29 __attribute__ ((__nothrow__
, __leaf__
));
31 extern size_t strlen (const char *__s
)
32 __attribute__ ((__nothrow__
, __leaf__
))
33 __attribute__ ((__pure__
))
34 __attribute__ ((__nonnull__ (1)));
36 /* Minimal replacement of zlib headers. */
39 typedef unsigned long uLong
; /* 32 bits or more */
42 #define Z_STREAM_ERROR (-2)
43 #define Z_MEM_ERROR (-4)
46 Additional tools for Minizip
47 Code: Xavier Roche '2004
48 License: Same as ZLIB (www.gzip.org)
53 #define READ_8(adr) ((unsigned char)*(adr))
54 #define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) )
55 #define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) )
57 #define WRITE_8(buff, n) do { \
58 *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \
60 #define WRITE_16(buff, n) do { \
61 WRITE_8((unsigned char*)(buff), n); \
62 WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \
64 #define WRITE_32(buff, n) do { \
65 WRITE_16((unsigned char*)(buff), (n) & 0xffff); \
66 WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \
69 extern int ZEXPORT
unzRepair(file
, fileOut
, fileOutTmp
, nRecovered
, bytesRecovered
)
72 const char* fileOutTmp
;
74 uLong
* bytesRecovered
;
77 FILE* fpZip
= fopen(file
, "rb");
78 FILE* fpOut
= fopen(fileOut
, "wb");
79 FILE* fpOutCD
= fopen(fileOutTmp
, "wb");
80 if (fpZip
!= NULL
&& fpOut
!= NULL
) {
88 while ( fread(header
, 1, 30, fpZip
) == 30 ) {
89 int currentOffset
= offset
;
92 if (READ_32(header
) == 0x04034b50) {
93 unsigned int version
= READ_16(header
+ 4);
94 unsigned int gpflag
= READ_16(header
+ 6);
95 unsigned int method
= READ_16(header
+ 8);
96 unsigned int filetime
= READ_16(header
+ 10);
97 unsigned int filedate
= READ_16(header
+ 12);
98 unsigned int crc
= READ_32(header
+ 14); /* crc */
99 unsigned int cpsize
= READ_32(header
+ 18); /* compressed size */
100 unsigned int uncpsize
= READ_32(header
+ 22); /* uncompressed sz */
101 unsigned int fnsize
= READ_16(header
+ 26); /* file name length */
102 unsigned int extsize
= READ_16(header
+ 28); /* extra field length */
103 filename
[0] = extra
[0] = '\0';
106 if (fwrite(header
, 1, 30, fpOut
) == 30) {
115 if (fnsize
< sizeof(filename
)) {
116 if (fread(filename
, 1, fnsize
, fpZip
) == fnsize
) {
117 if (fwrite(filename
, 1, fnsize
, fpOut
) == fnsize
) {
132 err
= Z_STREAM_ERROR
;
138 if (extsize
< sizeof(extra
)) {
139 if (fread(extra
, 1, extsize
, fpZip
) == extsize
) {
140 if (fwrite(extra
, 1, extsize
, fpOut
) == extsize
) {
158 int dataSize
= cpsize
;
163 char* data
= malloc(dataSize
);
165 if ((int)fread(data
, 1, dataSize
, fpZip
) == dataSize
) {
166 if ((int)fwrite(data
, 1, dataSize
, fpOut
) == dataSize
) {
168 totalBytes
+= dataSize
;
186 /* Central directory entry */
190 int comsize
= (int) strlen(comment
);
191 WRITE_32(header
, 0x02014b50);
192 WRITE_16(header
+ 4, version
);
193 WRITE_16(header
+ 6, version
);
194 WRITE_16(header
+ 8, gpflag
);
195 WRITE_16(header
+ 10, method
);
196 WRITE_16(header
+ 12, filetime
);
197 WRITE_16(header
+ 14, filedate
);
198 WRITE_32(header
+ 16, crc
);
199 WRITE_32(header
+ 20, cpsize
);
200 WRITE_32(header
+ 24, uncpsize
);
201 WRITE_16(header
+ 28, fnsize
);
202 WRITE_16(header
+ 30, extsize
);
203 WRITE_16(header
+ 32, comsize
);
204 WRITE_16(header
+ 34, 0); /* disk # */
205 WRITE_16(header
+ 36, 0); /* int attrb */
206 WRITE_32(header
+ 38, 0); /* ext attrb */
207 WRITE_32(header
+ 42, currentOffset
);
209 if (fwrite(header
, 1, 46, fpOutCD
) == 46) {
214 if (fwrite(filename
, 1, fnsize
, fpOutCD
) == fnsize
) {
221 err
= Z_STREAM_ERROR
;
227 if (fwrite(extra
, 1, extsize
, fpOutCD
) == extsize
) {
237 if ((int)fwrite(comment
, 1, comsize
, fpOutCD
) == comsize
) {
260 /* Final central directory */
262 int entriesZip
= entries
;
264 char* comment
= ""; // "ZIP File recovered by zlib/minizip/mztools";
265 int comsize
= (int) strlen(comment
);
266 if (entriesZip
> 0xffff) {
269 WRITE_32(header
, 0x06054b50);
270 WRITE_16(header
+ 4, 0); /* disk # */
271 WRITE_16(header
+ 6, 0); /* disk # */
272 WRITE_16(header
+ 8, entriesZip
); /* hack */
273 WRITE_16(header
+ 10, entriesZip
); /* hack */
274 WRITE_32(header
+ 12, offsetCD
); /* size of CD */
275 WRITE_32(header
+ 16, offset
); /* offset to CD */
276 WRITE_16(header
+ 20, comsize
); /* comment */
279 if (fwrite(header
, 1, 22, fpOutCD
) == 22) {
283 if ((int)fwrite(comment
, 1, comsize
, fpOutCD
) != comsize
) {
293 /* Final merge (file + central directory) */
296 fpOutCD
= fopen(fileOutTmp
, "rb");
297 if (fpOutCD
!= NULL
) {
300 while ( (nRead
= (int)fread(buffer
, 1, sizeof(buffer
), fpOutCD
)) > 0) {
301 if ((int)fwrite(buffer
, 1, nRead
, fpOut
) != nRead
) {
314 /* Wipe temporary file */
315 (void)remove(fileOutTmp
);
317 /* Number of recovered entries */
319 if (nRecovered
!= NULL
) {
320 *nRecovered
= entries
;
322 if (bytesRecovered
!= NULL
) {
323 *bytesRecovered
= totalBytes
;
327 err
= Z_STREAM_ERROR
;
329 return err
; /* { dg-warning "leak of FILE 'fpZip'" "leak of fpZip" } */
330 /* { dg-warning "leak of FILE 'fpOut'" "leak of fpOut" { target *-*-* } .-1 } */
331 /* { dg-warning "leak of FILE 'fpOutCD'" "leak of fpOutCD" { target *-*-* } .-2 } */