diff options
author | Marcus Meissner <marcus@jet.franken.de> | 2016-10-24 22:42:38 +0200 |
---|---|---|
committer | Marcus Meissner <marcus@jet.franken.de> | 2016-10-24 22:42:38 +0200 |
commit | f93179d24096b511bce0db6b06d473c950c07ca3 (patch) | |
tree | 0663c747466a4e26222a1dc94d31a1d61a9bdcdd | |
parent | bd1f9d1cd0231cd887eb1e7008ae195473850665 (diff) | |
download | libmtp-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.c | 23 |
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; |