Merge branch 'master' into maemo

This commit is contained in:
Pali Rohár committed 2018-07-08 13:37:05 +02:00
commit 1f01a8330b
12 files changed
+174 -87

No files matched your search

+25 -19
View File
@@ -1,26 +1,32 @@
sudo: false
language: c language: c
compiler: compiler:
- gcc - gcc
- clang - clang
before_install:
- sudo apt-get update -qq addons: &addons
- sudo apt-get install -qq -y libusb-dev apt:
script: if [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then make ; fi packages:
- libusb-dev
matrix: matrix:
exclude: include:
- compiler: clang - compiler: gcc
- env: COVERITY_SCAN_BRANCH=1 if: (branch = master) AND (type != pull_request)
env:
- secure: "JdUp+xFykPZoYA4aRfmYk2CtilLapniQllWPKo2dDdJd1vzdawfTvVxIAKjy7ac9RKwZzg3Chq3RsMEXPv8BtaLbssw266C7RDLMgjacl1eFLcmGRj/Gkk9peDSZ6vVdGEcA2j+6KDSfpCa/XjFjvOufZOgKw6m+3+d0A4G45SI="
addons:
<<: *addons
coverity_scan:
project:
name: "pali/0xFFFF"
description: "Build submitted via Travis CI"
notification_email: pali.rohar@gmail.com
build_command: make
branch_pattern: master
env: script:
global: - if [ -n "$COVERITY_SCAN_TOKEN" ]; then exit 0; fi
- secure: "JdUp+xFykPZoYA4aRfmYk2CtilLapniQllWPKo2dDdJd1vzdawfTvVxIAKjy7ac9RKwZzg3Chq3RsMEXPv8BtaLbssw266C7RDLMgjacl1eFLcmGRj/Gkk9peDSZ6vVdGEcA2j+6KDSfpCa/XjFjvOufZOgKw6m+3+d0A4G45SI=" - make
addons:
coverity_scan:
project:
name: "pali/0xFFFF"
description: "Build submitted via Travis CI"
notification_email: pali.rohar@gmail.com
build_command: make
branch_pattern: master
+1 -1
View File
@@ -23,7 +23,7 @@ R&D mode, changing HW revision strings, ...).
by Nokia fiasco-gen. by Nokia fiasco-gen.
Use it with CARE. This is an experimental tool and it can brick your device. Use it with CARE. This is an experimental tool and it can brick your device.
It's not suposed to be stable, so nokia will probably release incompatible It's not supposed to be stable, so nokia will probably release incompatible
bootloaders to break this tool. USE IT AT YOUR OWN RISK. bootloaders to break this tool. USE IT AT YOUR OWN RISK.
PLEASE. Read carefully all the documentation inside doc/* for more information PLEASE. Read carefully all the documentation inside doc/* for more information
+1 -1
View File
@@ -1,4 +1,4 @@
VERSION = 0.7 VERSION = 0.8
PREFIX = /usr/local PREFIX = /usr/local
# NetBSD stuff # NetBSD stuff
+3 -3
View File
@@ -5,9 +5,9 @@ INSTALL ?= install
BUILD_DATE ?= $(shell LC_ALL=C date '+%b %e %Y') BUILD_DATE ?= $(shell LC_ALL=C date '+%b %e %Y')
CC = gcc CC ?= cc
CROSS_CC = $(CROSS_COMPILE)$(CC) CROSS_CC ?= $(CROSS_COMPILE)$(CC)
HOST_CC = $(HOST_COMPILE)$(CC) HOST_CC ?= $(HOST_COMPILE)$(CC)
CPPFLAGS += -DVERSION=\"$(VERSION)\" -DBUILD_DATE="\"$(BUILD_DATE)\"" -D_POSIX_C_SOURCE=200809L -D_FILE_OFFSET_BITS=64 CPPFLAGS += -DVERSION=\"$(VERSION)\" -DBUILD_DATE="\"$(BUILD_DATE)\"" -D_POSIX_C_SOURCE=200809L -D_FILE_OFFSET_BITS=64
CFLAGS += -W -Wall -O2 -pedantic -std=c99 CFLAGS += -W -Wall -O2 -pedantic -std=c99
+3 -3
View File
@@ -76,14 +76,14 @@ int cal_init_file(const char * file, struct cal ** cal_out) {
off_t lsize = 0; off_t lsize = 0;
#endif #endif
if ( stat(file, &st) != 0 )
return -1;
fd = open(file, O_RDONLY); fd = open(file, O_RDONLY);
if ( fd < 0 ) if ( fd < 0 )
return -1; return -1;
if ( fstat(fd, &st) != 0 )
goto err;
if ( S_ISREG(st.st_mode) ) if ( S_ISREG(st.st_mode) )
size = st.st_size; size = st.st_size;
else if ( S_ISBLK(st.st_mode) ) { else if ( S_ISBLK(st.st_mode) ) {
+79 -32
View File
@@ -51,6 +51,7 @@ int disk_open_dev(int maj, int min, int partition, int readonly) {
DIR * dir; DIR * dir;
struct dirent * dirent; struct dirent * dirent;
int found; int found;
int old_errno;
size_t len; size_t len;
char blkdev[1024]; char blkdev[1024];
@@ -117,6 +118,18 @@ int disk_open_dev(int maj, int min, int partition, int readonly) {
blkdev[len] = 0; blkdev[len] = 0;
fd = open(blkdev, (readonly ? O_RDONLY : O_RDWR) | O_EXCL | O_NONBLOCK);
if ( fd < 0 ) {
ERROR_INFO("Cannot open block device %s", blkdev);
return -1;
} else {
if ( fstat(fd, &st) != 0 || ! S_ISBLK(st.st_mode) || makedev(maj, min) != st.st_rdev ) {
ERROR("Block device %s does not have id %d:%d\n", blkdev, maj, min);
close(fd);
return -1;
}
}
} else if ( partition > 0 ) { } else if ( partition > 0 ) {
/* Select partition */ /* Select partition */
@@ -127,35 +140,48 @@ int disk_open_dev(int maj, int min, int partition, int readonly) {
return -1; return -1;
} }
memcpy(blkdev+len, "p1", 3); if ( snprintf(blkdev+len, sizeof(blkdev)-len, "p%d", partition) >= (int)(sizeof(blkdev)-len) ) {
if ( stat(blkdev, &st) != 0 || ! S_ISBLK(st.st_mode) ) { ERROR("Block device name is too long");
memcpy(blkdev+len, "1", 2); return -1;
if ( stat(blkdev, &st) != 0 || ! S_ISBLK(st.st_mode) ) {
blkdev[len] = 0;
fd = open(blkdev, O_RDONLY);
if ( fd < 0 ) {
if ( errno != ENOMEDIUM ) {
ERROR_INFO("Cannot open block device %s", blkdev);
return -1;
}
} else {
close(fd);
ERROR("Block device does not have partitions");
return -1;
}
}
} }
fd = open(blkdev, (readonly ? O_RDONLY : O_RDWR) | O_EXCL);
if ( fd < 0 && errno == ENOENT ) {
if ( snprintf(blkdev+len, sizeof(blkdev)-len, "%d", partition) >= (int)(sizeof(blkdev)-len) ) {
ERROR("Block device name is too long");
return -1;
}
fd = open(blkdev, (readonly ? O_RDONLY : O_RDWR) | O_EXCL);
}
if ( fd < 0 && errno == ENOENT ) {
blkdev[len] = 0;
fd = open(blkdev, O_RDONLY | O_NONBLOCK);
if ( fd < 0 ) {
ERROR_INFO("Cannot open block device %s", blkdev);
} else {
close(fd);
ERROR("Block device %s does not have partitions", blkdev);
}
return -1;
}
if ( fd < 0 )
old_errno = errno;
printf("Found block device %s for partition %d\n", blkdev, partition); printf("Found block device %s for partition %d\n", blkdev, partition);
} if ( fd < 0 ) {
errno = old_errno;
fd = open(blkdev, (readonly ? O_RDONLY : O_RDWR) | O_EXCL);
if ( fd < 0 ) {
if ( errno != ENOMEDIUM )
ERROR_INFO("Cannot open block device %s", blkdev); ERROR_INFO("Cannot open block device %s", blkdev);
return -1; } else if ( fstat(fd, &st) != 0 || ! S_ISBLK(st.st_mode) ) {
ERROR("Block device %s is not block device\n", blkdev);
close(fd);
return -1;
}
} else {
ERROR("Invalid partition %d for block device %s", partition, blkdev);
fd = -1;
} }
return fd; return fd;
@@ -195,7 +221,7 @@ int disk_dump_dev(int fd, const char * file) {
#else #else
blksize = lseek(fd, 0, SEEK_END); blksize = lseek(fd, 0, SEEK_END);
if ( blksize == (off_t)-1 ) { if ( (off_t)blksize == (off_t)-1 ) {
ERROR_INFO("Cannot get size of block device"); ERROR_INFO("Cannot get size of block device");
return -1; return -1;
} }
@@ -207,11 +233,6 @@ int disk_dump_dev(int fd, const char * file) {
#endif #endif
if ( blksize > ULLONG_MAX ) {
ERROR("Block device is too big");
return -1;
}
if ( blksize == 0 ) { if ( blksize == 0 ) {
ERROR("Block device has zero size"); ERROR("Block device has zero size");
return -1; return -1;
@@ -281,6 +302,7 @@ int disk_init(struct usb_device_info * dev) {
int maj2; int maj2;
int min1; int min1;
int min2; int min2;
int tmp;
maj1 = -1; maj1 = -1;
maj2 = -1; maj2 = -1;
@@ -341,9 +363,17 @@ int disk_init(struct usb_device_info * dev) {
fclose(f); fclose(f);
if ( devnum != device->devnum || device->bus->location != busnum ) if ( device->devnum != devnum )
continue; continue;
if ( device->bus->location ) {
if ( device->bus->location != busnum )
continue;
} else if ( device->bus->dirname[0] ) {
if ( atoi(device->bus->dirname) != (int)busnum )
continue;
}
if ( sscanf(dirent->d_name, "%d:%d", &maj2, &min2) != 2 ) { if ( sscanf(dirent->d_name, "%d:%d", &maj2, &min2) != 2 ) {
maj2 = -1; maj2 = -1;
min2 = -1; min2 = -1;
@@ -367,6 +397,16 @@ int disk_init(struct usb_device_info * dev) {
return -1; return -1;
} }
/* Ensure that maj1:min1 is first device and maj2:min2 is second device */
if ( min2 != -1 && min2 < min1 ) {
tmp = min1;
min1 = min2;
min2 = tmp;
tmp = maj1;
maj1 = maj2;
maj2 = tmp;
}
/* TODO: change 1 to 0 when disk_flash_dev will be implemented */ /* TODO: change 1 to 0 when disk_flash_dev will be implemented */
/* RX-51 and RM-680 export MyDocs in first usb device and just first partion, so host system see whole device without MBR table */ /* RX-51 and RM-680 export MyDocs in first usb device and just first partion, so host system see whole device without MBR table */
@@ -378,7 +418,7 @@ int disk_init(struct usb_device_info * dev) {
else else
fd = disk_open_dev(maj1, min1, 1, 1); fd = disk_open_dev(maj1, min1, 1, 1);
if ( fd < 0 && errno != ENOMEDIUM ) if ( fd < 0 )
return -1; return -1;
dev->data = fd; dev->data = fd;
@@ -394,6 +434,13 @@ int disk_init(struct usb_device_info * dev) {
} }
void disk_exit(struct usb_device_info * dev) {
if ( dev->data >= 0 )
close(dev->data);
}
enum device disk_get_device(struct usb_device_info * dev) { enum device disk_get_device(struct usb_device_info * dev) {
return dev->device; return dev->device;
+1
View File
@@ -24,6 +24,7 @@
#include "usb-device.h" #include "usb-device.h"
int disk_init(struct usb_device_info * dev); int disk_init(struct usb_device_info * dev);
void disk_exit(struct usb_device_info * dev);
enum device disk_get_device(struct usb_device_info * dev); enum device disk_get_device(struct usb_device_info * dev);
+27 -14
View File
@@ -162,8 +162,10 @@ static int image_append(struct image * image, const char * type, const char * de
image->hash = image_hash_from_data(image); image->hash = image_hash_from_data(image);
image->devices = calloc(1, sizeof(struct device_list)); image->devices = calloc(1, sizeof(struct device_list));
if ( ! image->devices ) if ( ! image->devices ) {
return -1; image_free(image);
ALLOC_ERROR_RETURN(-1);
}
image->devices->device = DEVICE_ANY; image->devices->device = DEVICE_ANY;
@@ -244,22 +246,33 @@ static struct image * image_alloc(void) {
struct image * image_alloc_from_file(const char * file, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout) { struct image * image_alloc_from_file(const char * file, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout) {
off_t offset; int fd;
struct image * image = image_alloc();
if ( ! image )
return NULL;
image->is_shared_fd = 0; fd = open(file, O_RDONLY);
image->fd = open(file, O_RDONLY); if ( fd < 0 ) {
if ( image->fd < 0 ) {
ERROR_INFO("Cannot open image file %s", file); ERROR_INFO("Cannot open image file %s", file);
free(image);
return NULL; return NULL;
} }
return image_alloc_from_fd(fd, file, type, device, hwrevs, version, layout);
}
struct image * image_alloc_from_fd(int fd, const char * orig_filename, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout) {
off_t offset;
struct image * image = image_alloc();
if ( ! image ) {
close(fd);
return NULL;
}
image->is_shared_fd = 0;
image->fd = fd;
offset = lseek(image->fd, 0, SEEK_END); offset = lseek(image->fd, 0, SEEK_END);
if ( offset == (off_t)-1 ) { if ( offset == (off_t)-1 ) {
ERROR_INFO("Cannot seek to end of file %s", file); ERROR_INFO("Cannot seek to end of file %s", orig_filename);
close(image->fd); close(image->fd);
free(image); free(image);
return NULL; return NULL;
@@ -268,10 +281,10 @@ struct image * image_alloc_from_file(const char * file, const char * type, const
image->size = offset; image->size = offset;
image->offset = 0; image->offset = 0;
image->cur = 0; image->cur = 0;
image->orig_filename = strdup(file); image->orig_filename = strdup(orig_filename);
if ( lseek(image->fd, 0, SEEK_SET) == (off_t)-1 ) { if ( lseek(image->fd, 0, SEEK_SET) == (off_t)-1 ) {
ERROR_INFO("Cannot seek to begin of file %s", file); ERROR_INFO("Cannot seek to begin of file %s", orig_filename);
close(image->fd); close(image->fd);
free(image->orig_filename); free(image->orig_filename);
free(image); free(image);
@@ -282,7 +295,7 @@ struct image * image_alloc_from_file(const char * file, const char * type, const
return NULL; return NULL;
if ( ( ! type || ! type[0] ) && ( ! device || ! device[0] ) && ( ! hwrevs || ! hwrevs[0] ) && ( ! version || ! version[0] ) ) if ( ( ! type || ! type[0] ) && ( ! device || ! device[0] ) && ( ! hwrevs || ! hwrevs[0] ) && ( ! version || ! version[0] ) )
image_missing_values_from_name(image, file); image_missing_values_from_name(image, orig_filename);
image_align(image); image_align(image);
+1
View File
@@ -64,6 +64,7 @@ struct image_list {
}; };
struct image * image_alloc_from_file(const char * file, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout); struct image * image_alloc_from_file(const char * file, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout);
struct image * image_alloc_from_fd(int fd, const char * orig_filename, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout);
struct image * image_alloc_from_shared_fd(int fd, size_t size, size_t offset, uint16_t hash, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout); struct image * image_alloc_from_shared_fd(int fd, size_t size, size_t offset, uint16_t hash, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout);
void image_free(struct image * image); void image_free(struct image * image);
void image_seek(struct image * image, size_t whence); void image_seek(struct image * image, size_t whence);
+28 -12
View File
@@ -155,16 +155,24 @@ static void parse_image_arg(char * arg, struct image_list ** image_first) {
char * version; char * version;
char * layout; char * layout;
char * layout_file; char * layout_file;
int fd;
/* First check if arg is file, then try to parse arg format */ /* First check if arg is file, then try to parse arg format */
if ( stat(arg, &st) == 0 ) { fd = open(arg, O_RDONLY);
image = image_alloc_from_file(arg, NULL, NULL, NULL, NULL, NULL); if ( fd >= 0 ) {
if ( ! image ) { if ( fstat(fd, &st) == 0 && !S_ISDIR(st.st_mode) ) {
ERROR("Cannot load image file %s", arg); image = image_alloc_from_fd(fd, arg, NULL, NULL, NULL, NULL, NULL);
exit(1); if ( ! image ) {
ERROR("Cannot load image file %s", arg);
exit(1);
}
image_list_add(image_first, image);
return;
} }
image_list_add(image_first, image); close(fd);
return; } else if ( errno != ENOENT ) {
ERROR("Cannot load image file %s", arg);
exit(1);
} }
layout_file = strchr(arg, '%'); layout_file = strchr(arg, '%');
@@ -1239,6 +1247,8 @@ int main(int argc, char **argv) {
if ( chdir(buf) < 0 ) if ( chdir(buf) < 0 )
ERROR_INFO("Cannot chdir back to %s", buf); ERROR_INFO("Cannot chdir back to %s", buf);
printf("Done\n");
} }
/* dump fiasco */ /* dump fiasco */
@@ -1319,14 +1329,12 @@ int main(int argc, char **argv) {
for ( i = 0; i < IMAGE_COUNT; ++i ) { for ( i = 0; i < IMAGE_COUNT; ++i ) {
struct stat st; int rename_ret;
int rename_errno;
if ( ! image_tmp_name(i) ) if ( ! image_tmp_name(i) )
continue; continue;
if ( stat(image_tmp_name(i), &st) != 0 )
continue;
switch ( i ) { switch ( i ) {
case IMAGE_2ND: case IMAGE_2ND:
case IMAGE_XLOADER: case IMAGE_XLOADER:
@@ -1357,10 +1365,18 @@ int main(int argc, char **argv) {
buf[0] = 0; buf[0] = 0;
snprintf(buf, sizeof(buf), "%s-%s:%hd_%s", image_type_to_string(i), device_to_string(dev->detected_device), dev->detected_hwrev, ptr); snprintf(buf, sizeof(buf), "%s-%s:%hd_%s", image_type_to_string(i), device_to_string(dev->detected_device), dev->detected_hwrev, ptr);
rename_ret = rename(image_tmp_name(i), buf);
rename_errno = errno;
if ( rename_ret < 0 && rename_errno == ENOENT )
continue;
printf("Renaming %s image file to %s...\n", image_type_to_string(i), buf); printf("Renaming %s image file to %s...\n", image_type_to_string(i), buf);
if ( rename(image_tmp_name(i), buf) < 0 ) { if ( rename_ret < 0 ) {
errno = rename_errno;
ERROR_INFO("Renaming failed"); ERROR_INFO("Renaming failed");
buf[0] = 0; buf[0] = 0;
+4 -1
View File
@@ -91,8 +91,11 @@ clean:
void dev_free(struct device_info * dev) { void dev_free(struct device_info * dev) {
if ( dev->usb ) if ( dev->usb ) {
if ( dev->usb->flash_device->protocol == FLASH_DISK )
disk_exit(dev->usb);
usb_close_device(dev->usb); usb_close_device(dev->usb);
}
free(dev); free(dev);
} }
+1 -1
View File
@@ -47,7 +47,7 @@
static struct usb_flash_device usb_devices[] = { static struct usb_flash_device usb_devices[] = {
{ 0x0421, 0x0096, -1, -1, -1, FLASH_DISK, { DEVICE_RX_44, 0 } }, { 0x0421, 0x0096, -1, -1, -1, FLASH_DISK, { DEVICE_RX_44, 0 } },
{ 0x0421, 0x0105, 2, 1, -1, FLASH_NOLO, { DEVICE_SU_18, DEVICE_RX_44, DEVICE_RX_48, DEVICE_RX_51, DEVICE_RM_680, DEVICE_RM_696, 0 } }, { 0x0421, 0x0105, 2, 1, -1, FLASH_NOLO, { DEVICE_SU_18, DEVICE_RX_34, DEVICE_RX_44, DEVICE_RX_48, DEVICE_RX_51, DEVICE_RM_680, DEVICE_RM_696, 0 } },
{ 0x0421, 0x0106, 0, -1, -1, FLASH_COLD, { DEVICE_RX_51, DEVICE_RM_680, DEVICE_RM_696, 0 } }, { 0x0421, 0x0106, 0, -1, -1, FLASH_COLD, { DEVICE_RX_51, DEVICE_RM_680, DEVICE_RM_696, 0 } },
{ 0x0421, 0x0189, -1, -1, -1, FLASH_DISK, { DEVICE_RX_48, 0 } }, { 0x0421, 0x0189, -1, -1, -1, FLASH_DISK, { DEVICE_RX_48, 0 } },
{ 0x0421, 0x01c7, -1, -1, -1, FLASH_DISK, { DEVICE_RX_51, 0 } }, { 0x0421, 0x01c7, -1, -1, -1, FLASH_DISK, { DEVICE_RX_51, 0 } },