mirror of
https://github.com/Thesola10/umd-livepatch.git
synced 2025-04-19 22:13:22 +00:00
fixing endianness
This commit is contained in:
parent
0d1167ce05
commit
40826fafbc
@ -115,6 +115,7 @@ umdiff_File_fromCompare(umdiff_File *file, int source_fd, int target_fd)
|
|||||||
rs_job_drive(sigJob, &buffers,
|
rs_job_drive(sigJob, &buffers,
|
||||||
_impl_umdiff_fileJobSource, source_fd_.opaque,
|
_impl_umdiff_fileJobSource, source_fd_.opaque,
|
||||||
_impl_umdiff_sigJobSink, workSignatures);
|
_impl_umdiff_sigJobSink, workSignatures);
|
||||||
|
dprintf(1, "Extracted signatures.\n");
|
||||||
buffers = (rs_buffers_t) {
|
buffers = (rs_buffers_t) {
|
||||||
.eof_in = 0,
|
.eof_in = 0,
|
||||||
.avail_in = 0,
|
.avail_in = 0,
|
||||||
@ -125,6 +126,7 @@ umdiff_File_fromCompare(umdiff_File *file, int source_fd, int target_fd)
|
|||||||
rs_job_drive(deltaJob, &buffers,
|
rs_job_drive(deltaJob, &buffers,
|
||||||
_impl_umdiff_fileJobSource, target_fd_.opaque,
|
_impl_umdiff_fileJobSource, target_fd_.opaque,
|
||||||
_impl_umdiff_deltaJobSink, file);
|
_impl_umdiff_deltaJobSink, file);
|
||||||
|
dprintf(1, "Generated deltas.\n");
|
||||||
|
|
||||||
free(workSignatures);
|
free(workSignatures);
|
||||||
|
|
||||||
|
@ -69,10 +69,19 @@ umdiff_File_write(umdiff_File *file, int outfd)
|
|||||||
_impl_umdiff_RawHeader rheader;
|
_impl_umdiff_RawHeader rheader;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!file || file->mode != umdiff_FileFlags_LOAD_FULL
|
if (!file || file->mode != umdiff_FileFlags_LOAD_FULL) {
|
||||||
|| !file->commands || !file->data
|
dprintf(1, "File object is in incomplete mode. Cannot proceed.\n");
|
||||||
|| !file->hdr.cmd_count || !file->hdr.index[0])
|
|
||||||
return 1;
|
return 1;
|
||||||
|
} else if (!file->commands || !file->data) {
|
||||||
|
dprintf(1, "File object is missing commands or data buffer. Cannot proceed.\n");
|
||||||
|
return 1;
|
||||||
|
} else if (!file->hdr.cmd_count) {
|
||||||
|
dprintf(1, "File object has zero commands. Cannot proceed.\n");
|
||||||
|
return 1;
|
||||||
|
} else if (!file->hdr.index[0]) {
|
||||||
|
dprintf(1, "File object has an empty index.\n");
|
||||||
|
//return 1;
|
||||||
|
}
|
||||||
|
|
||||||
rheader.hdr = file->hdr;
|
rheader.hdr = file->hdr;
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "usage.rl.h"
|
#include "usage.rl.h"
|
||||||
#include "compare.h"
|
#include "compare.h"
|
||||||
@ -19,11 +20,23 @@ int
|
|||||||
umdiff_delta(char *source, char *target, char *output)
|
umdiff_delta(char *source, char *target, char *output)
|
||||||
{
|
{
|
||||||
int source_fd, target_fd, output_fd;
|
int source_fd, target_fd, output_fd;
|
||||||
|
size_t tgt_sz;
|
||||||
umdiff_File result;
|
umdiff_File result;
|
||||||
|
|
||||||
source_fd = open(source, O_RDONLY);
|
source_fd = open(source, O_RDONLY);
|
||||||
target_fd = open(target, O_RDONLY);
|
target_fd = open(target, O_RDONLY);
|
||||||
|
|
||||||
|
tgt_sz = lseek(target_fd, 0, SEEK_END);
|
||||||
|
lseek(target_fd, 0, SEEK_SET);
|
||||||
|
|
||||||
|
// Naive worst case alloc
|
||||||
|
//TODO: Use progressive block-based reallocs instead
|
||||||
|
result.commands = malloc(sizeof(umdiff_Command) * (tgt_sz / ISO_SECTOR_SIZE));
|
||||||
|
result.data = malloc(tgt_sz);
|
||||||
|
result.mode = umdiff_FileFlags_LOAD_FULL;
|
||||||
|
result.data_len = 0;
|
||||||
|
result.hdr.cmd_count = 0;
|
||||||
|
|
||||||
umdiff_File_fromCompare(&result, source_fd, target_fd);
|
umdiff_File_fromCompare(&result, source_fd, target_fd);
|
||||||
|
|
||||||
output_fd = open(output, O_WRONLY|O_CREAT|O_TRUNC, 0644);
|
output_fd = open(output, O_WRONLY|O_CREAT|O_TRUNC, 0644);
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
enum rs_op_kind kind;
|
enum rs_op_kind kind;
|
||||||
@ -40,7 +41,23 @@ _impl_umdiff_RdiffCommand_parse(_impl_umdiff_RdiffCommand *cmd, char *buf, size_
|
|||||||
|
|
||||||
if (entry.kind == RS_KIND_COPY) {
|
if (entry.kind == RS_KIND_COPY) {
|
||||||
memcpy(&cmd->copy_offset, buf+1, entry.len_1);
|
memcpy(&cmd->copy_offset, buf+1, entry.len_1);
|
||||||
|
switch (entry.len_1) {
|
||||||
|
case 2:
|
||||||
|
cmd->copy_offset = be16toh(cmd->copy_offset); break;
|
||||||
|
case 4:
|
||||||
|
cmd->copy_offset = be32toh(cmd->copy_offset); break;
|
||||||
|
case 8:
|
||||||
|
cmd->copy_offset = be64toh(cmd->copy_offset); break;
|
||||||
|
}
|
||||||
memcpy(&cmd->len, buf+entry.len_1+1, entry.len_2);
|
memcpy(&cmd->len, buf+entry.len_1+1, entry.len_2);
|
||||||
|
switch (entry.len_2) {
|
||||||
|
case 2:
|
||||||
|
cmd->len = be16toh(cmd->len); break;
|
||||||
|
case 4:
|
||||||
|
cmd->len = be32toh(cmd->len); break;
|
||||||
|
case 8:
|
||||||
|
cmd->len = be64toh(cmd->len); break;
|
||||||
|
}
|
||||||
return entry.len_1 + entry.len_2 + 1;
|
return entry.len_1 + entry.len_2 + 1;
|
||||||
} else {
|
} else {
|
||||||
memcpy(&cmd->len, buf+1, entry.len_1);
|
memcpy(&cmd->len, buf+1, entry.len_1);
|
||||||
@ -73,13 +90,14 @@ _impl_umdiff_File_feedData(umdiff_File *file, char *buf, size_t len)
|
|||||||
int
|
int
|
||||||
umdiff_File_feedCommands(umdiff_File *file, char *buf, size_t len)
|
umdiff_File_feedCommands(umdiff_File *file, char *buf, size_t len)
|
||||||
{
|
{
|
||||||
umdiff_Command *lastCommand, *newCommand;
|
umdiff_Command *lastCommand = NULL, *newCommand;
|
||||||
_impl_umdiff_RdiffCommand rdiffCommand;
|
_impl_umdiff_RdiffCommand rdiffCommand;
|
||||||
|
|
||||||
int ret, progress = 0;
|
int ret, progress = 0;
|
||||||
|
|
||||||
if (file->hdr.cmd_count == 0 && file->data_len == 0
|
if (file->hdr.cmd_count == 0 && file->data_len == 0
|
||||||
&& (int) *buf == RS_DELTA_MAGIC) {
|
&& (int) *buf == htobe32(RS_DELTA_MAGIC)) {
|
||||||
|
dprintf(1, "Encountered magic");
|
||||||
buf += sizeof RS_DELTA_MAGIC;
|
buf += sizeof RS_DELTA_MAGIC;
|
||||||
len -= sizeof RS_DELTA_MAGIC;
|
len -= sizeof RS_DELTA_MAGIC;
|
||||||
}
|
}
|
||||||
@ -89,10 +107,10 @@ umdiff_File_feedCommands(umdiff_File *file, char *buf, size_t len)
|
|||||||
&& (x->patch_start + x->patch_sector_count) > (file->data_len / ISO_SECTOR_SIZE))
|
&& (x->patch_start + x->patch_sector_count) > (file->data_len / ISO_SECTOR_SIZE))
|
||||||
|
|
||||||
if (file->hdr.cmd_count > 0)
|
if (file->hdr.cmd_count > 0)
|
||||||
lastCommand = &file->commands[file->hdr.cmd_count - 1];
|
lastCommand = &(file->commands[file->hdr.cmd_count - 1]);
|
||||||
|
|
||||||
while (len) {
|
while (len) {
|
||||||
if (_impl_umdiff_Command_isUnfinished$(lastCommand)) {
|
if (lastCommand && _impl_umdiff_Command_isUnfinished$(lastCommand)) {
|
||||||
ret = _impl_umdiff_File_feedData(file, buf, len);
|
ret = _impl_umdiff_File_feedData(file, buf, len);
|
||||||
buf += ret;
|
buf += ret;
|
||||||
len -= ret;
|
len -= ret;
|
||||||
@ -106,9 +124,11 @@ umdiff_File_feedCommands(umdiff_File *file, char *buf, size_t len)
|
|||||||
buf += ret;
|
buf += ret;
|
||||||
progress += ret;
|
progress += ret;
|
||||||
|
|
||||||
|
dprintf(1, "Length: %ld, offset: %ld\n", rdiffCommand.len, rdiffCommand.copy_offset);
|
||||||
|
|
||||||
if (rdiffCommand.len % ISO_SECTOR_SIZE
|
if (rdiffCommand.len % ISO_SECTOR_SIZE
|
||||||
|| rdiffCommand.copy_offset % ISO_SECTOR_SIZE) {
|
|| rdiffCommand.copy_offset % ISO_SECTOR_SIZE) {
|
||||||
dprintf(1, "Misaligned command!\n");
|
dprintf(1, "Misaligned command! Length %ld, offset %ld\n", rdiffCommand.len, rdiffCommand.copy_offset);
|
||||||
exit(4);
|
exit(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,7 +136,9 @@ umdiff_File_feedCommands(umdiff_File *file, char *buf, size_t len)
|
|||||||
file->hdr.cmd_count += 1;
|
file->hdr.cmd_count += 1;
|
||||||
|
|
||||||
newCommand->data_source = (rdiffCommand.kind == RS_KIND_COPY);
|
newCommand->data_source = (rdiffCommand.kind == RS_KIND_COPY);
|
||||||
newCommand->sector_start = lastCommand->sector_start + lastCommand->sector_count;
|
newCommand->sector_start = lastCommand
|
||||||
|
? lastCommand->sector_start + lastCommand->sector_count
|
||||||
|
: 0;
|
||||||
newCommand->sector_count = rdiffCommand.len / ISO_SECTOR_SIZE;
|
newCommand->sector_count = rdiffCommand.len / ISO_SECTOR_SIZE;
|
||||||
newCommand->patch_sector_count = rdiffCommand.len / ISO_SECTOR_SIZE;
|
newCommand->patch_sector_count = rdiffCommand.len / ISO_SECTOR_SIZE;
|
||||||
newCommand->patch_start = (rdiffCommand.kind == RS_KIND_COPY)
|
newCommand->patch_start = (rdiffCommand.kind == RS_KIND_COPY)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user