Linus
10-02-2019, 18:56
Bei dem Programm dupmerge, von https://sourceforge.net/projects/dupmerge/files/, habe ich seit kurzem das Problem, das strndup() nicht mehr genügend Speicher bekommt und Null-Pointer zurückgibt.
Das tritt auf an der Stelle, an der die Dateinamen in Datenfelder eingelesen werden:
if ((NULL == (names[i] = strndup (buf, BUFSIZ))) or (NULL == (a_names[i] = strndup (buf, BUFSIZ))))
{
(void) fprintf (stderr, "%s: Out of memory, ((NULL == (names[i] = strndup (buf, BUFSIZ))) or (NULL == (a_names[i] = strndup (buf, BUFSIZ))))\n", argv[0]);
(void) fprintf (stderr, " i=%d, j=%d, names[i]=%p, a_names[i]=%p\n", i, j, names[i], a_names[i]);
exit (1);
}
Das zeigt:
dupmerge: Out of memory, ((NULL == (names[i] = strndup (buf, BUFSIZ))) or (NULL == (a_names[i] = strndup (buf, BUFSIZ))))
i=29909, j=35, names[i]=(nil), a_names[i]=(nil)
Also bei circa 1 MB ist plötzlich Schluß.
Woran liegt das und wie bekomme ich das Limit wieder weg?
ulimits zeigt mir "unlimited", also keine expliziten Limits.
Das tritt auf an der Stelle, an der die Dateinamen in Datenfelder eingelesen werden:
if ((NULL == (names[i] = strndup (buf, BUFSIZ))) or (NULL == (a_names[i] = strndup (buf, BUFSIZ))))
{
(void) fprintf (stderr, "%s: Out of memory, ((NULL == (names[i] = strndup (buf, BUFSIZ))) or (NULL == (a_names[i] = strndup (buf, BUFSIZ))))\n", argv[0]);
(void) fprintf (stderr, " i=%d, j=%d, names[i]=%p, a_names[i]=%p\n", i, j, names[i], a_names[i]);
exit (1);
}
Das zeigt:
dupmerge: Out of memory, ((NULL == (names[i] = strndup (buf, BUFSIZ))) or (NULL == (a_names[i] = strndup (buf, BUFSIZ))))
i=29909, j=35, names[i]=(nil), a_names[i]=(nil)
Also bei circa 1 MB ist plötzlich Schluß.
Woran liegt das und wie bekomme ich das Limit wieder weg?
ulimits zeigt mir "unlimited", also keine expliziten Limits.