]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
protection against malformed string
authorAnthony Minessale <anthony.minessale@gmail.com>
Sat, 10 Nov 2007 00:47:09 +0000 (00:47 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Sat, 10 Nov 2007 00:47:09 +0000 (00:47 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@6215 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/endpoints/mod_sofia/mod_sofia.h
src/mod/endpoints/mod_sofia/sofia.c
src/mod/endpoints/mod_sofia/sofia_glue.c

index f386d805e3cd17cc5fd27628ca49c17176449025..4a40273f7d4af4b7a26f61adce6aec10d7a92397 100644 (file)
@@ -506,3 +506,32 @@ sofia_gateway_t *sofia_reg_find_gateway__(const char *file, const char *func, in
 
 void sofia_reg_release_gateway__(const char *file, const char *func, int line, sofia_gateway_t *gateway);
 #define sofia_reg_release_gateway(x) sofia_reg_release_gateway__(__FILE__, __SWITCH_FUNC__, __LINE__, x);
+
+#define check_decode(_var, _session) do {                                                              \
+               assert(_session);                                                                                               \
+               if (!switch_strlen_zero(_var)) {                                                                \
+                       int d = 0;                                                                                                      \
+                       char *p;                                                                                                        \
+                       if (strchr(_var, '%')) {                                                                        \
+                               char *tmp = switch_core_session_strdup(_session, _var); \
+                               switch_url_decode(tmp);                                                                 \
+                               _var = tmp;                                                                                             \
+                               d++;                                                                                                    \
+                       }                                                                                                                       \
+                       if ((p = strchr(_var, '"'))) {                                                          \
+                               if (!d) {                                                                                               \
+                                       char *tmp = switch_core_session_strdup(_session, _var); \
+                                       _var = tmp;                                                                                     \
+                               }                                                                                                               \
+                               if ((p = strchr(_var, '"'))) {                                                  \
+                                       _var = p+1;                                                                                     \
+                               }                                                                                                               \
+                               if ((p = strrchr(_var, '"'))) {                                                 \
+                                       *p = '\0';                                                                                      \
+                               }                                                                                                               \
+                       }                                                                                                                       \
+               }                                                                                                                               \
+                                                                                                                                               \
+               if(_session) break;                                                                                             \
+       } while(!_session)
+          
index 1435b2ad13f392ec63219323bb55f1e2aacf97b0..436067444f42424111346a9cc59f8ada07d49f5a 100644 (file)
@@ -1787,16 +1787,6 @@ void sofia_handle_sip_i_info(nua_t *nua, sofia_profile_t *profile, nua_handle_t
        return;
 }
 
-#define check_decode(_var, _session) do {                                                              \
-               assert(_session);                                                                                               \
-               if (!switch_strlen_zero(_var) && strchr(_var, '%')) {                   \
-                       char *tmp = switch_core_session_strdup(_session, _var);         \
-                       switch_url_decode(tmp);                                                                         \
-                       _var = tmp;                                                                                                     \
-               }                                                                                                                               \
-               if(_session) break;                                                                                             \
-       } while(!_session)
-          
 
 #define url_set_chanvars(session, url, varprefix) _url_set_chanvars(session, url, #varprefix "_user", #varprefix "_host", #varprefix "_port", #varprefix "_uri")
 const char *_url_set_chanvars(switch_core_session_t *session, url_t *url, const char *user_var,
@@ -2144,6 +2134,7 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_
                dialplan = profile->dialplan;
        }
 
+       check_decode(displayname, session);
        tech_pvt->caller_profile = switch_caller_profile_new(switch_core_session_get_pool(session),
                                                                                                                 from_user,
                                                                                                                 dialplan,
index dbbdb0289a6bbb6d0702b940eb7dfbc700e0b07c..7a7e7129891a4fe945bd0eeee86c5df9a7372778 100644 (file)
@@ -498,6 +498,8 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session)
        cid_name = caller_profile->caller_id_name;
        cid_num = caller_profile->caller_id_number;
        sofia_glue_tech_prepare_codecs(tech_pvt);
+       check_decode(cid_name, session);
+       check_decode(cid_num, session);
 
        if (!tech_pvt->from_str) {
                tech_pvt->from_str = switch_core_session_sprintf(tech_pvt->session, "\"%s\" <sip:%s%s%s>",