Bug#1063678: libmrss0: Memory leak while parsing an RSS2 feed

2024-03-31 Thread Mikhail Kot

Good day!

I can confirm that the bug is fixed in upstream, thanks.
Unfortunately, neither on Debian packages https://tracker.debian.org/pkg/libmrss
nor on Ubuntu packages https://packages.ubuntu.com/noble/libmrss0
I can't see the updated version. The one present (0.19.2-7) still contains a 
bug.

--
Mikhail :ะท



Bug#1063678: libmrss0: Memory leak while parsing an RSS2 feed

2024-02-10 Thread Mikhail Kot
Package: libmrss0
Version: 0.19.2-7
Severity: important
X-Debbugs-Cc: to-debian-...@myrrc.dev

Dear Maintainer,

I have found a bug in libmrss0 leading to memory leak on parsing some of
files. Please find the details attached.

For the following program:

```c
int main(int argc, char **argv) {
  (void)argc, (void)argv;
  mrss_t *doc = NULL;

  FILE *rss = fopen("rss.xml", "r");
  fseek(rss, 0, SEEK_END);
  long len = ftell(rss);
  rewind(rss);

  char *str = malloc(len + 1);
  fread(str, len, 1, rss);
  fclose(rss);
  str[len] = 0;

  mrss_parse_buffer(str, len, );
  mrss_free(doc);
  free(str);
  return 0;
}
```

built with

```
gcc -o out -fsanitize=address nxml_err.c -lmrss
```

Given rss.xml is `wget https://blog.demofox.org/rss.xml`,

ASan reports the following error:

```
=
==967975==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 3 byte(s) in 1 object(s) allocated from:
#0 0x7f87515749a7 in __interceptor_strdup 
../../../../src/libsanitizer/asan/asan_interceptors.cpp:454
#1 0x7f87511cec70 in nxmle_find_attribute 
(/lib/x86_64-linux-gnu/libnxml.so.0+0x5c70)

SUMMARY: AddressSanitizer: 3 byte(s) leaked in 1 allocation(s).
```

The issue also reproduces on different files. On some other files,
a bigger leak is reported.

```
=
==966721==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 376010 byte(s) in 18 object(s) allocated from:
#0 0x7ff5db6989a7 in __interceptor_strdup 
../../../../src/libsanitizer/asan/asan_interceptors.cpp:454
#1 0x7ff5dad73029 in nxml_get_string 
(/lib/x86_64-linux-gnu/libnxml.so.0+0x5029)

Direct leak of 3 byte(s) in 1 object(s) allocated from:
#0 0x7ff5db6989a7 in __interceptor_strdup 
../../../../src/libsanitizer/asan/asan_interceptors.cpp:454
#1 0x7ff5dad73c70 in nxmle_find_attribute 
(/lib/x86_64-linux-gnu/libnxml.so.0+0x5c70)

SUMMARY: AddressSanitizer: 376013 byte(s) leaked in 19 allocation(s).
```

Libmrss0 uses nxml0 internally. For the following program,

```c
int main(int argc, char **argv) {
  (void)argc, (void)argv;
  nxml_t *doc = NULL;

  FILE *rss = fopen("rss.xml", "r");
  fseek(rss, 0, SEEK_END);
  long len = ftell(rss);
  rewind(rss);

  char *str = malloc(len + 1);
  fread(str, len, 1, rss);
  fclose(rss);
  str[len] = 0;

  if (nxml_new() != NXML_OK)
return 1;
  nxml_parse_buffer(doc, str, len);
  nxml_free(doc);

  free(str);
  return 0;
}
```

built with

```
gcc -o out -fsanitize=address nxml_err.c -lnxml
```

the leak does not reproduce which makes me think the issue not related to
libnxml0.
If we modify the first program to parse an url instead,

```
mrss_parse_url("https://blog.demofox.org/rss.xml;, );
```

the error remains the same which makes me think the issue is not related
to libcurl.

According to libmrss0 sources
(https://github.com/bakulf/libmrss/blob/cc2f489ba698a2227065731b714905ab56b1de1a/test/parser.c#L27),
no invocation except `mrss_free` is required, so I believe
this is a bug indeed.


-- System Information:
Debian Release: bookworm/sid
  APT prefers jammy-updates
  APT policy: (500, 'jammy-updates'), (500, 'jammy-security'), (500, 'jammy'), 
(100, 'jammy-backports')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 5.15.0-25-generic (SMP w/12 CPU threads)
Kernel taint flags: TAINT_WARN
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages libmrss0 depends on:
ii  libc62.35-0ubuntu3.6
ii  libcurl3-gnutls  7.81.0-1ubuntu1.15
ii  libnxml0 0.18.4-1

libmrss0 recommends no packages.

libmrss0 suggests no packages.

-- no debconf information