summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Meissner <marcus@jet.franken.de>2016-10-24 22:42:38 +0200
committerMarcus Meissner <marcus@jet.franken.de>2016-10-24 22:42:38 +0200
commitf93179d24096b511bce0db6b06d473c950c07ca3 (patch)
tree0663c747466a4e26222a1dc94d31a1d61a9bdcdd
parentbd1f9d1cd0231cd887eb1e7008ae195473850665 (diff)
downloadlibmtp-f93179d24096b511bce0db6b06d473c950c07ca3.tar.gz
replace the major.version parsing logic by sscanf,
allow a non-minor entry (as seen on Samsung) https://sourceforge.net/p/libmtp/bugs/1593/
-rw-r--r--src/libmtp.c23
1 files changed, 7 insertions, 16 deletions
diff --git a/src/libmtp.c b/src/libmtp.c
index 665f334..98aba7a 100644
--- a/src/libmtp.c
+++ b/src/libmtp.c
@@ -1784,24 +1784,15 @@ static void parse_extension_descriptor(LIBMTP_mtpdevice_t *mtpdevice,
i++;
if (i < strlen(element)) {
char *name = strndup(element, i);
- int majstart = i+1;
- // printf(" Extension: \"%s\"\n", name);
+ int major = 0, minor = 0;
- /* Parse for minor/major punctuation mark for this extension */
- while ((i < strlen(element)) && (element[i] != '.'))
- i++;
- if (i > majstart && i < strlen(element)) {
+ /* extension versions have to be MAJOR.MINOR, but Samsung has one
+ * with just 0, so just cope with those cases too */
+ if ( (2 == sscanf(element+i+1,"%d.%d",&major,&minor)) ||
+ (1 == sscanf(element+i+1,"%d",&major))
+ ) {
LIBMTP_device_extension_t *extension;
- int major = 0;
- int minor = 0;
- char *majorstr = strndup(element + majstart, i - majstart);
- char *minorstr = strndup(element + i + 1, strlen(element) - i - 1);
- major = atoi(majorstr);
- minor = atoi(minorstr);
- // printf(" Major: \"%s\" (parsed %d) Minor: \"%s\" (parsed %d)\n",
- // majorstr, major, minorstr, minor);
- free(majorstr);
- free(minorstr);
+
extension = malloc(sizeof(LIBMTP_device_extension_t));
extension->name = name;
extension->major = major;