Changeset 492

Show
Ignore:
Timestamp:
07/15/08 12:25:00 (4 months ago)
Author:
bellmich
Message:

centralized session ID generation and made it safe for all situations

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libsyncml/sml_manager.c

    r490 r492  
    646646                        goto error; 
    647647                } 
    648                  
    649                 if (atoi(smlSessionGetSessionID(session)) > manager->lastSessionID) 
    650                         manager->lastSessionID = atoi(smlSessionGetSessionID(session)); 
    651648        } else { 
    652                 /* FIXME: This is critical because the session ID is predictable. */ 
    653                 g_warning("%s: Using predictable session numbering.", __func__); 
    654                 manager->lastSessionID++; 
    655                 char *lastid = g_strdup_printf("%i", manager->lastSessionID); 
     649                char *lastid = smlManagerGetNewSessionID(manager); 
    656650                smlSessionSetSessionID(session, lastid); 
    657651                smlSafeCFree(&lastid); 
     
    11741168        manager->localMaxObjSize = size; 
    11751169} 
     1170 
     1171char *smlManagerGetNewSessionID(SmlManager *manager) 
     1172{ 
     1173        smlTrace(TRACE_ENTRY, "%s(%p)", __func__, manager); 
     1174        smlAssertMsg(manager, "The manager is required to avoid duplicated session IDs."); 
     1175 
     1176        char *sessionString = NULL; 
     1177        while (sessionString == NULL) 
     1178        { 
     1179                /* create random session ID - glib only supports 32 bit random numbers */ 
     1180                guint64 sessionID = (((guint64) g_random_int ()) << 32) + g_random_int (); 
     1181                sessionString = g_strdup_printf("%llu", sessionID); 
     1182                smlTrace(TRACE_INTERNAL, "%s: new potential session ID is %llu.", __func__, sessionID); 
     1183                if (smlManagerSessionFind(manager, sessionString)) 
     1184                        smlSafeCFree(&sessionString); 
     1185        } 
     1186        smlTrace(TRACE_EXIT, "%s - %s", __func__, sessionString); 
     1187        return sessionString; 
     1188} 
  • trunk/libsyncml/sml_manager.h

    r486 r492  
    6969void smlManagerSetLocalMaxObjSize(SmlManager *manager, unsigned int size); 
    7070 
     71char *smlManagerGetNewSessionID(SmlManager *manager); 
     72 
    7173#endif //_SML_MANAGER_H 
  • trunk/libsyncml/sml_manager_internals.h

    r486 r492  
    2828         
    2929        GList *sessions; 
    30         unsigned int lastSessionID; 
    3130         
    3231        SmlManagerEventCb eventCallback; 
  • trunk/libsyncml/sml_notification.c

    r488 r492  
    337337                goto error_free_assm; 
    338338 
    339         guint64 sessionID = (((guint64) g_random_int ()) << 32) + g_random_int (); 
    340         char *sessionString = g_strdup_printf("%lu", sessionID); 
     339        char *sessionString = smlManagerGetNewSessionID(san->manager); 
    341340        SmlSession *session = smlSessionNew(san->sessionType, san->type, version, SML_PROTOCOL_SYNCML, san->target, source, sessionString, 0, error); 
    342341        if (!session) {