summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2018-10-01 02:32:51 +0200
committerGravatar Nikias Bassen2018-10-01 02:32:51 +0200
commitb34e3435c21d06b3e5a4e7b5246fb6ddb6641a9f (patch)
tree89b78560cd956b956a03c9b207816d8cb345c37e /common
parentf1ee0fd8b2b1dd65c64f5a67e208efc708295caa (diff)
downloadlibimobiledevice-b34e3435c21d06b3e5a4e7b5246fb6ddb6641a9f.tar.gz
libimobiledevice-b34e3435c21d06b3e5a4e7b5246fb6ddb6641a9f.tar.bz2
tools: Remove length check on device UDID arguments to support newer devices
The 40 characters length check on the device UDID made newer devices unusable with the libimobiledevice tools and was actually redundant since an invalid UDID will always fail to resolve. This commit removes the length check alltogether (but makes sure it is not an empty string "").
Diffstat (limited to 'common')
-rw-r--r--common/userpref.c53
1 files changed, 24 insertions, 29 deletions
diff --git a/common/userpref.c b/common/userpref.c
index 0fa5b96..b985285 100644
--- a/common/userpref.c
+++ b/common/userpref.c
@@ -208,14 +208,8 @@ int userpref_read_system_buid(char **system_buid)
208 */ 208 */
209userpref_error_t userpref_get_paired_udids(char ***list, unsigned int *count) 209userpref_error_t userpref_get_paired_udids(char ***list, unsigned int *count)
210{ 210{
211 struct slist_t {
212 char *name;
213 void *next;
214 };
215 DIR *config_dir; 211 DIR *config_dir;
216 const char *config_path = NULL; 212 const char *config_path = NULL;
217 struct slist_t *udids = NULL;
218 unsigned int i;
219 unsigned int found = 0; 213 unsigned int found = 0;
220 214
221 if (!list || (list && *list)) { 215 if (!list || (list && *list)) {
@@ -226,41 +220,42 @@ userpref_error_t userpref_get_paired_udids(char ***list, unsigned int *count)
226 if (count) { 220 if (count) {
227 *count = 0; 221 *count = 0;
228 } 222 }
223 *list = (char**)malloc(sizeof(char*));
229 224
230 config_path = userpref_get_config_dir(); 225 config_path = userpref_get_config_dir();
231 config_dir = opendir(config_path); 226 config_dir = opendir(config_path);
232 if (config_dir) { 227 if (config_dir) {
233 struct dirent *entry; 228 struct dirent *entry;
234 struct slist_t *listp = udids;
235 while ((entry = readdir(config_dir))) { 229 while ((entry = readdir(config_dir))) {
236 char *ext = strstr(entry->d_name, USERPREF_CONFIG_EXTENSION); 230 if (strcmp(entry->d_name, USERPREF_CONFIG_FILE) == 0) {
237 if (ext && ((ext - entry->d_name) == 40) && (strlen(entry->d_name) == (40 + strlen(ext)))) { 231 /* ignore SystemConfiguration.plist */
238 struct slist_t *ne = (struct slist_t*)malloc(sizeof(struct slist_t)); 232 continue;
239 ne->name = (char*)malloc(41); 233 }
240 strncpy(ne->name, entry->d_name, 40); 234 char *ext = strrchr(entry->d_name, '.');
241 ne->name[40] = 0; 235 if (ext && (strcmp(ext, USERPREF_CONFIG_EXTENSION) == 0)) {
242 ne->next = NULL; 236 size_t len = strlen(entry->d_name) - strlen(USERPREF_CONFIG_EXTENSION);
243 if (!listp) { 237 char **newlist = (char**)realloc(*list, sizeof(char*) * (found+2));
244 listp = ne; 238 if (!newlist) {
245 udids = listp; 239 fprintf(stderr, "ERROR: Out of memory\n");
246 } else { 240 break;
247 listp->next = ne; 241 }
248 listp = listp->next; 242 *list = newlist;
243 char *tmp = (char*)malloc(len+1);
244 if (tmp) {
245 strncpy(tmp, entry->d_name, len);
246 tmp[len] = '\0';
247 }
248 (*list)[found] = tmp;
249 if (!tmp) {
250 fprintf(stderr, "ERROR: Out of memory\n");
251 break;
249 } 252 }
250 found++; 253 found++;
251 } 254 }
252 } 255 }
253 closedir(config_dir); 256 closedir(config_dir);
254 } 257 }
255 *list = (char**)malloc(sizeof(char*) * (found+1)); 258 (*list)[found] = NULL;
256 i = 0;
257 while (udids) {
258 (*list)[i++] = udids->name;
259 struct slist_t *old = udids;
260 udids = udids->next;
261 free(old);
262 }
263 (*list)[i] = NULL;
264 259
265 if (count) { 260 if (count) {
266 *count = found; 261 *count = found;