I am not a C developer so I have to guess here.

For me it looks like the `static` address of `buff` is returned by `ip_addr2a`.

```c
char *ip_addr2a(struct ip_addr *ip)
{
        static char buff[IP_ADDR_MAX_STR_SIZE];
        // ...
        return buff;
}
```

-- 
https://github.com/kamailio/kamailio/blob/1535031a6c992c23270050793b23d290a631b684/src/core/ip_addr.c#L267C1-L276C2

If that's the case, I think every user of that function should copy the value 
from that address instead of remembering the address. Otherwise it is always 
the same address for every call of `ip_addr2a` and subsequent calls overwrite 
the value of the previous call.

Unfortunately, the sipcapture module uses the returned value directly:
```c
si->address_str.s = ip_addr2a(&si->address);
```
-- 
https://github.com/kamailio/kamailio/blob/1535031a6c992c23270050793b23d290a631b684/src/modules/sipcapture/hep.c#L487C2-L487C46

I tested with the following code and I think it confirms my theory because 
`foo` changes to "bar".

```c
#include <stdio.h>
#include <string.h>

char *a(char* in);

int main() {
  char *foo = a("foo");
  printf("foo %08x -> %08x = %s\n", &foo, foo, foo);

  char *bar = a("bar");
  printf("foo %08x -> %08x = %s\n", &foo, foo, foo);
  printf("bar %08x -> %08x = %s\n", &bar, bar, bar);
}

char *a(char* in) {
  static char out[10];
  strcpy(out, in);
  return out;
}
```

Output:
```plain
foo 0c3399d8 -> b37ba018 = foo
foo 0c3399d8 -> b37ba018 = bar
bar 0c3399e0 -> b37ba018 = bar
```

However, I can't explain why this should be any different in previous kamailio 
versions.

-- 
Reply to this email directly or view it on GitHub:
https://github.com/kamailio/kamailio/issues/3835#issuecomment-2104328063
You are receiving this because you are subscribed to this thread.

Message ID: <kamailio/kamailio/issues/3835/2104328...@github.com>
_______________________________________________
Kamailio (SER) - Development Mailing List
To unsubscribe send an email to sr-dev-le...@lists.kamailio.org

Reply via email to