freetds AT lists.ibiblio.org
Subject: FreeTDS Development Group
List archive
- From: Frediano Ziglio <freddy77 AT gmail.com>
- To: FreeTDS Development Group <freetds AT lists.ibiblio.org>
- Subject: Re: [freetds] ENOMEM vs. errno
- Date: Thu, 06 Dec 2007 19:04:31 +0100
Il giorno gio, 06/12/2007 alle 12.06 -0500, James K. Lowden ha scritto:
> Hi Freddy,
>
> I'm surprised by
>
> $Id: dblib.c,v 1.312 2007/12/06 07:52:17 freddy77 Exp $
>
> which replaces all
> dbperror(dbproc, SYBEMEM, errno);
> with
> dbperror(dbproc, SYBEMEM, ENOMEM);
>
> Was yesterday's discussion unclear?
>
> If malloc fails, it must set errno to ENOMEM.
>
> If malloc does not set errno to ENOMEM, the application should deal with
> it.
>
> db-lib's job in this case is only to convey what malloc(3) said. If
> malloc returned NULL and didn't set errno to ENOMEM, that's not db-lib's
> problem. That's for the application to settle with malloc(3). If the
> application cannot rely on malloc to set errno, it has enough information
> from SYBEMEM.
>
> By hard-coding ENOMEM, you are hiding what actually happened, potentially
> lying to the application.
>
> Remember the application is written in C, too, and uses malloc all the
> time. It knows how to recognize malloc failures. Win32 even has
> _set_new_mode() to control how allocation errors are handled. I think it
> sets errno by default. (The docs don't say so, but they do list ENOMEM as
> one of the supported errno values.)
>
> Would you kindly revert to 1.311?
>
> Thanks. If I'm overlooking something, just say so.
>
> Regards,
>
> --jkl
>
I compiled this program with MingW
#include <stdio.h>
#include <stdlib.h>
int main()
{
void *p1, *p2, *p3;
p1 = malloc(0x20000000u);
p2 = malloc(0x20000000u);
errno = 123;
p3 = malloc(0x20000000u);
printf("%p %p %p %d\n", p1, p2, p3, errno);
return 0;
}
And it output
00540020 00000000 00000000 123
:(
MingW use the "old" msvcrt.dll (Visual C++ 2005 use a new version). As
Chistos says malloc can set errno only to ENOMEM so I think that
replacing errno with ENOMEM at the end just remove a problem with
no-compliant (and existing) malloc implementations.
Another way to fix this issue would be to have somthing like
#ifdef WIN32
/* fix errno setting in some windows malloc implementations */
if (msgno == SYBEMEM)
errnum = ENOMEM;
#endif
Would you prefer this change?
freddy77
-
[freetds] ENOMEM vs. errno,
James K. Lowden, 12/06/2007
-
Re: [freetds] ENOMEM vs. errno,
Frediano Ziglio, 12/06/2007
-
Re: [freetds] ENOMEM vs. errno,
Christos Zoulas, 12/06/2007
-
Re: [freetds] ENOMEM vs. errno,
Frediano Ziglio, 12/06/2007
- Re: [freetds] ENOMEM vs. errno, James K. Lowden, 12/07/2007
-
Re: [freetds] ENOMEM vs. errno,
Frediano Ziglio, 12/06/2007
-
Re: [freetds] ENOMEM vs. errno,
Christos Zoulas, 12/06/2007
-
Re: [freetds] ENOMEM vs. errno,
Frediano Ziglio, 12/06/2007
Archive powered by MHonArc 2.6.24.