e18c03165b
This CL updates the callback function signature in sparse_file_callback() and sparse_file_foreach_chunk(). Before: int sparse_file_callback( struct sparse_file *s, bool sparse, bool crc, int (*write)(void *priv, const void *data, int len), void *priv); int sparse_file_foreach_chunk( struct sparse_file *s, bool sparse, bool crc, int (*write)( void *priv, const void *data, int len, unsigned int block, unsigned int nr_blocks), void *priv); After: int sparse_file_callback( struct sparse_file *s, bool sparse, bool crc, int (*write)(void *priv, const void *data, size_t len), void *priv); int sparse_file_foreach_chunk( struct sparse_file *s, bool sparse, bool crc, int (*write)( void *priv, const void *data, size_t len, unsigned int block, unsigned int nr_blocks), void *priv); The length (i.e. 'len') comes from the size of a chunk, which could be legitimately larger than INT_MAX. Prior to this CL, callers (e.g. write_sparse_data_chunk()) were already passing unsigned int to the callbacks. When a chunk size exceeds INT_MAX, the callback would see a negative value, which could lead to undesired behavior. For example, out_counter_write(), as one of the internal callbacks in libsparse, gives a wrong sum of chunk sizes, which in turn fails the fastboot flashing when given a huge sparse image. It also defines SPARSE_CALLBACK_USES_SIZE_T that allows clients to keep their codes compatibile with both versions. Bug: 78432315 Test: `m dist` (with matching changes to all the clients) Test: Build fastboot and successfully flash a previously failing (huge) sparse image. Change-Id: Iac4bcf7b57039d08af3c57f4be00d75f6b693d93
50 lines
1.6 KiB
C
50 lines
1.6 KiB
C
/*
|
|
* Copyright (C) 2010 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef _OUTPUT_FILE_H_
|
|
#define _OUTPUT_FILE_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <sparse/sparse.h>
|
|
|
|
struct output_file;
|
|
|
|
struct output_file *output_file_open_fd(int fd, unsigned int block_size, int64_t len,
|
|
int gz, int sparse, int chunks, int crc);
|
|
struct output_file *output_file_open_callback(
|
|
int (*write)(void *, const void *, size_t),
|
|
void *priv, unsigned int block_size, int64_t len, int gz, int sparse,
|
|
int chunks, int crc);
|
|
int write_data_chunk(struct output_file *out, unsigned int len, void *data);
|
|
int write_fill_chunk(struct output_file *out, unsigned int len,
|
|
uint32_t fill_val);
|
|
int write_file_chunk(struct output_file *out, unsigned int len,
|
|
const char *file, int64_t offset);
|
|
int write_fd_chunk(struct output_file *out, unsigned int len,
|
|
int fd, int64_t offset);
|
|
int write_skip_chunk(struct output_file *out, int64_t len);
|
|
void output_file_close(struct output_file *out);
|
|
|
|
int read_all(int fd, void *buf, size_t len);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|