Skip to content

Commit 67f2160

Browse files
committed
reader: make offset uint64_t instead of platform dependend sqsh_index_t
1 parent e282d24 commit 67f2160

File tree

18 files changed

+111
-39
lines changed

18 files changed

+111
-39
lines changed

common/include/sqsh_reader_private.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ extern "C" {
4848

4949
struct SqshReaderIteratorImpl {
5050
bool (*next)(void *iterator, size_t desired_size, int *err);
51-
int (*skip)(void *iterator, sqsh_index_t *offset, size_t desired_size);
51+
int (*skip)(void *iterator, uint64_t *offset, size_t desired_size);
5252
const uint8_t *(*data)(const void *iterator);
5353
size_t (*size)(const void *iterator);
5454
};
@@ -151,8 +151,8 @@ SQSH_NO_EXPORT SQSH_NO_UNUSED int sqsh__reader_init(
151151
*
152152
* @return 0 on success, less than zero on error.
153153
*/
154-
SQSH_NO_EXPORT SQSH_NO_UNUSED int sqsh__reader_advance(
155-
struct SqshReader *reader, sqsh_index_t offset, size_t size);
154+
SQSH_NO_EXPORT SQSH_NO_UNUSED int
155+
sqsh__reader_advance(struct SqshReader *reader, uint64_t offset, size_t size);
156156

157157
/**
158158
* @internal

common/src/reader/reader.c

+6-7
Original file line numberDiff line numberDiff line change
@@ -119,15 +119,15 @@ reader_fill_buffer(struct SqshReader *reader, size_t size) {
119119
}
120120

121121
static int
122-
handle_buffered(struct SqshReader *reader, sqsh_index_t offset, size_t size) {
122+
handle_buffered(struct SqshReader *reader, uint64_t offset, size_t size) {
123123
int rv = 0;
124124
struct CxBuffer new_buffer = {0};
125125
sqsh_index_t iterator_offset = reader->iterator_offset;
126126

127127
struct CxBuffer *buffer = &reader->buffer;
128128
const uint8_t *buffer_data = cx_buffer_data(buffer);
129129
size_t buffer_size = cx_buffer_size(buffer);
130-
const size_t copy_size = buffer_size - offset;
130+
const size_t copy_size = buffer_size - (size_t)offset;
131131

132132
if (offset != 0) {
133133
rv = cx_buffer_init(&new_buffer);
@@ -152,7 +152,7 @@ handle_buffered(struct SqshReader *reader, sqsh_index_t offset, size_t size) {
152152
}
153153

154154
static int
155-
handle_mapped(struct SqshReader *reader, sqsh_index_t offset, size_t size) {
155+
handle_mapped(struct SqshReader *reader, uint64_t offset, size_t size) {
156156
int rv = 0;
157157
void *iterator = reader->iterator;
158158
const struct SqshReaderIteratorImpl *impl = reader->iterator_impl;
@@ -168,8 +168,8 @@ handle_mapped(struct SqshReader *reader, sqsh_index_t offset, size_t size) {
168168
}
169169
reader->iterator_size = impl->size(iterator);
170170

171-
reader->offset = offset;
172-
sqsh_index_t end_offset;
171+
reader->offset = (size_t)offset;
172+
size_t end_offset;
173173
if (SQSH_ADD_OVERFLOW(offset, size, &end_offset)) {
174174
rv = -SQSH_ERROR_INTEGER_OVERFLOW;
175175
goto out;
@@ -189,8 +189,7 @@ handle_mapped(struct SqshReader *reader, sqsh_index_t offset, size_t size) {
189189
}
190190

191191
int
192-
sqsh__reader_advance(
193-
struct SqshReader *reader, sqsh_index_t offset, size_t size) {
192+
sqsh__reader_advance(struct SqshReader *reader, uint64_t offset, size_t size) {
194193
if (offset >= reader->iterator_offset) {
195194
offset -= reader->iterator_offset;
196195
reader->iterator_offset = 0;

doc/guide.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ struct SqshFile *file = sqsh_open(archive, "/path/to/file.txt", &err);
9696
assert(err == 0);
9797
struct SqshFileReader *reader = sqsh_file_reader_new(file, &err);
9898
assert(err == 0);
99-
err = sqsh_file_reader_advance(reader, 0, 10);
99+
err = sqsh_file_reader_advance2(reader, 0, 10);
100100
assert(err == 0);
101101

102102
const uint8_t *data = sqsh_file_reader_data(reader);

fuzzer/simple.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ read_file(const struct SqshTreeTraversal *traversal) {
3636
if (chunk_size > size) {
3737
chunk_size = size;
3838
}
39-
rv = sqsh_file_reader_advance(file, advance, chunk_size);
39+
rv = sqsh_file_reader_advance2(file, advance, chunk_size);
4040
if (rv < 0) {
4141
goto out;
4242
}

include/sqsh_file.h

+60-2
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ struct SqshFileReader *
6666
sqsh_file_reader_new(const struct SqshFile *file, int *err);
6767

6868
/**
69+
* @deprecated Since 1.5.0. Use sqsh_file_reader_advance2() instead.
6970
* @brief Advances the file reader by a certain amount of data and presents
7071
* `size` bytes of data to the user.
7172
* @memberof SqshFileReader
@@ -76,9 +77,25 @@ sqsh_file_reader_new(const struct SqshFile *file, int *err);
7677
*
7778
* @return 0 on success, less than 0 on error.
7879
*/
79-
int sqsh_file_reader_advance(
80+
__attribute__((deprecated(
81+
"Since 1.5.0. Use sqsh_file_reader_advance2() instead."))) int
82+
sqsh_file_reader_advance(
8083
struct SqshFileReader *reader, sqsh_index_t offset, size_t size);
8184

85+
/**
86+
* @brief Advances the file reader by a certain amount of data and presents
87+
* `size` bytes of data to the user.
88+
* @memberof SqshFileReader
89+
*
90+
* @param[in,out] reader The file reader to skip data in.
91+
* @param[in] offset The offset to skip.
92+
* @param[in] size The size of the data to skip.
93+
*
94+
* @return 0 on success, less than 0 on error.
95+
*/
96+
int sqsh_file_reader_advance2(
97+
struct SqshFileReader *reader, uint64_t offset, size_t size);
98+
8299
/**
83100
* @brief Gets a pointer to the current data in the file reader.
84101
* @memberof SqshFileReader
@@ -145,6 +162,7 @@ SQSH_NO_UNUSED bool sqsh_file_iterator_next(
145162
struct SqshFileIterator *iterator, size_t desired_size, int *err);
146163

147164
/**
165+
* @deprecated Since 1.5.0. Use sqsh_file_iterator_skip2() instead.
148166
* @memberof SqshFileIterator
149167
* @brief Skips blocks until the block containing the offset is reached.
150168
* Note that calling this function will invalidate the data pointer returned by
@@ -177,10 +195,50 @@ SQSH_NO_UNUSED bool sqsh_file_iterator_next(
177195
*
178196
* @return 0 on success, less than 0 on error.
179197
*/
180-
SQSH_NO_UNUSED int sqsh_file_iterator_skip(
198+
__attribute__((
199+
deprecated("Since 1.5.0. Use sqsh_file_iterator_skip2() instead.")))
200+
SQSH_NO_UNUSED int
201+
sqsh_file_iterator_skip(
181202
struct SqshFileIterator *iterator, sqsh_index_t *offset,
182203
size_t desired_size);
183204

205+
/**
206+
* @memberof SqshFileIterator
207+
* @brief Skips blocks until the block containing the offset is reached.
208+
* Note that calling this function will invalidate the data pointer returned by
209+
* sqsh_file_iterator_data().
210+
*
211+
* The offset is relative to the beginning of the current block or, if the
212+
* iterator hasn't been forwarded with previous calls to
213+
* sqsh_file_iterator_skip() or sqsh_file_iterator_next() the beginning of the
214+
* first block.
215+
*
216+
* After calling this function `offset` is updated to the same position relative
217+
* to the new block. See this visualisation:
218+
*
219+
* ```
220+
* current_block: |<--- block 8000 --->|
221+
* offset = 10000 --^
222+
* --> sqsh_file_iterator_skip(i, &offset, 1)
223+
* current_block: |<--- block 8000 --->|
224+
* offset = 2000 --^
225+
* ```
226+
*
227+
* If libsqsh can map more than one block at once, it will do so until
228+
* `desired_size` is reached. Note that `desired_size` is only a hint and
229+
* libsqsh may return more or less data than requested.
230+
*
231+
* @param[in,out] iterator The file iterator to skip data in.
232+
* @param[in,out] offset The offset that is contained in the block to
233+
* skip to.
234+
* @param[in] desired_size The desired size of the data to read.
235+
*
236+
* @return 0 on success, less than 0 on error.
237+
*/
238+
SQSH_NO_UNUSED int sqsh_file_iterator_skip2(
239+
struct SqshFileIterator *iterator, uint64_t *offset,
240+
size_t desired_size);
241+
184242
/**
185243
* @brief Gets a pointer to the current data in the file iterator.
186244
* @memberof SqshFileIterator

libsqsh/include/sqsh_mapper_private.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ sqsh__map_iterator_next(struct SqshMapIterator *iterator, int *err);
326326
* @return 0 on success, less than 0 on error.
327327
*/
328328
SQSH_NO_EXPORT SQSH_NO_UNUSED int
329-
sqsh__map_iterator_skip(struct SqshMapIterator *iterator, sqsh_index_t *offset);
329+
sqsh__map_iterator_skip(struct SqshMapIterator *iterator, uint64_t *offset);
330330

331331
/**
332332
* @internal
@@ -437,7 +437,7 @@ sqsh__map_reader_address(const struct SqshMapReader *reader);
437437
* @return 0 on success, negative on error
438438
*/
439439
SQSH_NO_EXPORT SQSH_NO_UNUSED int sqsh__map_reader_advance(
440-
struct SqshMapReader *reader, sqsh_index_t offset, size_t size);
440+
struct SqshMapReader *reader, uint64_t offset, size_t size);
441441

442442
/**
443443
* @internal

libsqsh/include/sqsh_metablock_private.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ sqsh__metablock_iterator_next(struct SqshMetablockIterator *iterator, int *err);
106106
* @return 0 on success, less than 0 on error.
107107
*/
108108
SQSH_NO_EXPORT SQSH_NO_UNUSED int sqsh__metablock_iterator_skip(
109-
struct SqshMetablockIterator *iterator, sqsh_index_t *offset);
109+
struct SqshMetablockIterator *iterator, uint64_t *offset);
110110

111111
/**
112112
* @internal
@@ -184,7 +184,7 @@ SQSH_NO_EXPORT SQSH_NO_UNUSED int sqsh__metablock_reader_init(
184184
* @return 0 on success, less than zero on error.
185185
*/
186186
SQSH_NO_EXPORT SQSH_NO_UNUSED int sqsh__metablock_reader_advance(
187-
struct SqshMetablockReader *reader, sqsh_index_t offset, size_t size);
187+
struct SqshMetablockReader *reader, uint64_t offset, size_t size);
188188

189189
/**
190190
* @internal

libsqsh/src/file/file_iterator.c

+11-1
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,16 @@ int
305305
sqsh_file_iterator_skip(
306306
struct SqshFileIterator *iterator, sqsh_index_t *offset,
307307
size_t desired_size) {
308+
uint64_t offset64 = *offset;
309+
int rv = sqsh_file_iterator_skip2(iterator, &offset64, desired_size);
310+
*offset = (size_t)offset64;
311+
return rv;
312+
}
313+
314+
int
315+
sqsh_file_iterator_skip2(
316+
struct SqshFileIterator *iterator, uint64_t *offset,
317+
size_t desired_size) {
308318
int rv = 0;
309319
const size_t block_size = iterator->block_size;
310320
const size_t current_block_size = sqsh_file_iterator_size(iterator);
@@ -315,7 +325,7 @@ sqsh_file_iterator_skip(
315325

316326
*offset -= current_block_size;
317327

318-
sqsh_index_t skip_index = *offset / block_size;
328+
uint64_t skip_index = *offset / block_size;
319329
if (current_block_size != 0) {
320330
skip_index += 1;
321331
}

libsqsh/src/file/file_reader.c

+8-2
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ file_iterator_next(void *iterator, size_t desired_size, int *err) {
4444
return sqsh_file_iterator_next(iterator, desired_size, err);
4545
}
4646
static int
47-
file_iterator_skip(void *iterator, sqsh_index_t *offset, size_t desired_size) {
48-
return sqsh_file_iterator_skip(iterator, offset, desired_size);
47+
file_iterator_skip(void *iterator, uint64_t *offset, size_t desired_size) {
48+
return sqsh_file_iterator_skip2(iterator, offset, desired_size);
4949
}
5050
static const uint8_t *
5151
file_iterator_data(const void *iterator) {
@@ -88,6 +88,12 @@ sqsh_file_reader_advance(
8888
return sqsh__reader_advance(&reader->reader, offset, size);
8989
}
9090

91+
int
92+
sqsh_file_reader_advance2(
93+
struct SqshFileReader *reader, uint64_t offset, size_t size) {
94+
return sqsh__reader_advance(&reader->reader, offset, size);
95+
}
96+
9197
const uint8_t *
9298
sqsh_file_reader_data(const struct SqshFileReader *reader) {
9399
return sqsh__reader_data(&reader->reader);

libsqsh/src/mapper/map_iterator.c

+7-5
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,10 @@ sqsh__map_iterator_init(
6868
return 0;
6969
}
7070

71-
#include <stdio.h>
7271
int
73-
sqsh__map_iterator_skip(
74-
struct SqshMapIterator *iterator, sqsh_index_t *offset) {
72+
sqsh__map_iterator_skip(struct SqshMapIterator *iterator, uint64_t *offset) {
7573
int rv = 0;
76-
sqsh_index_t index;
74+
uint64_t index;
7775
size_t block_size = sqsh__map_manager_block_size(iterator->map_manager);
7876

7977
size_t current_size = sqsh__map_iterator_size(iterator);
@@ -88,8 +86,12 @@ sqsh__map_iterator_skip(
8886
*/
8987
index--;
9088
}
89+
if (index > SIZE_MAX) {
90+
rv = -SQSH_ERROR_INTEGER_OVERFLOW;
91+
goto out;
92+
}
9193

92-
iterator->next_index = index;
94+
iterator->next_index = (size_t)index;
9395
bool has_next = sqsh__map_iterator_next(iterator, &rv);
9496
if (rv < 0) {
9597
goto out;

libsqsh/src/mapper/map_reader.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ map_iterator_next(void *iterator, size_t desired_size, int *err) {
4242
return sqsh__map_iterator_next(iterator, err);
4343
}
4444
static int
45-
map_iterator_skip(void *iterator, sqsh_index_t *offset, size_t desired_size) {
45+
map_iterator_skip(void *iterator, uint64_t *offset, size_t desired_size) {
4646
(void)desired_size;
4747
return sqsh__map_iterator_skip(iterator, offset);
4848
}
@@ -110,7 +110,7 @@ sqsh__map_reader_address(const struct SqshMapReader *reader) {
110110

111111
int
112112
sqsh__map_reader_advance(
113-
struct SqshMapReader *reader, sqsh_index_t offset, size_t size) {
113+
struct SqshMapReader *reader, uint64_t offset, size_t size) {
114114
reader->address += offset;
115115
return sqsh__reader_advance(&reader->reader, offset, size);
116116
}

libsqsh/src/metablock/metablock_iterator.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ sqsh__metablock_iterator_next(
156156

157157
int
158158
sqsh__metablock_iterator_skip(
159-
struct SqshMetablockIterator *iterator, sqsh_index_t *offset) {
159+
struct SqshMetablockIterator *iterator, uint64_t *offset) {
160160
int rv = 0;
161161

162162
size_t current_size = sqsh__metablock_iterator_size(iterator);

libsqsh/src/metablock/metablock_reader.c

+2-3
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,7 @@ metablock_iterator_next(void *iterator, size_t desired_size, int *err) {
4646
return sqsh__metablock_iterator_next(iterator, err);
4747
}
4848
static int
49-
metablock_iterator_skip(
50-
void *iterator, sqsh_index_t *offset, size_t desired_size) {
49+
metablock_iterator_skip(void *iterator, uint64_t *offset, size_t desired_size) {
5150
(void)desired_size;
5251
return sqsh__metablock_iterator_skip(iterator, offset);
5352
}
@@ -85,7 +84,7 @@ sqsh__metablock_reader_init(
8584

8685
int
8786
sqsh__metablock_reader_advance(
88-
struct SqshMetablockReader *reader, sqsh_index_t offset, size_t size) {
87+
struct SqshMetablockReader *reader, uint64_t offset, size_t size) {
8988
return sqsh__reader_advance(&reader->reader, offset, size);
9089
}
9190

libsqsh/src/table/table.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,8 @@ sqsh_table_get(
131131
goto out;
132132
}
133133

134-
// TODO: move *readers* to uint64_t offsets and remove this cast
135134
rv = sqsh__metablock_reader_advance(
136-
&metablock, (sqsh_index_t)element_offset, table->element_size);
135+
&metablock, element_offset, table->element_size);
137136
if (rv < 0) {
138137
goto out;
139138
}

libsqsh/src/xattr/xattr_iterator.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -187,9 +187,8 @@ sqsh_xattr_iterator_next(struct SqshXattrIterator *iterator, int *err) {
187187
}
188188

189189
/* Load Key Header */
190-
// TODO: move *readers* to uint64_t offsets and remove this cast
191190
rv = sqsh__metablock_reader_advance(
192-
&iterator->metablock, (size_t)iterator->next_offset,
191+
&iterator->metablock, iterator->next_offset,
193192
sizeof(struct SqshDataXattrKey));
194193
if (rv < 0) {
195194
goto out;

test/libsqsh/reader/reader.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ test_iter_next(void *data, size_t desired_size, int *err) {
7575
}
7676

7777
static int
78-
test_iter_skip(void *iterator, sqsh_index_t *offset, size_t desired_size) {
78+
test_iter_skip(void *iterator, uint64_t *offset, size_t desired_size) {
7979
int rv = 0;
8080

8181
size_t current_size = test_iter_size(iterator);

test/tools/read-chunk.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ main(int argc, char *argv[]) {
3838
return EXIT_FAILURE;
3939
}
4040

41-
rv = sqsh_file_reader_advance(reader, atoi(argv[3]), atoi(argv[4]));
41+
rv = sqsh_file_reader_advance2(reader, atoi(argv[3]), atoi(argv[4]));
4242
if (rv < 0) {
4343
sqsh_perror(rv, "sqsh_file_reader_advance");
4444
return EXIT_FAILURE;

tools/src/fs-common.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ fs_common_read(
152152
return 0;
153153
}
154154

155-
rv = sqsh_file_reader_advance(*reader, offset, size);
155+
rv = sqsh_file_reader_advance2(*reader, offset, size);
156156
if (rv < 0) {
157157
goto out;
158158
}

0 commit comments

Comments
 (0)