From: <svn...@op...> - 2009-04-29 08:05:58
|
Author: bellmich Date: Wed Apr 29 10:05:49 2009 New Revision: 1075 URL: http://libsyncml.opensync.org/changeset/1075 Log: patch for ticket #233 (sanitized item UIDs) Modified: trunk/tools/syncml-ds-tool.c Modified: trunk/tools/syncml-ds-tool.c ============================================================================== --- trunk/tools/syncml-ds-tool.c Wed Apr 29 09:27:17 2009 (r1074) +++ trunk/tools/syncml-ds-tool.c Wed Apr 29 10:05:49 2009 (r1075) @@ -513,6 +513,24 @@ exit(3); } +static char * getSafeFilename(const char *filename) +{ + SmlBool clean = TRUE; + size_t i; + for (i=0; i < strlen(filename); i++) + { + if (!g_ascii_isalnum(filename[i]) && + filename[i] != '-' && + filename[i] != '_') + clean = FALSE; + } + if (clean) { + return g_strdup(filename); + } else { + return g_base64_encode((const unsigned char *) filename, strlen(filename)); + } +} + static SmlBool recvChangeCallback( SmlDataSyncObject *dsObject, const char *source, @@ -547,10 +565,11 @@ if (datastore->directory) { printf("Writing item %s to directory %s.\n", uid, datastore->directory); /* prepare absolute filenames */ - absolute_uid = g_strdup_printf("%s/%s", datastore->directory, uid); + char *safeUID = getSafeFilename(uid); + absolute_uid = g_strdup_printf("%s/%s", datastore->directory, safeUID); absolute_status = g_strdup_printf("%s/%s", datastore->directory, STATUS_FILENAME); /* sanity check for uid */ - if (!strcmp(uid, STATUS_FILENAME)) + if (!strcmp(safeUID, STATUS_FILENAME)) { smlErrorSet(error, SML_ERROR_GENERIC, "The filename %s cannot be used as UID. This is a potential attack.", @@ -560,6 +579,8 @@ STATUS_FILENAME); goto error; } + smlSafeCFree(&safeUID); + /* cache that the remote device knows the uid */ if (datastore->remoteHash) { g_hash_table_insert(datastore->remoteHash, g_strdup(absolute_uid), (char *)"1"); |