diff -Nru 0xffff-0.7/config.mk 0xffff-0.8/config.mk --- 0xffff-0.7/config.mk 2016-12-25 11:07:11.000000000 +0000 +++ 0xffff-0.8/config.mk 2018-07-08 10:23:18.000000000 +0000 @@ -1,4 +1,4 @@ -VERSION = 0.7 +VERSION = 0.8 PREFIX = /usr/local # NetBSD stuff diff -Nru 0xffff-0.7/debian/changelog 0xffff-0.8/debian/changelog --- 0xffff-0.7/debian/changelog 2018-06-04 10:34:22.000000000 +0000 +++ 0xffff-0.8/debian/changelog 2018-07-19 18:47:25.000000000 +0000 @@ -1,3 +1,11 @@ +0xffff (0.8-1) unstable; urgency=medium + + * New upstream version + * Update debian/watch file + * Update Debian Standards Version to 4.1.5 + + -- Sebastian Reichel Thu, 19 Jul 2018 20:47:25 +0200 + 0xffff (0.7-3) unstable; urgency=medium * Switch Debian packaging repository to salsa diff -Nru 0xffff-0.7/debian/control 0xffff-0.8/debian/control --- 0xffff-0.7/debian/control 2018-06-04 10:34:22.000000000 +0000 +++ 0xffff-0.8/debian/control 2018-07-19 18:47:25.000000000 +0000 @@ -2,7 +2,7 @@ Section: misc Priority: optional Maintainer: Sebastian Reichel -Standards-Version: 4.1.4 +Standards-Version: 4.1.5 Build-Depends: debhelper (>= 11~), libusb-dev Homepage: https://github.com/pali/0xFFFF diff -Nru 0xffff-0.7/debian/watch 0xffff-0.8/debian/watch --- 0xffff-0.7/debian/watch 2018-06-04 10:34:22.000000000 +0000 +++ 0xffff-0.8/debian/watch 2018-07-19 18:47:25.000000000 +0000 @@ -1,4 +1,4 @@ version=3 -opts=filenamemangle=s/.+\/v?(\d\S+)\.tar\.gz/0xFFFF-$1\.tar\.gz/,pgpsigurlmangle=s/$/.asc/ \ - https://github.com/pali/0xFFFF/releases .*/0xffff_(\d\S+)\.orig\.tar\.gz +opts=pgpsigurlmangle=s/$/.asc/ \ + https://github.com/pali/0xFFFF/releases .*/0x[Ff][Ff][Ff][Ff][-_](\d\S+?)\.(?:orig\.tar\.gz|tar\.gz) diff -Nru 0xffff-0.7/README 0xffff-0.8/README --- 0xffff-0.7/README 2016-12-25 11:07:11.000000000 +0000 +++ 0xffff-0.8/README 2018-07-08 10:23:18.000000000 +0000 @@ -23,7 +23,7 @@ by Nokia fiasco-gen. 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. PLEASE. Read carefully all the documentation inside doc/* for more information diff -Nru 0xffff-0.7/src/cal.c 0xffff-0.8/src/cal.c --- 0xffff-0.7/src/cal.c 2016-12-25 11:07:11.000000000 +0000 +++ 0xffff-0.8/src/cal.c 2018-07-08 10:23:18.000000000 +0000 @@ -76,14 +76,14 @@ off_t lsize = 0; #endif - if ( stat(file, &st) != 0 ) - return -1; - fd = open(file, O_RDONLY); if ( fd < 0 ) return -1; + if ( fstat(fd, &st) != 0 ) + goto err; + if ( S_ISREG(st.st_mode) ) size = st.st_size; else if ( S_ISBLK(st.st_mode) ) { diff -Nru 0xffff-0.7/src/disk.c 0xffff-0.8/src/disk.c --- 0xffff-0.7/src/disk.c 2016-12-25 11:07:11.000000000 +0000 +++ 0xffff-0.8/src/disk.c 2018-07-08 10:23:18.000000000 +0000 @@ -51,6 +51,7 @@ DIR * dir; struct dirent * dirent; int found; + int old_errno; size_t len; char blkdev[1024]; @@ -117,6 +118,18 @@ 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 ) { /* Select partition */ @@ -127,35 +140,48 @@ return -1; } - memcpy(blkdev+len, "p1", 3); - if ( stat(blkdev, &st) != 0 || ! S_ISBLK(st.st_mode) ) { - memcpy(blkdev+len, "1", 2); - 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; - } + if ( snprintf(blkdev+len, sizeof(blkdev)-len, "p%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 ) { + 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); - } + if ( fd < 0 ) { + errno = old_errno; + ERROR_INFO("Cannot open block device %s", blkdev); + } 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; + } - fd = open(blkdev, (readonly ? O_RDONLY : O_RDWR) | O_EXCL); + } else { + + ERROR("Invalid partition %d for block device %s", partition, blkdev); + fd = -1; - if ( fd < 0 ) { - if ( errno != ENOMEDIUM ) - ERROR_INFO("Cannot open block device %s", blkdev); - return -1; } return fd; @@ -195,7 +221,7 @@ #else 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"); return -1; } @@ -207,11 +233,6 @@ #endif - if ( blksize > ULLONG_MAX ) { - ERROR("Block device is too big"); - return -1; - } - if ( blksize == 0 ) { ERROR("Block device has zero size"); return -1; @@ -281,6 +302,7 @@ int maj2; int min1; int min2; + int tmp; maj1 = -1; maj2 = -1; @@ -341,9 +363,17 @@ fclose(f); - if ( devnum != device->devnum || device->bus->location != busnum ) + if ( device->devnum != devnum ) 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 ) { maj2 = -1; min2 = -1; @@ -367,6 +397,16 @@ 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 */ /* 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 @@ else fd = disk_open_dev(maj1, min1, 1, 1); - if ( fd < 0 && errno != ENOMEDIUM ) + if ( fd < 0 ) return -1; dev->data = fd; @@ -394,6 +434,13 @@ } +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) { return dev->device; diff -Nru 0xffff-0.7/src/disk.h 0xffff-0.8/src/disk.h --- 0xffff-0.7/src/disk.h 2016-12-25 11:07:11.000000000 +0000 +++ 0xffff-0.8/src/disk.h 2018-07-08 10:23:18.000000000 +0000 @@ -24,6 +24,7 @@ #include "usb-device.h" 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); diff -Nru 0xffff-0.7/src/image.c 0xffff-0.8/src/image.c --- 0xffff-0.7/src/image.c 2016-12-25 11:07:11.000000000 +0000 +++ 0xffff-0.8/src/image.c 2018-07-08 10:23:18.000000000 +0000 @@ -162,8 +162,10 @@ image->hash = image_hash_from_data(image); image->devices = calloc(1, sizeof(struct device_list)); - if ( ! image->devices ) - return -1; + if ( ! image->devices ) { + image_free(image); + ALLOC_ERROR_RETURN(-1); + } image->devices->device = DEVICE_ANY; @@ -244,22 +246,33 @@ struct image * image_alloc_from_file(const char * file, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout) { + int fd; + + fd = open(file, O_RDONLY); + if ( fd < 0 ) { + ERROR_INFO("Cannot open image file %s", file); + 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 ) + if ( ! image ) { + close(fd); return NULL; + } image->is_shared_fd = 0; - image->fd = open(file, O_RDONLY); - if ( image->fd < 0 ) { - ERROR_INFO("Cannot open image file %s", file); - free(image); - return NULL; - } + image->fd = fd; offset = lseek(image->fd, 0, SEEK_END); 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); free(image); return NULL; @@ -268,10 +281,10 @@ image->size = offset; image->offset = 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 ) { - ERROR_INFO("Cannot seek to begin of file %s", file); + ERROR_INFO("Cannot seek to begin of file %s", orig_filename); close(image->fd); free(image->orig_filename); free(image); @@ -282,7 +295,7 @@ return NULL; 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); diff -Nru 0xffff-0.7/src/image.h 0xffff-0.8/src/image.h --- 0xffff-0.7/src/image.h 2016-12-25 11:07:11.000000000 +0000 +++ 0xffff-0.8/src/image.h 2018-07-08 10:23:18.000000000 +0000 @@ -64,6 +64,7 @@ }; 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); void image_free(struct image * image); void image_seek(struct image * image, size_t whence); diff -Nru 0xffff-0.7/src/main.c 0xffff-0.8/src/main.c --- 0xffff-0.7/src/main.c 2016-12-25 11:07:11.000000000 +0000 +++ 0xffff-0.8/src/main.c 2018-07-08 10:23:18.000000000 +0000 @@ -155,16 +155,24 @@ char * version; char * layout; char * layout_file; + int fd; /* First check if arg is file, then try to parse arg format */ - if ( stat(arg, &st) == 0 ) { - image = image_alloc_from_file(arg, NULL, NULL, NULL, NULL, NULL); - if ( ! image ) { - ERROR("Cannot load image file %s", arg); - exit(1); + fd = open(arg, O_RDONLY); + if ( fd >= 0 ) { + if ( fstat(fd, &st) == 0 && !S_ISDIR(st.st_mode) ) { + image = image_alloc_from_fd(fd, arg, NULL, NULL, NULL, NULL, NULL); + if ( ! image ) { + ERROR("Cannot load image file %s", arg); + exit(1); + } + image_list_add(image_first, image); + return; } - image_list_add(image_first, image); - return; + close(fd); + } else if ( errno != ENOENT ) { + ERROR("Cannot load image file %s", arg); + exit(1); } layout_file = strchr(arg, '%'); @@ -1239,6 +1247,8 @@ if ( chdir(buf) < 0 ) ERROR_INFO("Cannot chdir back to %s", buf); + printf("Done\n"); + } /* dump fiasco */ @@ -1319,14 +1329,12 @@ for ( i = 0; i < IMAGE_COUNT; ++i ) { - struct stat st; + int rename_ret; + int rename_errno; if ( ! image_tmp_name(i) ) continue; - if ( stat(image_tmp_name(i), &st) != 0 ) - continue; - switch ( i ) { case IMAGE_2ND: case IMAGE_XLOADER: @@ -1357,10 +1365,18 @@ 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); + + 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); - if ( rename(image_tmp_name(i), buf) < 0 ) { + if ( rename_ret < 0 ) { + errno = rename_errno; ERROR_INFO("Renaming failed"); buf[0] = 0; diff -Nru 0xffff-0.7/src/Makefile 0xffff-0.8/src/Makefile --- 0xffff-0.7/src/Makefile 2016-12-25 11:07:11.000000000 +0000 +++ 0xffff-0.8/src/Makefile 2018-07-08 10:23:18.000000000 +0000 @@ -5,9 +5,9 @@ BUILD_DATE ?= $(shell LC_ALL=C date '+%b %e %Y') -CC = gcc -CROSS_CC = $(CROSS_COMPILE)$(CC) -HOST_CC = $(HOST_COMPILE)$(CC) +CC ?= cc +CROSS_CC ?= $(CROSS_COMPILE)$(CC) +HOST_CC ?= $(HOST_COMPILE)$(CC) CPPFLAGS += -DVERSION=\"$(VERSION)\" -DBUILD_DATE="\"$(BUILD_DATE)\"" -D_POSIX_C_SOURCE=200809L -D_FILE_OFFSET_BITS=64 CFLAGS += -W -Wall -O2 -pedantic -std=c99 diff -Nru 0xffff-0.7/src/operations.c 0xffff-0.8/src/operations.c --- 0xffff-0.7/src/operations.c 2016-12-25 11:07:11.000000000 +0000 +++ 0xffff-0.8/src/operations.c 2018-07-08 10:23:18.000000000 +0000 @@ -91,8 +91,11 @@ 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); + } free(dev); } diff -Nru 0xffff-0.7/src/usb-device.c 0xffff-0.8/src/usb-device.c --- 0xffff-0.7/src/usb-device.c 2016-12-25 11:07:11.000000000 +0000 +++ 0xffff-0.8/src/usb-device.c 2018-07-08 10:23:18.000000000 +0000 @@ -47,7 +47,7 @@ static struct usb_flash_device usb_devices[] = { { 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, 0x0189, -1, -1, -1, FLASH_DISK, { DEVICE_RX_48, 0 } }, { 0x0421, 0x01c7, -1, -1, -1, FLASH_DISK, { DEVICE_RX_51, 0 } }, diff -Nru 0xffff-0.7/.travis.yml 0xffff-0.8/.travis.yml --- 0xffff-0.7/.travis.yml 2016-12-25 11:07:11.000000000 +0000 +++ 0xffff-0.8/.travis.yml 2018-07-08 10:23:18.000000000 +0000 @@ -1,26 +1,32 @@ +sudo: false + language: c + compiler: - gcc - clang -before_install: - - sudo apt-get update -qq - - sudo apt-get install -qq -y libusb-dev -script: if [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then make ; fi -matrix: - exclude: - - compiler: clang - - env: COVERITY_SCAN_BRANCH=1 +addons: &addons + apt: + packages: + - libusb-dev -env: - global: - - secure: "JdUp+xFykPZoYA4aRfmYk2CtilLapniQllWPKo2dDdJd1vzdawfTvVxIAKjy7ac9RKwZzg3Chq3RsMEXPv8BtaLbssw266C7RDLMgjacl1eFLcmGRj/Gkk9peDSZ6vVdGEcA2j+6KDSfpCa/XjFjvOufZOgKw6m+3+d0A4G45SI=" +matrix: + include: + - compiler: gcc + 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 -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 +script: + - if [ -n "$COVERITY_SCAN_TOKEN" ]; then exit 0; fi + - make