Rizin
unix-like reverse engineering framework and cli tools
zip_file_get_offset.c File Reference
#include <stdio.h>
#include <string.h>
#include "zipint.h"

Go to the source code of this file.

Functions

zip_uint64_t _zip_file_get_offset (const zip_t *za, zip_uint64_t idx, zip_error_t *error)
 
zip_uint64_t _zip_file_get_end (const zip_t *za, zip_uint64_t index, zip_error_t *error)
 

Function Documentation

◆ _zip_file_get_end()

zip_uint64_t _zip_file_get_end ( const zip_t za,
zip_uint64_t  index,
zip_error_t error 
)

Definition at line 77 of file zip_file_get_offset.c.

77  {
80 
81  if ((offset = _zip_file_get_offset(za, index, error)) == 0) {
82  return 0;
83  }
84 
85  entry = za->entry[index].orig;
86 
87  if (offset + entry->comp_size < offset || offset + entry->comp_size > ZIP_INT64_MAX) {
89  return 0;
90  }
91  offset += entry->comp_size;
92 
93  if (entry->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) {
94  zip_uint8_t buf[4];
97  return 0;
98  }
99  if (zip_source_read(za->src, buf, 4) != 4) {
101  return 0;
102  }
103  if (memcmp(buf, DATADES_MAGIC, 4) == 0) {
104  offset += 4;
105  }
106  offset += 12;
107  if (_zip_dirent_needs_zip64(entry, 0)) {
108  offset += 8;
109  }
110  if (offset > ZIP_INT64_MAX) {
112  return 0;
113  }
114  }
115 
116  return offset;
117 }
voidpf uLong offset
Definition: ioapi.h:144
voidpf void * buf
Definition: ioapi.h:138
ZIP_EXTERN void zip_error_set(zip_error_t *_Nullable, int, int)
Definition: zip_error.c:126
#define ZIP_ER_SEEK
Definition: zip.h:109
ZIP_EXTERN zip_int64_t zip_source_read(zip_source_t *_Nonnull, void *_Nonnull, zip_uint64_t)
ZIP_EXTERN int zip_source_seek(zip_source_t *_Nonnull, zip_int64_t, int)
#define EFBIG
Definition: sftypes.h:137
Definition: zipcmp.c:77
zip_dirent_t * orig
Definition: zipint.h:409
zip_source_t * src
Definition: zipint.h:279
zip_entry_t * entry
Definition: zipint.h:294
void error(const char *msg)
Definition: untgz.c:593
#define SEEK_SET
Definition: zip.c:88
bool _zip_dirent_needs_zip64(const zip_dirent_t *de, zip_flags_t flags)
Definition: zip_dirent.c:296
void _zip_error_set_from_source(zip_error_t *err, zip_source_t *src)
Definition: zip_error.c:135
zip_uint64_t _zip_file_get_offset(const zip_t *za, zip_uint64_t idx, zip_error_t *error)
uint64_t zip_uint64_t
Definition: zipconf.h:39
uint8_t zip_uint8_t
Definition: zipconf.h:33
#define ZIP_INT64_MAX
Definition: zipconf.h:54
int64_t zip_int64_t
Definition: zipconf.h:38
#define DATADES_MAGIC
Definition: zipint.h:54
#define ZIP_GPBF_DATA_DESCRIPTOR
Definition: zipint.h:237
zip_t * za
Definition: ziptool.c:79

References _zip_dirent_needs_zip64(), _zip_error_set_from_source(), _zip_file_get_offset(), DATADES_MAGIC, EFBIG, zip::entry, error(), zip_entry::orig, SEEK_SET, zip::src, za, ZIP_ER_SEEK, zip_error_set(), ZIP_GPBF_DATA_DESCRIPTOR, ZIP_INT64_MAX, zip_source_read(), and zip_source_seek().

Referenced by zip_close().

◆ _zip_file_get_offset()

zip_uint64_t _zip_file_get_offset ( const zip_t za,
zip_uint64_t  idx,
zip_error_t error 
)

Definition at line 48 of file zip_file_get_offset.c.

48  {
51 
52  if (za->entry[idx].orig == NULL) {
54  return 0;
55  }
56 
58 
61  return 0;
62  }
63 
64  /* TODO: cache? */
65  if ((size = _zip_dirent_size(za->src, ZIP_EF_LOCAL, error)) < 0)
66  return 0;
67 
70  return 0;
71  }
72 
73  return offset + (zip_uint32_t)size;
74 }
#define NULL
Definition: cris-opc.c:27
voidpf void uLong size
Definition: ioapi.h:138
#define ZIP_ER_INTERNAL
Definition: zip.h:125
int idx
Definition: setup.py:197
zip_uint64_t offset
Definition: zipint.h:347
zip_int32_t _zip_dirent_size(zip_source_t *src, zip_uint16_t flags, zip_error_t *error)
Definition: zip_dirent.c:721
uint32_t zip_uint32_t
Definition: zipconf.h:37
int32_t zip_int32_t
Definition: zipconf.h:36
#define ZIP_EF_LOCAL
Definition: zipint.h:243

References _zip_dirent_size(), _zip_error_set_from_source(), EFBIG, zip::entry, error(), setup::idx, NULL, zip_dirent::offset, zip_entry::orig, SEEK_SET, zip::src, za, ZIP_EF_LOCAL, ZIP_ER_INTERNAL, ZIP_ER_SEEK, zip_error_set(), ZIP_INT64_MAX, and zip_source_seek().

Referenced by _zip_file_get_end(), window_read(), and zip_close().