Module: sip-router Branch: 3.1 Commit: f3690cfddd08f43d7afb651a8d9f05b31e2174c2 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=f3690cfd...
Author: Timo Teräs timo.teras@iki.fi Committer: Timo Teräs timo.teras@iki.fi Date: Wed Apr 6 09:33:10 2011 +0300
modules_k/uac: fix from/to restore for small original URI
Seems that the URI length check is superfluous and fails under certain conditions. It does not make sense for the URI to have zero bytes, so just use the first seen zero byte as end marker.
I have a reproducible test case where the restore inserts URI with multiple zero-bytes to wire. This happens if the original URI is smaller than the one we rewrote it to using uac_replace_from. (cherry picked from commit e1d1c774c9ac0b4d9103f4a1c5e9b550adbb2f38)
---
modules_k/uac/from.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/modules_k/uac/from.c b/modules_k/uac/from.c index 4657e11..50822b6 100644 --- a/modules_k/uac/from.c +++ b/modules_k/uac/from.c @@ -463,15 +463,17 @@ int restore_from( struct sip_msg *msg, int *is_from ) LM_ERR("new URI shorter than old URI\n"); goto failed; } - for( i=0 ; i<old_uri.len ; i++ ) + for( i=0 ; i<old_uri.len ; i++ ) { new_uri.s[i] ^= old_uri.s[i]; - if (new_uri.len==old_uri.len) { - for( ; new_uri.len && (new_uri.s[new_uri.len-1]==0) ; new_uri.len-- ); - if (new_uri.len==0) { - LM_ERR("new URI got 0 len\n"); - goto failed; + if (new_uri.s[i] == 0) { + new_uri.len = i; + break; } } + if (new_uri.len==0) { + LM_ERR("new URI got 0 len\n"); + goto failed; + }
LM_DBG("decoded uris are: new=[%.*s] old=[%.*s]\n", new_uri.len, new_uri.s, old_uri.len, old_uri.s);