size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) { size_t tmp; pthread_mutex_lock(&stream->m); tmp=fread_unlocked(ptr,size,nmemb,stream); pthread_mutex_unlock(&stream->m); return tmp; }
static int read_block(FILE *fp, block_data_t *bd) { int chr; /* read block type */ chr = getc_unlocked(fp); if (chr == EOF) { return EOF; } bd->type = chr; /* read data length */ bd->data_len = chr = getc_unlocked(fp); if (chr == EOF) { return TOO_SHORT_DATA_BLOCK; } bd->data_len |= ((chr = getc_unlocked(fp)) << 8); if (chr == EOF) { return TOO_SHORT_DATA_BLOCK; } /* read data */ if (bd->data_len > 0 && fread_unlocked(bd->data, bd->data_len, 1, fp) != 1) { return TOO_SHORT_DATA_BLOCK; } return SUCCESS; }
void refreshBuffer (struct BufferedInputStream * bis) { if (bis->eofRead) return; unsigned long long bytesToCopy = 0; if (bis->bytesReadFromBuffer > 0) { bytesToCopy = bis->bytesReadToBuffer - bis->bytesReadFromBuffer; memmove(bis->bufferStream, bis->bufferPointer, bytesToCopy); bis->bufferPointer = bis->bufferStream; bis->bytesReadFromBuffer = 0; bis->bytesReadToBuffer = bytesToCopy; } size_t membersRead = fread_unlocked(bis->bufferStream + bytesToCopy, sizeof(char), bis->bufferSize - bis->bytesReadToBuffer, bis->inputStream); bis->bytesReadToBuffer += membersRead * (unsigned long long) sizeof(char); if (ferror(bis->inputStream)) { fprintf(stderr, "Error encountered in reading from input stream."); abort(); } else if (feof(bis->inputStream)) { clearerr(bis->inputStream); bis->eofRead = 1; } }
static int snappy_java_compress(FILE *infp, FILE *outfp, size_t block_size) { snappy_java_header_t header; work_buffer_t wb; size_t uncompressed_length; int err = 1; wb.c = NULL; wb.uc = NULL; if (block_size == 0) { block_size = DEFAULT_BLOCK_SIZE; } /* write the file header */ memcpy(header.magic, SNAPPY_JAVA_MAGIC, SNAPPY_JAVA_MAGIC_LEN); header.version = htonl(SNAPPY_JAVA_FILE_VERSION); header.compatible_version = htonl(SNAPPY_JAVA_FILE_VERSION); if (fwrite_unlocked(&header, sizeof(header), 1, outfp) != 1) { print_error("Failed to write a file: %s\n", strerror(errno)); goto cleanup; } /* write file body */ work_buffer_init(&wb, block_size); while ((uncompressed_length = fread_unlocked(wb.uc, 1, wb.uclen, infp)) > 0) { size_t compressed_length = wb.clen; trace("read %lu bytes.\n", (unsigned long)uncompressed_length); /* compress the block. */ snappy_compress(wb.uc, uncompressed_length, wb.c, &compressed_length); trace("compressed_legnth is %lu.\n", (unsigned long)compressed_length); /* write the compressed length. */ putc_unlocked((compressed_length >> 24), outfp); putc_unlocked((compressed_length >> 16), outfp); putc_unlocked((compressed_length >> 8), outfp); putc_unlocked((compressed_length >> 0), outfp); trace("write 4 bytes for compressed data length.\n"); /* write the compressed data. */ if (fwrite_unlocked(wb.c, compressed_length, 1, outfp) != 1) { print_error("Failed to write a file: %s\n", strerror(errno)); goto cleanup; } trace("write %ld bytes for compressed data.\n", (long)compressed_length); } if (!feof_unlocked(infp)) { /* fread_unlocked() failed. */ print_error("Failed to read a file: %s\n", strerror(errno)); goto cleanup; } err = 0; cleanup: work_buffer_free(&wb); return err; }
static size_t fread_lock(void* data, size_t size, size_t count, FILE* f) { #if HAVE_FREAD_UNLOCKED return fread_unlocked(data, size, count, f); #else return fread(data, size, count, f); #endif }
static int snappy_in_java_compress(FILE *infp, FILE *outfp, size_t block_size) { work_buffer_t wb; size_t uncompressed_length; int err = 1; wb.c = NULL; wb.uc = NULL; if (block_size == 0) { block_size = DEFAULT_BLOCK_SIZE; } if (block_size > MAX_BLOCK_SIZE) { print_error("Too large block size: %lu. (default: %d, max: %d)\n", (unsigned long)block_size, DEFAULT_BLOCK_SIZE, MAX_BLOCK_SIZE); goto cleanup; } if (fwrite_unlocked(&snappy_in_java_header, sizeof(snappy_in_java_header), 1, outfp) != 1) { print_error("Failed to write a file: %s\n", strerror(errno)); goto cleanup; } /* write file body */ work_buffer_init(&wb, block_size); while ((uncompressed_length = fread_unlocked(wb.uc, 1, wb.uclen, infp)) > 0) { size_t compressed_length = wb.clen; unsigned int crc32c = masked_crc32c(wb.uc, uncompressed_length); trace("read %lu bytes.\n", (unsigned long)uncompressed_length); /* compress the block. */ snappy_compress(wb.uc, uncompressed_length, wb.c, &compressed_length); trace("compressed_legnth is %lu.\n", (unsigned long)compressed_length); if (compressed_length >= (uncompressed_length - (uncompressed_length / 8))) { trace("write uncompressed data\n"); if (write_block(outfp, wb.uc, uncompressed_length, FALSE, crc32c) != 0) { goto cleanup; } } else { trace("write compressed data\n"); if (write_block(outfp, wb.c, compressed_length, TRUE, crc32c) != 0) { goto cleanup; } } } if (!feof_unlocked(infp)) { /* fread_unlocked() failed. */ print_error("Failed to read a file: %s\n", strerror(errno)); goto cleanup; } err = 0; cleanup: work_buffer_free(&wb); return err; }
static int read_data(char *buf, size_t buflen, FILE *fp) { if (fread_unlocked(buf, buflen, 1, fp) != 1) { if (feof_unlocked(fp)) { print_error("Unexpected end of file\n"); } else { print_error("Failed to read a file: %s\n", strerror(errno)); } return -1; } return 0; }
int main() { fread_unlocked(ibuff, 3000, 1, stdin); getstr(dump); test = atoi(dump); while(test--) { init(); readSudoku(); solveDLX(0); if(test) getstr(dump), *out++ = '\n'; } fwrite_unlocked(obuff, out - obuff, 1, stdout); return 0; }
int main (int argc, char *argv[]) { double C = 60 * log(2); double PI = 2 * acos(0); fread_unlocked(s, sizeof(char), 10 * 1024 * 1024, stdin); readn(); int i, t = n; for (I = 0; I < t; I += 1) { readn_signed(); a = n; readn_signed(); b = n; theta = atan2 (b, a) / PI; r = log( (double)( a * a + b * b ) ); written = 1; for (k = 1; k <= 4; k += 1) { if ( k * r <= C && fabs ( k * theta - (int)(k * theta + 0.5) ) < 0.00001 ) { writen(k); written = 101; break; } } if ( written != 101 ) { out[++wcount] = 'T'; out[++wcount] = 'O'; out[++wcount] = 'O'; out[++wcount] = ' '; out[++wcount] = 'C'; out[++wcount] = 'O'; out[++wcount] = 'M'; out[++wcount] = 'P'; out[++wcount] = 'L'; out[++wcount] = 'I'; out[++wcount] = 'C'; out[++wcount] = 'A'; out[++wcount] = 'T'; out[++wcount] = 'E'; out[++wcount] = 'D'; } out[++wcount] = '\n'; } fwrite_unlocked(out, 1, wcount + 1, stdout); return 0; }
int main() { int test, cs, slen, plen; //freopen("in.txt", "r", stdin); fread_unlocked(buff, 1, 0x800000, stdin); ptr = buff; nextint(test); for(cs = 1; cs <= test; cs++) { nextstr(str,slen); nextstr(pattern,plen); if(plen > slen) { printf("Case %d: 0\n", cs); continue; } computeOverlap(plen); printf("Case %d: %d\n", cs, kmpMatcher(plen, slen)); } return 0; }
bool read_whole_file(FILE *fp, std::string *ret, size_t estimated_size) { if (estimated_size < 128) { estimated_size = 128; } ret->clear(); std::unique_ptr<char[]> buf{new char[estimated_size]}; size_t l; while ((l = fread_unlocked(buf.get(), 1, estimated_size, fp)) != 0) { ret->append(buf.get(), l); } if (ferror_unlocked(fp)) { return false; } return true; }
int main (int argc, char *argv[]) { int i; unsigned int f[77]; f[1] = 1; f[2] = 2; f[3] = 2; for (i = 4; i < 77; i += 1) { f[i] = f[i - 3] + f[i - 2]; } fread_unlocked(s, sizeof(char), 10 * 1024, stdin); readn(); do { writen(f[n]); out[++wcount] = '\n'; readn(); } while ( n > 0 ); fwrite_unlocked(out, 1, wcount + 1, stdout); return 0; }
static int do_test (void) { const char blah[] = "BLAH"; char buf[strlen (blah) + 1]; FILE *fp, *f; const char *cp; char *wp; if ((fp = fdopen (fd, "w+")) == NULL) exit (1); flockfile (fp); f = fp; cp = blah; if (ftello (fp) != 0 || fwrite_unlocked (blah, blah - blah, strlen (blah), f++) != 0 || f != fp + 1 || fwrite_unlocked ("", 5.0, 0, --f) != 0 || f != fp || fwrite_unlocked (cp++, 16, 0.25, fp) != 0 || cp != blah + 1 || fwrite_unlocked (--cp, 0.25, 16, fp) != 0 || cp != blah || fwrite_unlocked (blah, 0, -0.0, fp) != 0 || ftello (fp) != 0) { puts ("One of fwrite_unlocked tests failed"); exit (1); } if (fwrite_unlocked (blah, 1, strlen (blah) - 2, fp) != strlen (blah) - 2) { puts ("Could not write string into file"); exit (1); } if (putc_unlocked ('A' + 0x1000000, fp) != 'A') { puts ("putc_unlocked failed"); exit (1); } f = fp; cp = blah + strlen (blah) - 1; if (putc_unlocked (*cp++, f++) != 'H' || f != fp + 1 || cp != strchr (blah, '\0')) { puts ("fputc_unlocked failed"); exit (1); } if (ftello (fp) != (off_t) strlen (blah)) { printf ("Failed to write %zd bytes to temporary file", strlen (blah)); exit (1); } rewind (fp); f = fp; wp = buf; memset (buf, ' ', sizeof (buf)); if (ftello (fp) != 0 || fread_unlocked (buf, buf - buf, strlen (blah), f++) != 0 || f != fp + 1 || fread_unlocked (buf, 5.0, 0, --f) != 0 || f != fp || fread_unlocked (wp++, 16, 0.25, fp) != 0 || wp != buf + 1 || fread_unlocked (--wp, 0.25, 16, fp) != 0 || wp != buf || fread_unlocked (buf, 0, -0.0, fp) != 0 || ftello (fp) != 0 || memcmp (buf, " ", sizeof (buf)) != 0) { puts ("One of fread_unlocked tests failed"); exit (1); } if (fread_unlocked (buf, 1, strlen (blah) - 2, fp) != strlen (blah) - 2) { puts ("Could not read string from file"); exit (1); } if (getc_unlocked (fp) != 'A') { puts ("getc_unlocked failed"); exit (1); } f = fp; if (fgetc_unlocked (f++) != 'H' || f != fp + 1 || fgetc_unlocked (--f) != EOF || f != fp) { puts ("fgetc_unlocked failed"); exit (1); } if (ftello (fp) != (off_t) strlen (blah)) { printf ("Failed to read %zd bytes from temporary file", strlen (blah)); exit (1); } funlockfile (fp); fclose (fp); return 0; }
static int comment_43_compress(FILE *infp, FILE *outfp, size_t block_size) { const size_t max_raw_data_len = 32 * 1024; /* maximum data length */ const size_t max_compressed_data_len = snappy_max_compressed_length(max_raw_data_len); /* maximum compressed length */ size_t raw_data_len; size_t compressed_data_len; char *raw_data = malloc(max_raw_data_len); char *compressed_data = malloc(max_compressed_data_len); int err = 1; if (raw_data == NULL || compressed_data == NULL) { print_error("out of memory\n"); goto cleanup; } putc_unlocked(HEADER_TYPE_CODE, outfp); putc_unlocked(MAGIC_LEN, outfp); putc_unlocked(MAGIC_LEN >> 8, outfp); fwrite_unlocked(MAGIC, MAGIC_LEN, 1, outfp); /* write file body */ while ((raw_data_len = fread_unlocked(raw_data, 1, max_raw_data_len, infp)) > 0) { unsigned int crc32c = masked_crc32c(raw_data, raw_data_len); char type_code; size_t write_len; const char *write_data; /* compress the block. */ compressed_data_len = max_compressed_data_len; snappy_compress(raw_data, raw_data_len, compressed_data, &compressed_data_len); if (compressed_data_len >= (raw_data_len - (raw_data_len / 8))) { /* write uncompressed data */ type_code = UNCOMPRESSED_TYPE_CODE; write_len = raw_data_len; write_data = raw_data; } else { /* write compressed data */ type_code = COMPRESSED_TYPE_CODE; write_len = compressed_data_len; write_data = compressed_data; } /* block type */ putc_unlocked(type_code, outfp); /* data length */ putc_unlocked(((write_len + 4) >> 0), outfp); putc_unlocked(((write_len + 4) >> 8), outfp); /* data */ putc_unlocked((crc32c >> 0), outfp); putc_unlocked((crc32c >> 8), outfp); putc_unlocked((crc32c >> 16), outfp); putc_unlocked((crc32c >> 24), outfp); if (fwrite_unlocked(write_data, write_len, 1, outfp) != 1) { print_error("Failed to write a file: %s\n", strerror(errno)); goto cleanup; } } if (!feof_unlocked(infp)) { /* fread_unlocked() failed. */ print_error("Failed to read a file: %s\n", strerror(errno)); goto cleanup; } putc_unlocked(END_OF_STREAM_TYPE_CODE, outfp); putc_unlocked(0, outfp); putc_unlocked(0, outfp); if (ferror_unlocked(outfp)) { print_error("Failed to write a file: %s\n", strerror(errno)); goto cleanup; } err = 0; cleanup: free(raw_data); free(compressed_data); return err; }
int main(){ int query, i, j, k = 0, x, a, b; fread_unlocked(str, 1, 10000000, stdin); for (i = 0; i < 25; i++) ar[0][i] = 0; while (str[k] < 48 || str[k] > 57) k++; for (; str[k] > 47 && str[k] < 58; k++) n = T(n); for (i = 1; i <= n; i++){ x = 0; while (str[k] < 48 || str[k] > 57) k++; for (; str[k] > 47 && str[k] < 58; k++) x = T(x); for (j = 0; j < 25; j++){ ar[i][j] = ar[i - 1][j]; int p = primes[j]; while ((x % p) == 0){ ar[i][j]++; x /= p; } } } while (str[k] < 48 || str[k] > 57) k++; for (; str[k] > 47 && str[k] < 58; k++) q = T(q); for (query = 0; query < q; query++){ a = 0, b = 0, MOD = 0; while (str[k] < 48 || str[k] > 57) k++; for (; str[k] > 47 && str[k] < 58; k++) a = T(a); while (str[k] < 48 || str[k] > 57) k++; for (; str[k] > 47 && str[k] < 58; k++) b = T(b); while (str[k] < 48 || str[k] > 57) k++; for (; str[k] > 47 && str[k] < 58; k++) MOD = T(MOD); long long int res = 1; if (MOD > 1){ for (j = 0; j < 25; j++){ x = ar[b][j] - ar[a - 1][j]; if (x){ int y = bigmod(primes[j], x); res = (res * y) % MOD; } } } else res = 0; j = 0; x = res; for (; ;){ if (!x) break; str3[j++] = (x % 10) + 48; x *= 0.1; } if (!j) str3[j++] = 48; for (i = j - 1; i >= 0; i--) str2[ye++] = str3[i]; str2[ye++] = 10; } fwrite_unlocked(str2, 1, ye, stdout); return 0; }
static int snzip_compress(FILE *infp, FILE *outfp, size_t block_size) { snz_header_t header; work_buffer_t wb; size_t uncompressed_length; int err = 1; int nshift; wb.c = NULL; wb.uc = NULL; if (block_size == 0) { block_size = 1ul << SNZ_DEFAULT_BLOCK_SIZE; nshift = SNZ_DEFAULT_BLOCK_SIZE; } else { if (block_size > (1ul << SNZ_MAX_BLOCK_SIZE)) { print_error("too large block size: %lu\n", block_size); goto cleanup; } for (nshift = 1; nshift <= SNZ_MAX_BLOCK_SIZE; nshift++) { if (1ul << nshift == block_size) { break; } } if (nshift == SNZ_MAX_BLOCK_SIZE) { print_error("The block size must be power of two\n"); goto cleanup; } } /* write the file header */ memcpy(header.magic, SNZ_MAGIC, SNZ_MAGIC_LEN); header.version = SNZ_FILE_VERSION; header.block_size = nshift; if (fwrite_unlocked(&header, sizeof(header), 1, outfp) != 1) { print_error("Failed to write a file: %s\n", strerror(errno)); goto cleanup; } /* write file body */ work_buffer_init(&wb, block_size); while ((uncompressed_length = fread_unlocked(wb.uc, 1, wb.uclen, infp)) > 0) { size_t compressed_length = wb.clen; trace("read %lu bytes.\n", (unsigned long)uncompressed_length); /* compress the block. */ snappy_compress(wb.uc, uncompressed_length, wb.c, &compressed_length); trace("compressed_legnth is %lu.\n", (unsigned long)compressed_length); /* write the compressed length. */ if (compressed_length < (1ul << 7)) { putc_unlocked(compressed_length, outfp); trace("write 1 byte for compressed data length.\n"); } else if (compressed_length < (1ul << 14)) { putc_unlocked((compressed_length >> 0) | 0x80, outfp); putc_unlocked((compressed_length >> 7), outfp); trace("write 2 bytes for compressed data length.\n"); } else if (compressed_length < (1ul << 21)) {
static int framing_format_compress(FILE *infp, FILE *outfp, size_t block_size) { const size_t max_uncompressed_data_len = MAX_UNCOMPRESSED_DATA_LEN; const size_t max_compressed_data_len = snappy_max_compressed_length(max_uncompressed_data_len); size_t uncompressed_data_len; size_t compressed_data_len; char *uncompressed_data = malloc(max_uncompressed_data_len); char *compressed_data = malloc(max_compressed_data_len); int err = 1; if (uncompressed_data == NULL || compressed_data == NULL) { print_error("out of memory\n"); goto cleanup; } /* write the steam header */ fwrite_unlocked(stream_header, sizeof(stream_header), 1, outfp); /* write file body */ while ((uncompressed_data_len = fread_unlocked(uncompressed_data, 1, max_uncompressed_data_len, infp)) > 0) { unsigned int crc32c = masked_crc32c(uncompressed_data, uncompressed_data_len); char type_code; size_t write_len; const char *write_data; /* compress the block. */ compressed_data_len = max_compressed_data_len; snappy_compress(uncompressed_data, uncompressed_data_len, compressed_data, &compressed_data_len); if (compressed_data_len >= (uncompressed_data_len - (uncompressed_data_len / 8))) { /* uncompressed data */ type_code = UNCOMPRESSED_DATA_IDENTIFIER; write_len = uncompressed_data_len; write_data = uncompressed_data; } else { /* compressed data */ type_code = COMPRESSED_DATA_IDENTIFIER; write_len = compressed_data_len; write_data = compressed_data; } /* write block type */ putc_unlocked(type_code, outfp); /* write data length */ putc_unlocked(((write_len + 4) >> 0), outfp); putc_unlocked(((write_len + 4) >> 8), outfp); /* write checksum */ putc_unlocked((crc32c >> 0), outfp); putc_unlocked((crc32c >> 8), outfp); putc_unlocked((crc32c >> 16), outfp); putc_unlocked((crc32c >> 24), outfp); /* write data */ if (fwrite_unlocked(write_data, write_len, 1, outfp) != 1) { print_error("Failed to write a file: %s\n", strerror(errno)); goto cleanup; } } /* check stream errors */ if (ferror_unlocked(infp)) { print_error("Failed to read a file: %s\n", strerror(errno)); goto cleanup; } if (ferror_unlocked(outfp)) { print_error("Failed to write a file: %s\n", strerror(errno)); goto cleanup; } err = 0; cleanup: free(uncompressed_data); free(compressed_data); return err; }
static int do_test (void) { const char blah[] = "BLAH"; char buf[strlen (blah) + 1]; FILE *fp, *f; const char *cp; char *wp; if ((fp = fdopen (fd, "w+")) == NULL) exit (1); flockfile (fp); f = fp; cp = blah; /* These tests deliberately use fwrite_unlocked with the size argument specified as 0, which results in "division by zero" warnings from the expansion of that macro (in code that is not evaluated for a size of 0). This applies to the tests of fread_unlocked below as well. */ DIAG_PUSH_NEEDS_COMMENT; DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdiv-by-zero"); if (ftello (fp) != 0 || fwrite_unlocked (blah, blah - blah, strlen (blah), f++) != 0 || f != fp + 1 || fwrite_unlocked ("", 5.0, 0, --f) != 0 || f != fp || fwrite_unlocked (cp++, 16, 0.25, fp) != 0 || cp != blah + 1 || fwrite_unlocked (--cp, 0.25, 16, fp) != 0 || cp != blah || fwrite_unlocked (blah, 0, -0.0, fp) != 0 || ftello (fp) != 0) { puts ("One of fwrite_unlocked tests failed"); exit (1); } DIAG_POP_NEEDS_COMMENT; if (fwrite_unlocked (blah, 1, strlen (blah) - 2, fp) != strlen (blah) - 2) { puts ("Could not write string into file"); exit (1); } if (putc_unlocked ('A' + 0x1000000, fp) != 'A') { puts ("putc_unlocked failed"); exit (1); } f = fp; cp = blah + strlen (blah) - 1; if (putc_unlocked (*cp++, f++) != 'H' || f != fp + 1 || cp != strchr (blah, '\0')) { puts ("fputc_unlocked failed"); exit (1); } if (ftello (fp) != (off_t) strlen (blah)) { printf ("Failed to write %zd bytes to temporary file", strlen (blah)); exit (1); } rewind (fp); f = fp; wp = buf; memset (buf, ' ', sizeof (buf)); /* See explanation above. */ DIAG_PUSH_NEEDS_COMMENT; DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdiv-by-zero"); if (ftello (fp) != 0 || fread_unlocked (buf, buf - buf, strlen (blah), f++) != 0 || f != fp + 1 || fread_unlocked (buf, 5.0, 0, --f) != 0 || f != fp || fread_unlocked (wp++, 16, 0.25, fp) != 0 || wp != buf + 1 || fread_unlocked (--wp, 0.25, 16, fp) != 0 || wp != buf || fread_unlocked (buf, 0, -0.0, fp) != 0 || ftello (fp) != 0 || memcmp (buf, " ", sizeof (buf)) != 0) { puts ("One of fread_unlocked tests failed"); exit (1); } DIAG_POP_NEEDS_COMMENT; if (fread_unlocked (buf, 1, strlen (blah) - 2, fp) != strlen (blah) - 2) { puts ("Could not read string from file"); exit (1); } if (getc_unlocked (fp) != 'A') { puts ("getc_unlocked failed"); exit (1); } f = fp; if (fgetc_unlocked (f++) != 'H' || f != fp + 1 || fgetc_unlocked (--f) != EOF || f != fp) { puts ("fgetc_unlocked failed"); exit (1); } if (ftello (fp) != (off_t) strlen (blah)) { printf ("Failed to read %zd bytes from temporary file", strlen (blah)); exit (1); } funlockfile (fp); fclose (fp); return 0; }
static int snappy_in_java_uncompress(FILE *infp, FILE *outfp, int skip_magic) { snappy_in_java_header_t header; work_buffer_t wb; int err = 1; int outfd; wb.c = NULL; wb.uc = NULL; if (!skip_magic) { /* read header */ if (fread_unlocked(&header, sizeof(header), 1, infp) != 1) { print_error("Failed to read a file: %s\n", strerror(errno)); goto cleanup; } /* check header */ if (memcmp(header.magic, SNAPPY_IN_JAVA_MAGIC, SNAPPY_IN_JAVA_MAGIC_LEN) != 0) { print_error("This is not a snappy-java file.\n"); goto cleanup; } } /* Use a file descriptor 'outfd' instead of the stdio file pointer 'outfp' * to reduce the number of write system calls. */ fflush(outfp); outfd = fileno(outfp); /* read body */ work_buffer_init(&wb, MAX_BLOCK_SIZE); for (;;) { int compressed_flag; size_t length = 0; unsigned int crc32c = 0; /* read compressed flag */ compressed_flag = getc_unlocked(infp); switch (compressed_flag) { case EOF: /* read all blocks */ err = 0; goto cleanup; case COMPRESSED_FLAG: case UNCOMPRESSED_FLAG: /* pass */ break; default: print_error("Unknown compressed flag 0x%02x\n", compressed_flag); goto cleanup; } /* read data length. */ length |= (getc_unlocked(infp) << 8); length |= (getc_unlocked(infp) << 0); /* read crc32c. */ crc32c |= (getc_unlocked(infp) << 24); crc32c |= (getc_unlocked(infp) << 16); crc32c |= (getc_unlocked(infp) << 8); crc32c |= (getc_unlocked(infp) << 0); /* check read error */ if (feof_unlocked(infp)) { print_error("Unexpected end of file.\n"); goto cleanup; } else if (ferror_unlocked(infp)) { print_error("Failed to read a file: %s\n", strerror(errno)); goto cleanup; } /* read data */ if (fread_unlocked(wb.c, length, 1, infp) != 1) { if (feof_unlocked(infp)) { print_error("Unexpected end of file\n"); } else { print_error("Failed to read a file: %s\n", strerror(errno)); } goto cleanup; } trace("read %ld bytes.\n", (long)(length)); if (compressed_flag == COMPRESSED_FLAG) { /* check the uncompressed length */ size_t uncompressed_length; err = snappy_uncompressed_length(wb.c, length, &uncompressed_length); if (err != 0) { print_error("Invalid data: GetUncompressedLength failed %d\n", err); goto cleanup; } err = 1; if (uncompressed_length > wb.uclen) { print_error("Invalid data: too long uncompressed length\n"); goto cleanup; } /* uncompress and write */ if (snappy_uncompress(wb.c, length, wb.uc, &uncompressed_length)) { print_error("Invalid data: RawUncompress failed\n"); goto cleanup; } if (check_and_write_block(outfd, wb.uc, uncompressed_length, 1, crc32c)) { goto cleanup; } } else { if (check_and_write_block(outfd, wb.c, length, 1, crc32c)) { goto cleanup; } } } cleanup: work_buffer_free(&wb); return err; }
static int do_test (void) { struct sigaction sa; sa.sa_handler = handler; sa.sa_flags = 0; sigemptyset (&sa.sa_mask); sigaction (SIGABRT, &sa, NULL); /* Avoid all the buffer overflow messages on stderr. */ int fd = open (_PATH_DEVNULL, O_WRONLY); if (fd == -1) close (STDERR_FILENO); else { dup2 (fd, STDERR_FILENO); close (fd); } setenv ("LIBC_FATAL_STDERR_", "1", 1); struct A { char buf1[9]; char buf2[1]; } a; struct wA { wchar_t buf1[9]; wchar_t buf2[1]; } wa; printf ("Test checking routines at fortify level %d\n", #ifdef __USE_FORTIFY_LEVEL (int) __USE_FORTIFY_LEVEL #else 0 #endif ); #if defined __USE_FORTIFY_LEVEL && !defined __fortify_function printf ("Test skipped"); if (l0 == 0) return 0; #endif /* These ops can be done without runtime checking of object size. */ memcpy (buf, "abcdefghij", 10); memmove (buf + 1, buf, 9); if (memcmp (buf, "aabcdefghi", 10)) FAIL (); if (mempcpy (buf + 5, "abcde", 5) != buf + 10 || memcmp (buf, "aabcdabcde", 10)) FAIL (); memset (buf + 8, 'j', 2); if (memcmp (buf, "aabcdabcjj", 10)) FAIL (); strcpy (buf + 4, "EDCBA"); if (memcmp (buf, "aabcEDCBA", 10)) FAIL (); if (stpcpy (buf + 8, "F") != buf + 9 || memcmp (buf, "aabcEDCBF", 10)) FAIL (); strncpy (buf + 6, "X", 4); if (memcmp (buf, "aabcEDX\0\0", 10)) FAIL (); if (sprintf (buf + 7, "%s", "67") != 2 || memcmp (buf, "aabcEDX67", 10)) FAIL (); if (snprintf (buf + 7, 3, "%s", "987654") != 6 || memcmp (buf, "aabcEDX98", 10)) FAIL (); /* These ops need runtime checking, but shouldn't __chk_fail. */ memcpy (buf, "abcdefghij", l0 + 10); memmove (buf + 1, buf, l0 + 9); if (memcmp (buf, "aabcdefghi", 10)) FAIL (); if (mempcpy (buf + 5, "abcde", l0 + 5) != buf + 10 || memcmp (buf, "aabcdabcde", 10)) FAIL (); memset (buf + 8, 'j', l0 + 2); if (memcmp (buf, "aabcdabcjj", 10)) FAIL (); strcpy (buf + 4, str1 + 5); if (memcmp (buf, "aabcEDCBA", 10)) FAIL (); if (stpcpy (buf + 8, str2) != buf + 9 || memcmp (buf, "aabcEDCBF", 10)) FAIL (); strncpy (buf + 6, "X", l0 + 4); if (memcmp (buf, "aabcEDX\0\0", 10)) FAIL (); if (stpncpy (buf + 5, "cd", l0 + 5) != buf + 7 || memcmp (buf, "aabcEcd\0\0", 10)) FAIL (); if (sprintf (buf + 7, "%d", num1) != 2 || memcmp (buf, "aabcEcd67", 10)) FAIL (); if (snprintf (buf + 7, 3, "%d", num2) != 6 || memcmp (buf, "aabcEcd98", 10)) FAIL (); buf[l0 + 8] = '\0'; strcat (buf, "A"); if (memcmp (buf, "aabcEcd9A", 10)) FAIL (); buf[l0 + 7] = '\0'; strncat (buf, "ZYXWV", l0 + 2); if (memcmp (buf, "aabcEcdZY", 10)) FAIL (); memcpy (a.buf1, "abcdefghij", l0 + 10); memmove (a.buf1 + 1, a.buf1, l0 + 9); if (memcmp (a.buf1, "aabcdefghi", 10)) FAIL (); if (mempcpy (a.buf1 + 5, "abcde", l0 + 5) != a.buf1 + 10 || memcmp (a.buf1, "aabcdabcde", 10)) FAIL (); memset (a.buf1 + 8, 'j', l0 + 2); if (memcmp (a.buf1, "aabcdabcjj", 10)) FAIL (); #if __USE_FORTIFY_LEVEL < 2 /* The following tests are supposed to crash with -D_FORTIFY_SOURCE=2 and sufficient GCC support, as the string operations overflow from a.buf1 into a.buf2. */ strcpy (a.buf1 + 4, str1 + 5); if (memcmp (a.buf1, "aabcEDCBA", 10)) FAIL (); if (stpcpy (a.buf1 + 8, str2) != a.buf1 + 9 || memcmp (a.buf1, "aabcEDCBF", 10)) FAIL (); strncpy (a.buf1 + 6, "X", l0 + 4); if (memcmp (a.buf1, "aabcEDX\0\0", 10)) FAIL (); if (sprintf (a.buf1 + 7, "%d", num1) != 2 || memcmp (a.buf1, "aabcEDX67", 10)) FAIL (); if (snprintf (a.buf1 + 7, 3, "%d", num2) != 6 || memcmp (a.buf1, "aabcEDX98", 10)) FAIL (); a.buf1[l0 + 8] = '\0'; strcat (a.buf1, "A"); if (memcmp (a.buf1, "aabcEDX9A", 10)) FAIL (); a.buf1[l0 + 7] = '\0'; strncat (a.buf1, "ZYXWV", l0 + 2); if (memcmp (a.buf1, "aabcEDXZY", 10)) FAIL (); #endif #if __USE_FORTIFY_LEVEL >= 1 /* Now check if all buffer overflows are caught at runtime. */ CHK_FAIL_START memcpy (buf + 1, "abcdefghij", l0 + 10); CHK_FAIL_END CHK_FAIL_START memmove (buf + 2, buf + 1, l0 + 9); CHK_FAIL_END CHK_FAIL_START p = (char *) mempcpy (buf + 6, "abcde", l0 + 5); CHK_FAIL_END CHK_FAIL_START memset (buf + 9, 'j', l0 + 2); CHK_FAIL_END CHK_FAIL_START strcpy (buf + 5, str1 + 5); CHK_FAIL_END CHK_FAIL_START p = stpcpy (buf + 9, str2); CHK_FAIL_END CHK_FAIL_START strncpy (buf + 7, "X", l0 + 4); CHK_FAIL_END CHK_FAIL_START stpncpy (buf + 6, "cd", l0 + 5); CHK_FAIL_END # if !defined __cplusplus || defined __va_arg_pack CHK_FAIL_START sprintf (buf + 8, "%d", num1); CHK_FAIL_END CHK_FAIL_START snprintf (buf + 8, l0 + 3, "%d", num2); CHK_FAIL_END CHK_FAIL_START swprintf (wbuf + 8, 3, L"%d", num1); CHK_FAIL_END CHK_FAIL_START swprintf (wbuf + 8, l0 + 3, L"%d", num1); CHK_FAIL_END # endif memcpy (buf, str1 + 2, l0 + 9); CHK_FAIL_START strcat (buf, "AB"); CHK_FAIL_END memcpy (buf, str1 + 3, l0 + 8); CHK_FAIL_START strncat (buf, "ZYXWV", l0 + 3); CHK_FAIL_END CHK_FAIL_START memcpy (a.buf1 + 1, "abcdefghij", l0 + 10); CHK_FAIL_END CHK_FAIL_START memmove (a.buf1 + 2, a.buf1 + 1, l0 + 9); CHK_FAIL_END CHK_FAIL_START p = (char *) mempcpy (a.buf1 + 6, "abcde", l0 + 5); CHK_FAIL_END CHK_FAIL_START memset (a.buf1 + 9, 'j', l0 + 2); CHK_FAIL_END # if __USE_FORTIFY_LEVEL >= 2 # define O 0 # else # define O 1 # endif CHK_FAIL_START strcpy (a.buf1 + (O + 4), str1 + 5); CHK_FAIL_END CHK_FAIL_START p = stpcpy (a.buf1 + (O + 8), str2); CHK_FAIL_END CHK_FAIL_START strncpy (a.buf1 + (O + 6), "X", l0 + 4); CHK_FAIL_END # if !defined __cplusplus || defined __va_arg_pack CHK_FAIL_START sprintf (a.buf1 + (O + 7), "%d", num1); CHK_FAIL_END CHK_FAIL_START snprintf (a.buf1 + (O + 7), l0 + 3, "%d", num2); CHK_FAIL_END # endif memcpy (a.buf1, str1 + (3 - O), l0 + 8 + O); CHK_FAIL_START strcat (a.buf1, "AB"); CHK_FAIL_END memcpy (a.buf1, str1 + (4 - O), l0 + 7 + O); CHK_FAIL_START strncat (a.buf1, "ZYXWV", l0 + 3); CHK_FAIL_END #endif /* These ops can be done without runtime checking of object size. */ wmemcpy (wbuf, L"abcdefghij", 10); wmemmove (wbuf + 1, wbuf, 9); if (wmemcmp (wbuf, L"aabcdefghi", 10)) FAIL (); if (wmempcpy (wbuf + 5, L"abcde", 5) != wbuf + 10 || wmemcmp (wbuf, L"aabcdabcde", 10)) FAIL (); wmemset (wbuf + 8, L'j', 2); if (wmemcmp (wbuf, L"aabcdabcjj", 10)) FAIL (); wcscpy (wbuf + 4, L"EDCBA"); if (wmemcmp (wbuf, L"aabcEDCBA", 10)) FAIL (); if (wcpcpy (wbuf + 8, L"F") != wbuf + 9 || wmemcmp (wbuf, L"aabcEDCBF", 10)) FAIL (); wcsncpy (wbuf + 6, L"X", 4); if (wmemcmp (wbuf, L"aabcEDX\0\0", 10)) FAIL (); if (swprintf (wbuf + 7, 3, L"%ls", L"987654") >= 0 || wmemcmp (wbuf, L"aabcEDX98", 10)) FAIL (); if (swprintf (wbuf + 7, 3, L"64") != 2 || wmemcmp (wbuf, L"aabcEDX64", 10)) FAIL (); /* These ops need runtime checking, but shouldn't __chk_fail. */ wmemcpy (wbuf, L"abcdefghij", l0 + 10); wmemmove (wbuf + 1, wbuf, l0 + 9); if (wmemcmp (wbuf, L"aabcdefghi", 10)) FAIL (); if (wmempcpy (wbuf + 5, L"abcde", l0 + 5) != wbuf + 10 || wmemcmp (wbuf, L"aabcdabcde", 10)) FAIL (); wmemset (wbuf + 8, L'j', l0 + 2); if (wmemcmp (wbuf, L"aabcdabcjj", 10)) FAIL (); wcscpy (wbuf + 4, wstr1 + 5); if (wmemcmp (wbuf, L"aabcEDCBA", 10)) FAIL (); if (wcpcpy (wbuf + 8, wstr2) != wbuf + 9 || wmemcmp (wbuf, L"aabcEDCBF", 10)) FAIL (); wcsncpy (wbuf + 6, L"X", l0 + 4); if (wmemcmp (wbuf, L"aabcEDX\0\0", 10)) FAIL (); if (wcpncpy (wbuf + 5, L"cd", l0 + 5) != wbuf + 7 || wmemcmp (wbuf, L"aabcEcd\0\0", 10)) FAIL (); if (swprintf (wbuf + 7, 3, L"%d", num2) >= 0 || wmemcmp (wbuf, L"aabcEcd98", 10)) FAIL (); wbuf[l0 + 8] = L'\0'; wcscat (wbuf, L"A"); if (wmemcmp (wbuf, L"aabcEcd9A", 10)) FAIL (); wbuf[l0 + 7] = L'\0'; wcsncat (wbuf, L"ZYXWV", l0 + 2); if (wmemcmp (wbuf, L"aabcEcdZY", 10)) FAIL (); wmemcpy (wa.buf1, L"abcdefghij", l0 + 10); wmemmove (wa.buf1 + 1, wa.buf1, l0 + 9); if (wmemcmp (wa.buf1, L"aabcdefghi", 10)) FAIL (); if (wmempcpy (wa.buf1 + 5, L"abcde", l0 + 5) != wa.buf1 + 10 || wmemcmp (wa.buf1, L"aabcdabcde", 10)) FAIL (); wmemset (wa.buf1 + 8, L'j', l0 + 2); if (wmemcmp (wa.buf1, L"aabcdabcjj", 10)) FAIL (); #if __USE_FORTIFY_LEVEL < 2 /* The following tests are supposed to crash with -D_FORTIFY_SOURCE=2 and sufficient GCC support, as the string operations overflow from a.buf1 into a.buf2. */ wcscpy (wa.buf1 + 4, wstr1 + 5); if (wmemcmp (wa.buf1, L"aabcEDCBA", 10)) FAIL (); if (wcpcpy (wa.buf1 + 8, wstr2) != wa.buf1 + 9 || wmemcmp (wa.buf1, L"aabcEDCBF", 10)) FAIL (); wcsncpy (wa.buf1 + 6, L"X", l0 + 4); if (wmemcmp (wa.buf1, L"aabcEDX\0\0", 10)) FAIL (); if (swprintf (wa.buf1 + 7, 3, L"%d", num2) >= 0 || wmemcmp (wa.buf1, L"aabcEDX98", 10)) FAIL (); wa.buf1[l0 + 8] = L'\0'; wcscat (wa.buf1, L"A"); if (wmemcmp (wa.buf1, L"aabcEDX9A", 10)) FAIL (); wa.buf1[l0 + 7] = L'\0'; wcsncat (wa.buf1, L"ZYXWV", l0 + 2); if (wmemcmp (wa.buf1, L"aabcEDXZY", 10)) FAIL (); #endif #if __USE_FORTIFY_LEVEL >= 1 /* Now check if all buffer overflows are caught at runtime. */ CHK_FAIL_START wmemcpy (wbuf + 1, L"abcdefghij", l0 + 10); CHK_FAIL_END CHK_FAIL_START wmemcpy (wbuf + 9, L"abcdefghij", l0 + 10); CHK_FAIL_END CHK_FAIL_START wmemmove (wbuf + 2, wbuf + 1, l0 + 9); CHK_FAIL_END CHK_FAIL_START wp = wmempcpy (wbuf + 6, L"abcde", l0 + 5); CHK_FAIL_END CHK_FAIL_START wmemset (wbuf + 9, L'j', l0 + 2); CHK_FAIL_END CHK_FAIL_START wcscpy (wbuf + 5, wstr1 + 5); CHK_FAIL_END CHK_FAIL_START wp = wcpcpy (wbuf + 9, wstr2); CHK_FAIL_END CHK_FAIL_START wcsncpy (wbuf + 7, L"X", l0 + 4); CHK_FAIL_END CHK_FAIL_START wcsncpy (wbuf + 9, L"XABCDEFGH", 8); CHK_FAIL_END CHK_FAIL_START wcpncpy (wbuf + 9, L"XABCDEFGH", 8); CHK_FAIL_END CHK_FAIL_START wcpncpy (wbuf + 6, L"cd", l0 + 5); CHK_FAIL_END wmemcpy (wbuf, wstr1 + 2, l0 + 9); CHK_FAIL_START wcscat (wbuf, L"AB"); CHK_FAIL_END wmemcpy (wbuf, wstr1 + 3, l0 + 8); CHK_FAIL_START wcsncat (wbuf, L"ZYXWV", l0 + 3); CHK_FAIL_END CHK_FAIL_START wmemcpy (wa.buf1 + 1, L"abcdefghij", l0 + 10); CHK_FAIL_END CHK_FAIL_START wmemmove (wa.buf1 + 2, wa.buf1 + 1, l0 + 9); CHK_FAIL_END CHK_FAIL_START wp = wmempcpy (wa.buf1 + 6, L"abcde", l0 + 5); CHK_FAIL_END CHK_FAIL_START wmemset (wa.buf1 + 9, L'j', l0 + 2); CHK_FAIL_END #if __USE_FORTIFY_LEVEL >= 2 # define O 0 #else # define O 1 #endif CHK_FAIL_START wcscpy (wa.buf1 + (O + 4), wstr1 + 5); CHK_FAIL_END CHK_FAIL_START wp = wcpcpy (wa.buf1 + (O + 8), wstr2); CHK_FAIL_END CHK_FAIL_START wcsncpy (wa.buf1 + (O + 6), L"X", l0 + 4); CHK_FAIL_END wmemcpy (wa.buf1, wstr1 + (3 - O), l0 + 8 + O); CHK_FAIL_START wcscat (wa.buf1, L"AB"); CHK_FAIL_END wmemcpy (wa.buf1, wstr1 + (4 - O), l0 + 7 + O); CHK_FAIL_START wcsncat (wa.buf1, L"ZYXWV", l0 + 3); CHK_FAIL_END #endif /* Now checks for %n protection. */ /* Constant literals passed directly are always ok (even with warnings about possible bugs from GCC). */ int n1, n2; if (sprintf (buf, "%s%n%s%n", str2, &n1, str2, &n2) != 2 || n1 != 1 || n2 != 2) FAIL (); /* In this case the format string is not known at compile time, but resides in read-only memory, so is ok. */ if (snprintf (buf, 4, str3, str2, &n1, str2, &n2) != 2 || n1 != 1 || n2 != 2) FAIL (); strcpy (buf2 + 2, "%n%s%n"); /* When the format string is writable and contains %n, with -D_FORTIFY_SOURCE=2 it causes __chk_fail. */ CHK_FAIL2_START if (sprintf (buf, buf2, str2, &n1, str2, &n1) != 2) FAIL (); CHK_FAIL2_END CHK_FAIL2_START if (snprintf (buf, 3, buf2, str2, &n1, str2, &n1) != 2) FAIL (); CHK_FAIL2_END /* But if there is no %n, even writable format string should work. */ buf2[6] = '\0'; if (sprintf (buf, buf2 + 4, str2) != 1) FAIL (); /* Constant literals passed directly are always ok (even with warnings about possible bugs from GCC). */ if (printf ("%s%n%s%n", str4, &n1, str5, &n2) != 14 || n1 != 7 || n2 != 14) FAIL (); /* In this case the format string is not known at compile time, but resides in read-only memory, so is ok. */ if (printf (str3, str4, &n1, str5, &n2) != 14 || n1 != 7 || n2 != 14) FAIL (); strcpy (buf2 + 2, "%n%s%n"); /* When the format string is writable and contains %n, with -D_FORTIFY_SOURCE=2 it causes __chk_fail. */ CHK_FAIL2_START if (printf (buf2, str4, &n1, str5, &n1) != 14) FAIL (); CHK_FAIL2_END /* But if there is no %n, even writable format string should work. */ buf2[6] = '\0'; if (printf (buf2 + 4, str5) != 7) FAIL (); FILE *fp = stdout; /* Constant literals passed directly are always ok (even with warnings about possible bugs from GCC). */ if (fprintf (fp, "%s%n%s%n", str4, &n1, str5, &n2) != 14 || n1 != 7 || n2 != 14) FAIL (); /* In this case the format string is not known at compile time, but resides in read-only memory, so is ok. */ if (fprintf (fp, str3, str4, &n1, str5, &n2) != 14 || n1 != 7 || n2 != 14) FAIL (); strcpy (buf2 + 2, "%n%s%n"); /* When the format string is writable and contains %n, with -D_FORTIFY_SOURCE=2 it causes __chk_fail. */ CHK_FAIL2_START if (fprintf (fp, buf2, str4, &n1, str5, &n1) != 14) FAIL (); CHK_FAIL2_END /* But if there is no %n, even writable format string should work. */ buf2[6] = '\0'; if (fprintf (fp, buf2 + 4, str5) != 7) FAIL (); char *my_ptr = NULL; strcpy (buf2 + 2, "%n%s%n"); /* When the format string is writable and contains %n, with -D_FORTIFY_SOURCE=2 it causes __chk_fail. */ CHK_FAIL2_START if (asprintf (&my_ptr, buf2, str4, &n1, str5, &n1) != 14) FAIL (); else free (my_ptr); CHK_FAIL2_END struct obstack obs; obstack_init (&obs); CHK_FAIL2_START if (obstack_printf (&obs, buf2, str4, &n1, str5, &n1) != 14) FAIL (); CHK_FAIL2_END obstack_free (&obs, NULL); my_ptr = NULL; if (asprintf (&my_ptr, "%s%n%s%n", str4, &n1, str5, &n1) != 14) FAIL (); else free (my_ptr); obstack_init (&obs); if (obstack_printf (&obs, "%s%n%s%n", str4, &n1, str5, &n1) != 14) FAIL (); obstack_free (&obs, NULL); if (freopen (temp_filename, "r", stdin) == NULL) { puts ("could not open temporary file"); exit (1); } if (gets (buf) != buf || memcmp (buf, "abcdefgh", 9)) FAIL (); if (gets (buf) != buf || memcmp (buf, "ABCDEFGHI", 10)) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START if (gets (buf) != buf) FAIL (); CHK_FAIL_END #endif rewind (stdin); if (fgets (buf, sizeof (buf), stdin) != buf || memcmp (buf, "abcdefgh\n", 10)) FAIL (); if (fgets (buf, sizeof (buf), stdin) != buf || memcmp (buf, "ABCDEFGHI", 10)) FAIL (); rewind (stdin); if (fgets (buf, l0 + sizeof (buf), stdin) != buf || memcmp (buf, "abcdefgh\n", 10)) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START if (fgets (buf, sizeof (buf) + 1, stdin) != buf) FAIL (); CHK_FAIL_END CHK_FAIL_START if (fgets (buf, l0 + sizeof (buf) + 1, stdin) != buf) FAIL (); CHK_FAIL_END #endif rewind (stdin); if (fgets_unlocked (buf, sizeof (buf), stdin) != buf || memcmp (buf, "abcdefgh\n", 10)) FAIL (); if (fgets_unlocked (buf, sizeof (buf), stdin) != buf || memcmp (buf, "ABCDEFGHI", 10)) FAIL (); rewind (stdin); if (fgets_unlocked (buf, l0 + sizeof (buf), stdin) != buf || memcmp (buf, "abcdefgh\n", 10)) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START if (fgets_unlocked (buf, sizeof (buf) + 1, stdin) != buf) FAIL (); CHK_FAIL_END CHK_FAIL_START if (fgets_unlocked (buf, l0 + sizeof (buf) + 1, stdin) != buf) FAIL (); CHK_FAIL_END #endif rewind (stdin); if (fread (buf, 1, sizeof (buf), stdin) != sizeof (buf) || memcmp (buf, "abcdefgh\nA", 10)) FAIL (); if (fread (buf, sizeof (buf), 1, stdin) != 1 || memcmp (buf, "BCDEFGHI\na", 10)) FAIL (); rewind (stdin); if (fread (buf, l0 + 1, sizeof (buf), stdin) != sizeof (buf) || memcmp (buf, "abcdefgh\nA", 10)) FAIL (); if (fread (buf, sizeof (buf), l0 + 1, stdin) != 1 || memcmp (buf, "BCDEFGHI\na", 10)) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START if (fread (buf, 1, sizeof (buf) + 1, stdin) != sizeof (buf) + 1) FAIL (); CHK_FAIL_END CHK_FAIL_START if (fread (buf, sizeof (buf) + 1, l0 + 1, stdin) != 1) FAIL (); CHK_FAIL_END #endif rewind (stdin); if (fread_unlocked (buf, 1, sizeof (buf), stdin) != sizeof (buf) || memcmp (buf, "abcdefgh\nA", 10)) FAIL (); if (fread_unlocked (buf, sizeof (buf), 1, stdin) != 1 || memcmp (buf, "BCDEFGHI\na", 10)) FAIL (); rewind (stdin); if (fread_unlocked (buf, 1, 4, stdin) != 4 || memcmp (buf, "abcdFGHI\na", 10)) FAIL (); if (fread_unlocked (buf, 4, 1, stdin) != 1 || memcmp (buf, "efghFGHI\na", 10)) FAIL (); rewind (stdin); if (fread_unlocked (buf, l0 + 1, sizeof (buf), stdin) != sizeof (buf) || memcmp (buf, "abcdefgh\nA", 10)) FAIL (); if (fread_unlocked (buf, sizeof (buf), l0 + 1, stdin) != 1 || memcmp (buf, "BCDEFGHI\na", 10)) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START if (fread_unlocked (buf, 1, sizeof (buf) + 1, stdin) != sizeof (buf) + 1) FAIL (); CHK_FAIL_END CHK_FAIL_START if (fread_unlocked (buf, sizeof (buf) + 1, l0 + 1, stdin) != 1) FAIL (); CHK_FAIL_END #endif lseek (fileno (stdin), 0, SEEK_SET); if (read (fileno (stdin), buf, sizeof (buf) - 1) != sizeof (buf) - 1 || memcmp (buf, "abcdefgh\n", 9)) FAIL (); if (read (fileno (stdin), buf, sizeof (buf) - 1) != sizeof (buf) - 1 || memcmp (buf, "ABCDEFGHI", 9)) FAIL (); lseek (fileno (stdin), 0, SEEK_SET); if (read (fileno (stdin), buf, l0 + sizeof (buf) - 1) != sizeof (buf) - 1 || memcmp (buf, "abcdefgh\n", 9)) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START if (read (fileno (stdin), buf, sizeof (buf) + 1) != sizeof (buf) + 1) FAIL (); CHK_FAIL_END #endif if (pread (fileno (stdin), buf, sizeof (buf) - 1, sizeof (buf) - 2) != sizeof (buf) - 1 || memcmp (buf, "\nABCDEFGH", 9)) FAIL (); if (pread (fileno (stdin), buf, sizeof (buf) - 1, 0) != sizeof (buf) - 1 || memcmp (buf, "abcdefgh\n", 9)) FAIL (); if (pread (fileno (stdin), buf, l0 + sizeof (buf) - 1, sizeof (buf) - 3) != sizeof (buf) - 1 || memcmp (buf, "h\nABCDEFG", 9)) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START if (pread (fileno (stdin), buf, sizeof (buf) + 1, 2 * sizeof (buf)) != sizeof (buf) + 1) FAIL (); CHK_FAIL_END #endif if (pread64 (fileno (stdin), buf, sizeof (buf) - 1, sizeof (buf) - 2) != sizeof (buf) - 1 || memcmp (buf, "\nABCDEFGH", 9)) FAIL (); if (pread64 (fileno (stdin), buf, sizeof (buf) - 1, 0) != sizeof (buf) - 1 || memcmp (buf, "abcdefgh\n", 9)) FAIL (); if (pread64 (fileno (stdin), buf, l0 + sizeof (buf) - 1, sizeof (buf) - 3) != sizeof (buf) - 1 || memcmp (buf, "h\nABCDEFG", 9)) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START if (pread64 (fileno (stdin), buf, sizeof (buf) + 1, 2 * sizeof (buf)) != sizeof (buf) + 1) FAIL (); CHK_FAIL_END #endif if (freopen (temp_filename, "r", stdin) == NULL) { puts ("could not open temporary file"); exit (1); } if (fseek (stdin, 9 + 10 + 11, SEEK_SET)) { puts ("could not seek in test file"); exit (1); } #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START if (gets (buf) != buf) FAIL (); CHK_FAIL_END #endif /* Check whether missing N$ formats are detected. */ CHK_FAIL2_START printf ("%3$d\n", 1, 2, 3, 4); CHK_FAIL2_END CHK_FAIL2_START fprintf (stdout, "%3$d\n", 1, 2, 3, 4); CHK_FAIL2_END CHK_FAIL2_START sprintf (buf, "%3$d\n", 1, 2, 3, 4); CHK_FAIL2_END CHK_FAIL2_START snprintf (buf, sizeof (buf), "%3$d\n", 1, 2, 3, 4); CHK_FAIL2_END int sp[2]; if (socketpair (PF_UNIX, SOCK_STREAM, 0, sp)) FAIL (); else { const char *sendstr = "abcdefgh\nABCDEFGH\n0123456789\n"; if ((size_t) send (sp[0], sendstr, strlen (sendstr), 0) != strlen (sendstr)) FAIL (); char recvbuf[12]; if (recv (sp[1], recvbuf, sizeof recvbuf, MSG_PEEK) != sizeof recvbuf || memcmp (recvbuf, sendstr, sizeof recvbuf) != 0) FAIL (); if (recv (sp[1], recvbuf + 6, l0 + sizeof recvbuf - 7, MSG_PEEK) != sizeof recvbuf - 7 || memcmp (recvbuf + 6, sendstr, sizeof recvbuf - 7) != 0) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START if (recv (sp[1], recvbuf + 1, sizeof recvbuf, MSG_PEEK) != sizeof recvbuf) FAIL (); CHK_FAIL_END CHK_FAIL_START if (recv (sp[1], recvbuf + 4, l0 + sizeof recvbuf - 3, MSG_PEEK) != sizeof recvbuf - 3) FAIL (); CHK_FAIL_END #endif socklen_t sl; struct sockaddr_un sa_un; sl = sizeof (sa_un); if (recvfrom (sp[1], recvbuf, sizeof recvbuf, MSG_PEEK, (struct sockaddr *) &sa_un, &sl) != sizeof recvbuf || memcmp (recvbuf, sendstr, sizeof recvbuf) != 0) FAIL (); sl = sizeof (sa_un); if (recvfrom (sp[1], recvbuf + 6, l0 + sizeof recvbuf - 7, MSG_PEEK, (struct sockaddr *) &sa_un, &sl) != sizeof recvbuf - 7 || memcmp (recvbuf + 6, sendstr, sizeof recvbuf - 7) != 0) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START sl = sizeof (sa_un); if (recvfrom (sp[1], recvbuf + 1, sizeof recvbuf, MSG_PEEK, (struct sockaddr *) &sa_un, &sl) != sizeof recvbuf) FAIL (); CHK_FAIL_END CHK_FAIL_START sl = sizeof (sa_un); if (recvfrom (sp[1], recvbuf + 4, l0 + sizeof recvbuf - 3, MSG_PEEK, (struct sockaddr *) &sa_un, &sl) != sizeof recvbuf - 3) FAIL (); CHK_FAIL_END #endif close (sp[0]); close (sp[1]); } char fname[] = "/tmp/tst-chk1-dir-XXXXXX\0foo"; char *enddir = strchr (fname, '\0'); if (mkdtemp (fname) == NULL) { printf ("mkdtemp failed: %m\n"); return 1; } *enddir = '/'; if (symlink ("bar", fname) != 0) FAIL (); char readlinkbuf[4]; if (readlink (fname, readlinkbuf, 4) != 3 || memcmp (readlinkbuf, "bar", 3) != 0) FAIL (); if (readlink (fname, readlinkbuf + 1, l0 + 3) != 3 || memcmp (readlinkbuf, "bbar", 4) != 0) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START if (readlink (fname, readlinkbuf + 2, l0 + 3) != 3) FAIL (); CHK_FAIL_END CHK_FAIL_START if (readlink (fname, readlinkbuf + 3, 4) != 3) FAIL (); CHK_FAIL_END #endif int tmpfd = open ("/tmp", O_RDONLY | O_DIRECTORY); if (tmpfd < 0) FAIL (); if (readlinkat (tmpfd, fname + sizeof ("/tmp/") - 1, readlinkbuf, 4) != 3 || memcmp (readlinkbuf, "bar", 3) != 0) FAIL (); if (readlinkat (tmpfd, fname + sizeof ("/tmp/") - 1, readlinkbuf + 1, l0 + 3) != 3 || memcmp (readlinkbuf, "bbar", 4) != 0) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START if (readlinkat (tmpfd, fname + sizeof ("/tmp/") - 1, readlinkbuf + 2, l0 + 3) != 3) FAIL (); CHK_FAIL_END CHK_FAIL_START if (readlinkat (tmpfd, fname + sizeof ("/tmp/") - 1, readlinkbuf + 3, 4) != 3) FAIL (); CHK_FAIL_END #endif close (tmpfd); char *cwd1 = getcwd (NULL, 0); if (cwd1 == NULL) FAIL (); char *cwd2 = getcwd (NULL, 250); if (cwd2 == NULL) FAIL (); if (cwd1 && cwd2) { if (strcmp (cwd1, cwd2) != 0) FAIL (); *enddir = '\0'; if (chdir (fname)) FAIL (); char *cwd3 = getcwd (NULL, 0); if (cwd3 == NULL) FAIL (); if (strcmp (fname, cwd3) != 0) printf ("getcwd after chdir is '%s' != '%s'," "get{c,}wd tests skipped\n", cwd3, fname); else { char getcwdbuf[sizeof fname - 3]; char *cwd4 = getcwd (getcwdbuf, sizeof getcwdbuf); if (cwd4 != getcwdbuf || strcmp (getcwdbuf, fname) != 0) FAIL (); cwd4 = getcwd (getcwdbuf + 1, l0 + sizeof getcwdbuf - 1); if (cwd4 != getcwdbuf + 1 || getcwdbuf[0] != fname[0] || strcmp (getcwdbuf + 1, fname) != 0) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START if (getcwd (getcwdbuf + 2, l0 + sizeof getcwdbuf) != getcwdbuf + 2) FAIL (); CHK_FAIL_END CHK_FAIL_START if (getcwd (getcwdbuf + 2, sizeof getcwdbuf) != getcwdbuf + 2) FAIL (); CHK_FAIL_END #endif if (getwd (getcwdbuf) != getcwdbuf || strcmp (getcwdbuf, fname) != 0) FAIL (); if (getwd (getcwdbuf + 1) != getcwdbuf + 1 || strcmp (getcwdbuf + 1, fname) != 0) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START if (getwd (getcwdbuf + 2) != getcwdbuf + 2) FAIL (); CHK_FAIL_END #endif } if (chdir (cwd1) != 0) FAIL (); free (cwd3); } free (cwd1); free (cwd2); *enddir = '/'; if (unlink (fname) != 0) FAIL (); *enddir = '\0'; if (rmdir (fname) != 0) FAIL (); #if PATH_MAX > 0 char largebuf[PATH_MAX]; char *realres = realpath (".", largebuf); if (realres != largebuf) FAIL (); # if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START char realbuf[1]; realres = realpath (".", realbuf); if (realres != realbuf) FAIL (); CHK_FAIL_END # endif #endif if (setlocale (LC_ALL, "de_DE.UTF-8") != NULL) { assert (MB_CUR_MAX <= 10); /* First a simple test. */ char enough[10]; if (wctomb (enough, L'A') != 1) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 /* We know the wchar_t encoding is ISO 10646. So pick a character which has a multibyte representation which does not fit. */ CHK_FAIL_START char smallbuf[2]; if (wctomb (smallbuf, L'\x100') != 2) FAIL (); CHK_FAIL_END #endif mbstate_t s; memset (&s, '\0', sizeof (s)); if (wcrtomb (enough, L'D', &s) != 1 || enough[0] != 'D') FAIL (); #if __USE_FORTIFY_LEVEL >= 1 /* We know the wchar_t encoding is ISO 10646. So pick a character which has a multibyte representation which does not fit. */ CHK_FAIL_START char smallbuf[2]; if (wcrtomb (smallbuf, L'\x100', &s) != 2) FAIL (); CHK_FAIL_END #endif wchar_t wenough[10]; memset (&s, '\0', sizeof (s)); const char *cp = "A"; if (mbsrtowcs (wenough, &cp, 10, &s) != 1 || wcscmp (wenough, L"A") != 0) FAIL (); cp = "BC"; if (mbsrtowcs (wenough, &cp, l0 + 10, &s) != 2 || wcscmp (wenough, L"BC") != 0) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START wchar_t wsmallbuf[2]; cp = "ABC"; mbsrtowcs (wsmallbuf, &cp, 10, &s); CHK_FAIL_END #endif cp = "A"; if (mbstowcs (wenough, cp, 10) != 1 || wcscmp (wenough, L"A") != 0) FAIL (); cp = "DEF"; if (mbstowcs (wenough, cp, l0 + 10) != 3 || wcscmp (wenough, L"DEF") != 0) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START wchar_t wsmallbuf[2]; cp = "ABC"; mbstowcs (wsmallbuf, cp, 10); CHK_FAIL_END #endif memset (&s, '\0', sizeof (s)); cp = "ABC"; wcscpy (wenough, L"DEF"); if (mbsnrtowcs (wenough, &cp, 1, 10, &s) != 1 || wcscmp (wenough, L"AEF") != 0) FAIL (); cp = "IJ"; if (mbsnrtowcs (wenough, &cp, 1, l0 + 10, &s) != 1 || wcscmp (wenough, L"IEF") != 0) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START wchar_t wsmallbuf[2]; cp = "ABC"; mbsnrtowcs (wsmallbuf, &cp, 3, 10, &s); CHK_FAIL_END #endif memset (&s, '\0', sizeof (s)); const wchar_t *wcp = L"A"; if (wcsrtombs (enough, &wcp, 10, &s) != 1 || strcmp (enough, "A") != 0) FAIL (); wcp = L"BC"; if (wcsrtombs (enough, &wcp, l0 + 10, &s) != 2 || strcmp (enough, "BC") != 0) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START char smallbuf[2]; wcp = L"ABC"; wcsrtombs (smallbuf, &wcp, 10, &s); CHK_FAIL_END #endif memset (enough, 'Z', sizeof (enough)); wcp = L"EF"; if (wcstombs (enough, wcp, 10) != 2 || strcmp (enough, "EF") != 0) FAIL (); wcp = L"G"; if (wcstombs (enough, wcp, l0 + 10) != 1 || strcmp (enough, "G") != 0) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START char smallbuf[2]; wcp = L"ABC"; wcstombs (smallbuf, wcp, 10); CHK_FAIL_END #endif memset (&s, '\0', sizeof (s)); wcp = L"AB"; if (wcsnrtombs (enough, &wcp, 1, 10, &s) != 1 || strcmp (enough, "A") != 0) FAIL (); wcp = L"BCD"; if (wcsnrtombs (enough, &wcp, 1, l0 + 10, &s) != 1 || strcmp (enough, "B") != 0) FAIL (); #if __USE_FORTIFY_LEVEL >= 1 CHK_FAIL_START char smallbuf[2]; wcp = L"ABC"; wcsnrtombs (smallbuf, &wcp, 3, 10, &s); CHK_FAIL_END #endif }
static int snappy_java_uncompress(FILE *infp, FILE *outfp, int skip_magic) { snappy_java_header_t header; work_buffer_t wb; int err = 1; int outfd; wb.c = NULL; wb.uc = NULL; if (skip_magic) { /* read header except magic */ if (fread_unlocked(&header.version, sizeof(header) - sizeof(header.magic), 1, infp) != 1) { print_error("Failed to read a file: %s\n", strerror(errno)); goto cleanup; } } else { /* read header */ if (fread_unlocked(&header, sizeof(header), 1, infp) != 1) { print_error("Failed to read a file: %s\n", strerror(errno)); goto cleanup; } /* check magic */ if (memcmp(header.magic, SNAPPY_JAVA_MAGIC, SNAPPY_JAVA_MAGIC_LEN) != 0) { print_error("This is not a snappy-java file.\n"); goto cleanup; } } /* check rest header */ header.version = ntohl(header.version); if (header.version != SNAPPY_JAVA_FILE_VERSION) { print_error("Unknown snappy-java version %d\n", header.version); goto cleanup; } header.compatible_version = ntohl(header.compatible_version); if (header.compatible_version != SNAPPY_JAVA_FILE_VERSION) { print_error("Unknown snappy-java compatible version %d\n", header.compatible_version); goto cleanup; } /* Use a file descriptor 'outfd' instead of the stdio file pointer 'outfp' * to reduce the number of write system calls. */ fflush(outfp); outfd = fileno(outfp); /* read body */ work_buffer_init(&wb, DEFAULT_BLOCK_SIZE); for (;;) { /* read the compressed length in a block */ size_t compressed_length = 0; size_t uncompressed_length = wb.uclen; int idx; for (idx = 3; idx >= 0; idx--) { int chr = getc_unlocked(infp); if (chr == -1) { if (idx == 3) { /* read all blocks */ err = 0; goto cleanup; } print_error("Unexpected end of file.\n"); goto cleanup; } compressed_length |= (chr << (idx * 8)); } trace("read 4 bytes (compressed_length = %ld)\n", (long)compressed_length); if (compressed_length == 0) { print_error("Invalid compressed length %ld\n", (long)compressed_length); goto cleanup; } if (compressed_length > wb.clen) { work_buffer_resize(&wb, compressed_length, 0); } /* read the compressed data */ if (fread_unlocked(wb.c, compressed_length, 1, infp) != 1) { if (feof_unlocked(infp)) { print_error("Unexpected end of file\n"); } else { print_error("Failed to read a file: %s\n", strerror(errno)); } goto cleanup; } trace("read %ld bytes.\n", (long)(compressed_length)); /* check the uncompressed length */ err = snappy_uncompressed_length(wb.c, compressed_length, &uncompressed_length); if (err != 0) { print_error("Invalid data: GetUncompressedLength failed %d\n", err); goto cleanup; } err = 1; if (uncompressed_length > wb.uclen) { work_buffer_resize(&wb, 0, uncompressed_length); } /* uncompress and write */ if (snappy_uncompress(wb.c, compressed_length, wb.uc, &uncompressed_length)) { print_error("Invalid data: RawUncompress failed\n"); goto cleanup; } if (write_full(outfd, wb.uc, uncompressed_length) != uncompressed_length) { print_error("Failed to write a file: %s\n", strerror(errno)); goto cleanup; } trace("write %ld bytes\n", (long)uncompressed_length); } cleanup: work_buffer_free(&wb); return err; }