--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock
---Please unblock package 0xffff---
Note: I have not yet uploaded 0.6.1-1 to sid, but its available from
experimental. I sent a mail to debian-release, but have been request to
file an unblock bug instead.
So I've uploaded 0xffff 0.6.1-1 to experimental, which is a minor
upstream release with 90% bug fixes (some of them security relevant).
Since the diff is quite big I wanted to make sure, that the release
team is ok with the changes before uploading them to sid (and let them
transition to testing).
-- Sebastian
$ debdiff 0xffff_0.6-1.dsc 0xffff_0.6.1-1.dsc
diff -Nru 0xffff-0.6/config.mk 0xffff-0.6.1/config.mk
--- 0xffff-0.6/config.mk 2014-05-10 22:39:47.000000000 +0200
+++ 0xffff-0.6.1/config.mk 2014-11-18 23:23:23.000000000 +0100
@@ -1,4 +1,4 @@
-VERSION = 0.6
+VERSION = 0.6.1
PREFIX = /usr/local
# NetBSD stuff
diff -Nru 0xffff-0.6/debian/changelog 0xffff-0.6.1/debian/changelog
--- 0xffff-0.6/debian/changelog 2014-05-12 19:32:47.000000000 +0200
+++ 0xffff-0.6.1/debian/changelog 2014-12-11 21:53:03.000000000 +0100
@@ -1,3 +1,13 @@
+0xffff (0.6.1-1) experimental; urgency=medium
+
+ * New upstream release
+ - Contains a few security related fixes (memory corruptions & leaks)
+ - Support for -t (filter by type) for -e (dump images)
+ - reattach kernel driver
+ - minor fixes
+
+ -- Sebastian Reichel <s...@debian.org> Thu, 11 Dec 2014 21:52:53 +0100
+
0xffff (0.6-1) unstable; urgency=low
* New upstream release
diff -Nru 0xffff-0.6/src/cold-flash.c 0xffff-0.6.1/src/cold-flash.c
--- 0xffff-0.6/src/cold-flash.c 2014-05-10 22:39:47.000000000 +0200
+++ 0xffff-0.6.1/src/cold-flash.c 2014-11-18 23:23:23.000000000 +0100
@@ -130,7 +130,7 @@
uint32_t size; /* 4 bytes - size of file */
uint32_t crc1; /* 4 bytes - crc32 of file */
uint32_t crc2; /* 4 bytes - crc32 of first 12 bytes of message */
-};
+} __attribute__((__packed__));
#define XLOADER_MSG_TYPE_PING 0x6301326E
#define XLOADER_MSG_TYPE_SEND 0x6302326E
diff -Nru 0xffff-0.6/src/fiasco.c 0xffff-0.6.1/src/fiasco.c
--- 0xffff-0.6/src/fiasco.c 2014-05-10 22:39:47.000000000 +0200
+++ 0xffff-0.6.1/src/fiasco.c 2014-11-18 23:23:23.000000000 +0100
@@ -192,9 +192,12 @@
if ( ! hwrevs[0] )
strcpy(hwrevs, hwrev);
else {
- /* TODO: check if hwrevs has
enough size */
- strcat(hwrevs, ",");
- strcat(hwrevs, hwrev);
+ size_t len1 = strlen(hwrevs);
+ size_t len2 = strlen(hwrev);
+ if ( len1 + len2 + 2 <
sizeof(hwrevs) ) {
+ hwrevs[len1] = ',';
+ memcpy(hwrevs+len1+1,
hwrev, len2+1);
+ }
}
VERBOSE(" hw revision: %s\n",
hwrev);
pbuf += strlen(hwrev) + 1;
@@ -410,6 +413,7 @@
WRITE_OR_FAIL(file, fd, "2", 1); /* 2 - device & hwrevs
*/
WRITE_OR_FAIL(file, fd, &device_hwrevs_bufs[i][0], 1);
WRITE_OR_FAIL(file, fd, device_hwrevs_bufs[i]+1,
((uint8_t *)(device_hwrevs_bufs[i]))[0]);
+ /* FIXME: memory leak: device_hwrevs_bufs */
}
free(device_hwrevs_bufs);
@@ -449,9 +453,9 @@
int fiasco_unpack(struct fiasco * fiasco, const char * dir) {
- int fd = -1;
- char * name = NULL;
- char * layout_name = NULL;
+ int fd;
+ char * name;
+ char * layout_name;
struct image * image;
struct image_list * image_list;
uint32_t size;
@@ -480,6 +484,10 @@
while ( image_list ) {
+ fd = -1;
+ name = NULL;
+ layout_name = NULL;
+
image = image_list->image;
name = image_name_alloc_from_values(image);
@@ -492,9 +500,11 @@
if ( image->layout ) {
- layout_name = calloc(1, strlen(name) +
strlen(".layout") + 1);
- if ( ! layout_name )
+ layout_name = calloc(1, strlen(name) +
sizeof(".layout")-1 + 1);
+ if ( ! layout_name ) {
+ free(name);
ALLOC_ERROR_RETURN(-1);
+ }
sprintf(layout_name, "%s.layout", name);
@@ -508,21 +518,32 @@
fd = open(name, O_RDWR|O_CREAT|O_TRUNC, 0644);
if ( fd < 0 ) {
ERROR_INFO("Cannot create output file %s",
name);
+ free(name);
+ free(layout_name);
return -1;
}
}
- free(name);
-
image_seek(image, 0);
while ( 1 ) {
size = image_read(image, buf, sizeof(buf));
if ( size == 0 )
break;
- WRITE_OR_FAIL(name, fd, buf, size);
+ if ( ! simulate ) {
+ if ( write(fd, buf, size) != (ssize_t)size ) {
+ ERROR_INFO_STR(name, "Cannot write %d
bytes", size);
+ close(fd);
+ free(name);
+ free(layout_name);
+ return -1;
+ }
+ }
}
- close(fd);
+ free(name);
+
+ if ( ! simulate )
+ close(fd);
if ( image->layout ) {
@@ -530,15 +551,24 @@
fd = open(layout_name, O_RDWR|O_CREAT|O_TRUNC,
0644);
if ( fd < 0 ) {
ERROR_INFO("Cannot create layout file
%s", layout_name);
+ free(layout_name);
+ return -1;
+ }
+
+ size = strlen(image->layout);
+
+ if ( write(fd, image->layout, size) !=
(ssize_t)size ) {
+ ERROR_INFO_STR(layout_name, "Cannot
write %d bytes", size);
+ close(fd);
+ free(layout_name);
return -1;
}
}
free(layout_name);
- WRITE_OR_FAIL(layout_name, fd, image->layout,
(int)strlen(image->layout));
-
- close(fd);
+ if ( ! simulate )
+ close(fd);
}
diff -Nru 0xffff-0.6/src/image.c 0xffff-0.6.1/src/image.c
--- 0xffff-0.6/src/image.c 2014-05-10 22:39:47.000000000 +0200
+++ 0xffff-0.6.1/src/image.c 2014-11-18 23:23:23.000000000 +0100
@@ -88,14 +88,13 @@
if ( image->devices && image->devices->device && !
image->devices->hwrevs )
image->devices->hwrevs = hwrevs_alloc_from_string(hwrevs);
- else
- free(hwrevs);
if ( ! image->version )
image->version = version;
else
free(version);
+ free(hwrevs);
free(str);
}
@@ -135,8 +134,10 @@
length += 1 + strlen(image->version);
name = calloc(1, length);
- if ( ! name )
+ if ( ! name ) {
+ free(hwrevs);
ALLOC_ERROR_RETURN(NULL);
+ }
strcpy(name, type);
ptr = name + strlen(name);
diff -Nru 0xffff-0.6/src/local.c 0xffff-0.6.1/src/local.c
--- 0xffff-0.6/src/local.c 2014-05-10 22:39:47.000000000 +0200
+++ 0xffff-0.6.1/src/local.c 2014-11-18 23:23:23.000000000 +0100
@@ -127,9 +127,9 @@
while ( fgets(buf, sizeof(buf), file) ) {
- if ( strncmp(buf, "Hardware", strlen("Hardware")) == 0 ) {
+ if ( strncmp(buf, "Hardware", sizeof("Hardware")-1) == 0 ) {
- ptr = buf + strlen("Hardware");
+ ptr = buf + sizeof("Hardware")-1;
while ( ptr < buf + sizeof(buf) && *ptr > 0 && *ptr <=
32 )
++ptr;
@@ -316,21 +316,23 @@
while ( ( dirent = readdir(dir) ) ) {
- snprintf(buf, sizeof(buf),
"/sys/class/mmc_host/%s/slot_name", dirent->d_name);
+ if ( snprintf(buf, sizeof(buf),
"/sys/class/mmc_host/%s/slot_name", dirent->d_name) <= 0 )
+ continue;
fd = open(buf, O_RDONLY);
if ( fd < 0 )
continue;
- buf[0] = 0;
- if ( read(fd, buf, sizeof(buf)) < 0 )
+ memset(buf, 0, sizeof(buf));
+ if ( read(fd, buf, sizeof(buf)-1) < 0 )
buf[0] = 0;
close(fd);
- if ( strncmp(buf, "internal", strlen("internal")) != 0 )
+ if ( strncmp(buf, "internal", sizeof("internal")-1) !=
0 )
continue;
- snprintf(buf, sizeof(buf),
"/sys/class/mmc_host/%s/%s:0001/", dirent->d_name, dirent->d_name);
+ if ( snprintf(buf, sizeof(buf),
"/sys/class/mmc_host/%s/%s:0001/", dirent->d_name, dirent->d_name) <= 0 )
+ continue;
dir2 = opendir(buf);
if ( ! dir2 )
@@ -338,10 +340,11 @@
while ( ( dirent2 = readdir(dir2) ) ) {
- if ( strncmp(dirent2->d_name, "block:mmcblk",
strlen("block:mmcblk")) != 0 )
+ if ( strncmp(dirent2->d_name, "block:mmcblk",
sizeof("block:mmcblk")-1) != 0 )
continue;
- snprintf(buf, sizeof(buf),
"/sys/class/mmc_host/%s/%s:0001/%s/dev", dirent->d_name, dirent->d_name,
dirent2->d_name);
+ if ( snprintf(buf, sizeof(buf),
"/sys/class/mmc_host/%s/%s:0001/%s/dev", dirent->d_name, dirent->d_name,
dirent2->d_name) <= 0 )
+ continue;
f = fopen(buf, "r");
if ( ! f )
@@ -385,7 +388,8 @@
while ( ( dirent = readdir(dir) ) ) {
- snprintf(buf, sizeof(buf), "/dev/%s", dirent->d_name);
+ if ( snprintf(buf, sizeof(buf), "/dev/%s",
dirent->d_name) <= 0 )
+ continue;
if ( stat(buf, &st) != 0 )
continue;
@@ -410,7 +414,7 @@
VERBOSE("Detected internal mmc device: '%s'\n", blk);
- strncat(blk, "p1", sizeof(blk));
+ strncat(blk, "p1", sizeof(blk)-strlen(blk)-1);
printf("Using MyDocs mmc device: '%s'\n", blk);
@@ -457,6 +461,10 @@
if ( addr[nlen-1] != 0xFF )
break;
+ for ( ; nlen > 0; --nlen )
+ if ( addr[nlen-1] != 0x00 )
+ break;
+
if ( image == IMAGE_MMC )
align = 8;
else
@@ -532,7 +540,7 @@
int local_get_rd_mode(void) {
- if ( strncmp(rd_mode, "master", strlen("master")) == 0 )
+ if ( strncmp(rd_mode, "master", sizeof("master")-1) == 0 )
return 1;
else
return 0;
@@ -551,8 +559,8 @@
const char * ptr;
- if ( strncmp(rd_mode, "master", strlen("master")) == 0 )
- ptr = rd_mode + strlen("master");
+ if ( strncmp(rd_mode, "master", sizeof("master")-1) == 0 )
+ ptr = rd_mode + sizeof("master")-1;
else
ptr = rd_mode;
diff -Nru 0xffff-0.6/src/main.c 0xffff-0.6.1/src/main.c
--- 0xffff-0.6/src/main.c 2014-05-10 22:39:47.000000000 +0200
+++ 0xffff-0.6.1/src/main.c 2014-11-18 23:23:23.000000000 +0100
@@ -53,8 +53,8 @@
" -f flash all specified images\n"
" -c cold flash 2nd and secondary images\n"
" -x [/dev/mtd] check for bad blocks on mtd device (default:
all)\n"
- " -E file dump all device images to one fiasco image,
see -t\n"
- " -e [dir] dump all device images to directory, see -t
(default: current)\n"
+ " -E file dump all device images to one fiasco image\n"
+ " -e [dir] dump all device images (or one -t) to
directory (default: current)\n"
"\n"
"Device configuration:\n"
@@ -84,7 +84,7 @@
"\n"
"Image filters:\n"
- " -t types filter images by type\n"
+ " -t type filter images by type\n"
" -d dev filter images by device\n"
" -w hw filter images by HW revision\n"
"\n"
@@ -210,7 +210,7 @@
exit(1);
}
lseek(fd, 0, SEEK_SET);
- layout = malloc(len);
+ layout = malloc(len+1);
if ( ! layout ) {
ALLOC_ERROR();
exit(1);
@@ -219,6 +219,8 @@
ERROR_INFO("Cannot read %lu bytes from layout file %s",
len, layout_file);
exit(1);
}
+ layout[len] = 0;
+ close(fd);
}
image = image_alloc_from_file(file, type, device, hwrevs, version,
layout);
@@ -661,6 +663,9 @@
goto clean;
}
filter_images_by_type(type, &image_first);
+ /* make sure that fiasco_in has valid images */
+ if ( fiasco_in )
+ fiasco_in->first = image_first;
}
/* filter images by device */
@@ -672,11 +677,18 @@
goto clean;
}
filter_images_by_device(device, &image_first);
+ /* make sure that fiasco_in has valid images */
+ if ( fiasco_in )
+ fiasco_in->first = image_first;
}
/* filter images by hwrev */
- if ( filter_hwrev )
+ if ( filter_hwrev ) {
filter_images_by_hwrev(atoi(filter_hwrev_arg), &image_first);
+ /* make sure that fiasco_in has valid images */
+ if ( fiasco_in )
+ fiasco_in->first = image_first;
+ }
/* reorder images for flashing (first x-loader, second secondary) */
/* set 2nd and secondary images for cold-flashing */
@@ -740,11 +752,29 @@
image_ptr = next;
}
+ /* make sure that fiasco_in has valid images */
+ if ( fiasco_in )
+ fiasco_in->first = image_first;
+
}
- /* make sure that fiasco_in has valid images*/
- if ( fiasco_in )
- fiasco_in->first = image_first;
+ /* remove 2nd image when doing normal flash */
+ if ( dev_flash ) {
+ image_ptr = image_first;
+ while ( image_ptr ) {
+ struct image_list * next = image_ptr->next;
+ if ( image_ptr->image->type == IMAGE_2ND ) {
+ if ( image_ptr == image_first )
+ image_first = next;
+ image_list_del(image_ptr);
+ }
+ image_ptr = next;
+ }
+
+ /* make sure that fiasco_in has valid images */
+ if ( fiasco_in )
+ fiasco_in->first = image_first;
+ }
/* identify images */
if ( image_ident ) {
@@ -782,8 +812,9 @@
WARNING("Removing unknown image (specified by %s %s)",
image_ptr->image->orig_filename ? "file" : "fiasco",
image_ptr->image->orig_filename ? image_ptr->image->orig_filename : "image");
if ( image_ptr == image_first )
image_first = next;
- image_list_unlink(image_ptr);
- free(image_ptr);
+ if ( fiasco_in && image_ptr == fiasco_in->first )
+ fiasco_in->first = fiasco_in->first->next;
+ image_list_del(image_ptr);
}
image_ptr = next;
}
@@ -983,6 +1014,8 @@
filter_images_by_device(dev->detected_device,
&image_first);
if ( detected_hwrev )
filter_images_by_hwrev(dev->detected_hwrev,
&image_first);
+ if ( fiasco_in && ( detected_device || detected_hwrev )
)
+ fiasco_in->first = image_first;
/* set kernel and initfs images for loading */
if ( dev_load ) {
@@ -1047,8 +1080,7 @@
if ( fiasco_in && image_kernel ==
fiasco_in->first )
fiasco_in->first =
fiasco_in->first->next;
- image_list_unlink(image_kernel);
- free(image_kernel);
+ image_list_del(image_kernel);
image_kernel = NULL;
}
@@ -1059,11 +1091,10 @@
if ( image_initfs == image_first )
image_first = image_first->next;
- if ( fiasco_in && image_kernel ==
fiasco_in->first )
+ if ( fiasco_in && image_initfs ==
fiasco_in->first )
fiasco_in->first =
fiasco_in->first->next;
- image_list_unlink(image_initfs);
- free(image_initfs);
+ image_list_del(image_initfs);
image_initfs = NULL;
}
}
@@ -1079,11 +1110,10 @@
if ( image_ptr == image_first )
image_first = image_first->next;
- if ( fiasco_in && image_kernel ==
fiasco_in->first )
+ if ( fiasco_in && image_ptr ==
fiasco_in->first )
fiasco_in->first =
fiasco_in->first->next;
- image_list_unlink(image_ptr);
- free(image_ptr);
+ image_list_del(image_ptr);
image_ptr = next;
}
}
@@ -1175,9 +1205,21 @@
buf[0] = 0;
}
- for ( i = 0; i < IMAGE_COUNT; ++i )
- if ( image_tmp_name(i) )
- dev_dump_image(dev, i,
image_tmp_name(i));
+ if ( filter_type ) {
+ enum image_type type =
image_type_from_string(filter_type_arg);
+ if ( ! type || ! image_tmp_name(type) )
{
+ ERROR("Specified unknown image
type for filtering: %s", filter_type_arg);
+ ret = 1;
+ goto clean;
+ }
+ ret = dev_dump_image(dev, type,
image_tmp_name(type));
+ if ( ret != 0 )
+ goto clean;
+ } else {
+ for ( i = 0; i < IMAGE_COUNT; ++i )
+ if ( image_tmp_name(i) )
+ dev_dump_image(dev, i,
image_tmp_name(i));
+ }
if ( buf[0] )
if ( chdir(buf) < 0 )
@@ -1196,7 +1238,8 @@
if ( ! image_tmp_name(i) )
continue;
- sprintf(buf, "%hd",
dev->detected_hwrev);
+ buf[0] = 0;
+ snprintf(buf, sizeof(buf), "%hd",
dev->detected_hwrev);
switch ( i ) {
case IMAGE_2ND:
@@ -1298,14 +1341,16 @@
break;
}
- sprintf(buf, "%s-%s:%hd_%s",
image_type_to_string(i), device_to_string(dev->detected_device),
dev->detected_hwrev, ptr);
+ 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);
printf("Renaming %s image file to
%s...\n", image_type_to_string(i), buf);
if ( rename(image_tmp_name(i), buf) < 0
) {
ERROR_INFO("Renaming failed");
- sprintf(buf, "%s-%s_%s",
image_type_to_string(i), device_to_string(dev->detected_device), ptr);
+ buf[0] = 0;
+ snprintf(buf, sizeof(buf),
"%s-%s_%s", image_type_to_string(i), device_to_string(dev->detected_device),
ptr);
printf("Trying to rename %s
image file to %s...\n", image_type_to_string(i), buf);
if ( rename(image_tmp_name(i),
buf) < 0 )
diff -Nru 0xffff-0.6/src/Makefile 0xffff-0.6.1/src/Makefile
--- 0xffff-0.6/src/Makefile 2014-05-10 22:39:47.000000000 +0200
+++ 0xffff-0.6.1/src/Makefile 2014-11-18 23:23:23.000000000 +0100
@@ -31,10 +31,10 @@
mv $@.tmp $@
libusb-sniff-32.so: libusb-sniff.c $(DEPENDS)
- $(CC) $(CFLAGS) $(LDFLAGS) -fPIC -ldl -shared -m32 -o $@ $<
+ $(CC) $(CFLAGS) $(LDFLAGS) -fPIC $< -ldl -shared -m32 -o $@
libusb-sniff-64.so: libusb-sniff.c $(DEPENDS)
- $(CC) $(CFLAGS) $(LDFLAGS) -fPIC -ldl -shared -m64 -o $@ $<
+ $(CC) $(CFLAGS) $(LDFLAGS) -fPIC $< -ldl -shared -m64 -o $@
%.o: %.c $(DEPENDS)
$(CROSS_CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
diff -Nru 0xffff-0.6/src/nolo.c 0xffff-0.6.1/src/nolo.c
--- 0xffff-0.6/src/nolo.c 2014-05-10 22:39:47.000000000 +0200
+++ 0xffff-0.6.1/src/nolo.c 2014-11-18 23:23:23.000000000 +0100
@@ -84,12 +84,14 @@
char buf[2048];
size_t i, count;
+ int ret;
for ( count = 0; count < 20; ++count ) {
memset(buf, 0, sizeof(buf));
- if ( usb_control_msg(dev->udev, NOLO_QUERY, NOLO_ERROR_LOG, 0,
0, buf, sizeof(buf), 2000) <= 0 )
+ ret = usb_control_msg(dev->udev, NOLO_QUERY, NOLO_ERROR_LOG, 0,
0, buf, sizeof(buf), 2000);
+ if ( ret < 0 )
break;
if ( ! only_clear ) {
@@ -103,6 +105,9 @@
}
+ if ( (size_t)ret < sizeof(buf) )
+ break;
+
}
}
@@ -176,14 +181,14 @@
if ( strlen(str) > 500 )
return -1;
- sprintf(buf, "version:%s", str);
+ if ( sprintf(buf, "version:%s", str) <= 0 )
+ return -1;
ret = nolo_get_string(dev, buf, out, size);
-
- nolo_error_log(dev, 1);
-
- if ( ret < 0 )
+ if ( ret < 0 ) {
+ nolo_error_log(dev, 1);
return ret;
+ }
if ( ! out[0] )
return -1;
@@ -311,7 +316,7 @@
if ( bufs ) {
memset(buf, 0, sizeof(buf));
- snprintf(buf, 8, "%d", dev->hwrev);
+ snprintf(buf, 8+1, "%d", dev->hwrev);
for ( i = 0; bufs[i]; ++i ) {
len = ((uint8_t*)bufs[i])[0];
@@ -418,8 +423,8 @@
unsigned long long int part;
unsigned long long int total;
unsigned long long int last_total;
- char status[20];
char buf[128];
+ char * ptr;
if ( image->type == IMAGE_ROOTFS )
flash = 1;
@@ -463,7 +468,7 @@
if ( nolo_get_string(dev, "cmt:status", buf, sizeof(buf)) < 0 )
NOLO_ERROR_RETURN("cmt:status failed", -1);
- if ( strncmp(buf, "idle", strlen("idle")) == 0 )
+ if ( strncmp(buf, "idle", sizeof("idle")-1) == 0 )
state = 4;
else
printf("Erasing CMT...\n");
@@ -475,7 +480,7 @@
NOLO_ERROR_RETURN("cmt:status failed", -1);
}
- if ( strncmp(buf, "finished", strlen("finished")) == 0
) {
+ if ( strncmp(buf, "finished", sizeof("finished")-1) ==
0 ) {
if ( state <= 0 ) {
printf_progressbar(last_total,
last_total);
@@ -490,18 +495,29 @@
state = 4;
+ } else if ( strncmp(buf, "error", sizeof("error")-1) ==
0 ) {
+
+ PRINTF_ERROR_RETURN("cmt:status error", -1);
+
} else {
- if ( sscanf(buf, "%s:%llu/%llu", status, &part,
&total) != 3 )
+ ptr = strchr(buf, ':');
+ if ( ! ptr )
+ PRINTF_ERROR_RETURN("cmt:status
unknown", -1);
+
+ *ptr = 0;
+ ptr++;
+
+ if ( sscanf(ptr, "%llu/%llu", &part, &total) !=
2 )
PRINTF_ERROR_RETURN("cmt:status
unknown", -1);
- if ( strcmp(status, "program") == 0 && state <=
0 ) {
+ if ( strcmp(buf, "program") == 0 && state <= 0
) {
printf_progressbar(last_total,
last_total);
printf("Done\n");
state = 1;
}
- if ( strcmp(status, "program") == 0 && state <=
1 ) {
+ if ( strcmp(buf, "program") == 0 && state <= 1
) {
printf("Programming CMT...\n");
state = 2;
}
@@ -509,12 +525,12 @@
printf_progressbar(part, total);
last_total = total;
- if ( strcmp(status, "erase") == 0 && state <= 0
&& part == total ) {
+ if ( strcmp(buf, "erase") == 0 && state <= 0 &&
part == total ) {
printf("Done\n");
state = 1;
}
- if ( strcmp(status, "program") == 0 && state <=
2 && part == total ) {
+ if ( strcmp(buf, "program") == 0 && state <= 2
&& part == total ) {
printf("Done\n");
state = 3;
}
@@ -536,9 +552,9 @@
int size = 0;
int mode = NOLO_BOOT_MODE_NORMAL;
- if ( cmdline && strncmp(cmdline, "update", strlen("update")) == 0 &&
cmdline[strlen("update")] <= 32 ) {
+ if ( cmdline && strncmp(cmdline, "update", sizeof("update")-1) == 0 &&
cmdline[sizeof("update")-1] <= 32 ) {
mode = NOLO_BOOT_MODE_UPDATE;
- cmdline += strlen("update");
+ cmdline += sizeof("update")-1;
if ( *cmdline ) ++cmdline;
while ( *cmdline && *cmdline <= 32 )
++cmdline;
@@ -763,7 +779,7 @@
char buf[9];
memset(buf, 0, sizeof(buf));
- snprintf(buf, 8, "%d", hwrev);
+ snprintf(buf, sizeof(buf), "%d", hwrev);
printf("Setting HW revision to: %s\n", buf);
return nolo_set_string(dev, "hw_rev", buf);
diff -Nru 0xffff-0.6/src/printf-utils.c 0xffff-0.6.1/src/printf-utils.c
--- 0xffff-0.6/src/printf-utils.c 2014-05-10 22:39:47.000000000 +0200
+++ 0xffff-0.6.1/src/printf-utils.c 2014-11-18 23:23:23.000000000 +0100
@@ -39,7 +39,7 @@
int tmp, cols = 80;
/* percentage calculation */
- pc = (int)(part*100/total);
+ pc = total==0?100:(int)(part*100/total);
(pc<0)?pc=0:(pc>100)?pc=100:0;
PRINTF_BACK();
diff -Nru 0xffff-0.6/src/usb-device.c 0xffff-0.6.1/src/usb-device.c
--- 0xffff-0.6/src/usb-device.c 2014-05-10 22:39:47.000000000 +0200
+++ 0xffff-0.6.1/src/usb-device.c 2014-11-18 23:23:23.000000000 +0100
@@ -27,6 +27,10 @@
#include <usb.h>
+#ifdef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP
+#include <sys/ioctl.h>
+#endif
+
#include "global.h"
#include "device.h"
#include "usb-device.h"
@@ -73,6 +77,25 @@
}
+static void usb_reattach_kernel_driver(usb_dev_handle * udev, int interface) {
+
+#ifdef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP
+ struct {
+ int ifno;
+ int ioctl_code;
+ void * data;
+ } command = {
+ .ifno = interface,
+ .ioctl_code = _IO('U', 23),
+ .data = NULL,
+ };
+
+ usb_release_interface(udev, interface);
+ ioctl(*((int *)udev), _IOWR('U', 18, command), &command);
+#endif
+
+}
+
static void usb_descriptor_info_print(usb_dev_handle * udev, struct usb_device
* dev, char * product, size_t size) {
char buf[1024];
@@ -145,6 +168,7 @@
if ( usb_claim_interface(udev,
usb_devices[i].interface) < 0 ) {
PRINTF_ERROR("usb_claim_interface failed");
fprintf(stderr, "\n");
+ usb_reattach_kernel_driver(udev,
usb_devices[i].interface);
usb_close(udev);
return NULL;
}
@@ -154,6 +178,7 @@
if ( usb_set_altinterface(udev,
usb_devices[i].alternate) < 0 ) {
PRINTF_ERROR("usb_claim_interface
failed");
fprintf(stderr, "\n");
+ usb_reattach_kernel_driver(udev,
usb_devices[i].interface);
usb_close(udev);
return NULL;
}
@@ -164,6 +189,7 @@
if ( usb_set_configuration(udev,
usb_devices[i].configuration) < 0 ) {
PRINTF_ERROR("usb_set_configuration
failed");
fprintf(stderr, "\n");
+ usb_reattach_kernel_driver(udev,
usb_devices[i].interface);
usb_close(udev);
return NULL;
}
@@ -172,6 +198,7 @@
ret = calloc(1, sizeof(struct usb_device_info));
if ( ! ret ) {
ALLOC_ERROR();
+ usb_reattach_kernel_driver(udev,
usb_devices[i].interface);
usb_close(udev);
return NULL;
}
@@ -197,7 +224,9 @@
if ( ! *device ) {
ERROR("Device mishmash");
fprintf(stderr, "\n");
+ usb_reattach_kernel_driver(udev,
usb_devices[i].interface);
usb_close(udev);
+ free(ret);
return NULL;
}
}
@@ -308,6 +337,7 @@
void usb_close_device(struct usb_device_info * dev) {
+ usb_reattach_kernel_driver(dev->udev, dev->flash_device->interface);
usb_close(dev->udev);
free(dev);
diff -Nru 0xffff-0.6/.travis.yml 0xffff-0.6.1/.travis.yml
--- 0xffff-0.6/.travis.yml 1970-01-01 01:00:00.000000000 +0100
+++ 0xffff-0.6.1/.travis.yml 2014-11-18 23:23:23.000000000 +0100
@@ -0,0 +1,20 @@
+language: c
+compiler:
+ - gcc
+before_install:
+ - sudo apt-get update -qq
+ - sudo apt-get install -qq -y libusb-dev
+script: if [ ${COVERITY_SCAN_BRANCH} != 1 ]; then make ; fi
+
+env:
+ global:
+ - secure:
"JdUp+xFykPZoYA4aRfmYk2CtilLapniQllWPKo2dDdJd1vzdawfTvVxIAKjy7ac9RKwZzg3Chq3RsMEXPv8BtaLbssw266C7RDLMgjacl1eFLcmGRj/Gkk9peDSZ6vVdGEcA2j+6KDSfpCa/XjFjvOufZOgKw6m+3+d0A4G45SI="
+
+addons:
+ coverity_scan:
+ project:
+ name: "pali/0xFFFF"
+ description: "Build submitted via Travis CI"
+ notification_email: pali.ro...@gmail.com
+ build_command: "make"
+ branch_pattern: master
--- End Message ---