static void decd_siz(ub4 *csize, ub4 *usize, ub2 *fnlen, ub2 *eflen, ub2 *flags, ub2 *method, ub1 *file_header) { *csize = UNPACK_UB4(file_header, LOC_CSIZE); #ifdef DEBUG printf("Compressed size is %u\n", *csize); #endif *usize = UNPACK_UB4(file_header, LOC_USIZE); #ifdef DEBUG printf("Uncompressed size is %u\n", *usize); #endif *fnlen = UNPACK_UB2(file_header, LOC_FNLEN); #ifdef DEBUG printf("Filename length is %hu\n", *fnlen); #endif *eflen = UNPACK_UB2(file_header, LOC_EFLEN); #ifdef DEBUG printf("Extra field length is %hu\n", *eflen); #endif *flags = UNPACK_UB2(file_header, LOC_EXTRA); #ifdef DEBUG printf("Flags are %#hx\n", *flags); #endif *method = UNPACK_UB2(file_header, LOC_COMP); #ifdef DEBUG printf("Compression method is %#hx\n", *method); #endif }
GByteArray *JarFile::get_next_file_contents() { guint8 *bytes; GByteArray *gba = g_byte_array_new(); read_signature(); //get compressed size bytes = (guint8 *)g_malloc(sizeof(guint8) * 30); if (!read(bytes+4, 26)) { g_free(bytes); return NULL; } guint32 compressed_size = UNPACK_UB4(bytes, LOC_CSIZE); guint16 filename_length = UNPACK_UB2(bytes, LOC_FNLEN); guint16 eflen = UNPACK_UB2(bytes, LOC_EFLEN); guint16 flags = UNPACK_UB2(bytes, LOC_EXTRA); guint16 method = UNPACK_UB2(bytes, LOC_COMP); if (filename_length == 0) { g_byte_array_free(gba, TRUE); if (_last_filename != NULL) g_free(_last_filename); _last_filename = NULL; g_free(bytes); return NULL; } #ifdef DEBUG std::printf("Compressed size is %u\n", compressed_size); std::printf("Filename length is %hu\n", filename_length); std::printf("Extra field length is %hu\n", eflen); std::printf("Flags are %#hx\n", flags); std::printf("Compression method is %#hx\n", method); #endif guint32 crc = get_crc(bytes, flags); gchar *filename = (gchar *)read_filename(filename_length); g_free(bytes); if (filename == NULL) return NULL; if (_last_filename != NULL) g_free(_last_filename); _last_filename = filename; //check if this is a directory and skip char *c_ptr; if ((c_ptr = std::strrchr(filename, '/')) != NULL) { if (*(++c_ptr) == '\0') { return NULL; } } if (!check_compression_method(method, flags)) { std::fprintf(stderr, "error in jar file\n"); return NULL; } if (method == 8 || flags & 0x0008) { unsigned int file_length = 0;//uncompressed file length lseek(fd, eflen, SEEK_CUR); guint8 *file_data = get_compressed_file(compressed_size, file_length, crc, flags); if (file_data == NULL) { g_byte_array_free(gba, FALSE); return NULL; } g_byte_array_append(gba, file_data, file_length); } else if (method == 0) { guint8 *file_data = get_uncompressed_file(compressed_size, crc, eflen, flags); if (file_data == NULL) { g_byte_array_free(gba, TRUE); return NULL; } g_byte_array_append(gba, file_data, compressed_size); } else { lseek(fd, compressed_size+eflen, SEEK_CUR); g_byte_array_free(gba, FALSE); return NULL; } return gba; }