delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2000/06/26/12:03:15

Mailing-List: contact cygwin-help AT sourceware DOT cygnus DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT sourceware DOT cygnus DOT com>
List-Archive: <http://sourceware.cygnus.com/ml/cygwin/>
List-Post: <mailto:cygwin AT sourceware DOT cygnus DOT com>
List-Help: <mailto:cygwin-help AT sourceware DOT cygnus DOT com>, <http://sourceware.cygnus.com/ml/#faqs>
Sender: cygwin-owner AT sourceware DOT cygnus DOT com
Delivered-To: mailing list cygwin AT sourceware DOT cygnus DOT com
From: Chris Faylor <cgf AT cygnus DOT com>
Date: Mon, 26 Jun 2000 11:28:01 -0400
To: cygwin AT sourceware DOT cygnus DOT com
Subject: Re: cygwin1.dll (v1.1.2): dup2() with invalid newfd lead to exception: STATUS_ACCESS_VIOLATION
Message-ID: <20000626112801.D1064@cygnus.com>
Reply-To: cygwin AT sourceware DOT cygnus DOT com
Mail-Followup-To: cygwin AT sourceware DOT cygnus DOT com
References: <39575D69 DOT A83E2E12 AT kbotd DOT ru>
Mime-Version: 1.0
User-Agent: Mutt/1.2i
In-Reply-To: <39575D69.A83E2E12@kbotd.ru>; from trush@kbotd.ru on Mon, Jun 26, 2000 at 05:40:58PM +0400

On Mon, Jun 26, 2000 at 05:40:58PM +0400, Alexander Trush wrote:
>I have loaded the last version of the environment CygWin and attempted
>to compile SQUID-2.3.STABLE3. In the configurator SQUID there is a piece
>of the code: " checking Maximum number of filedescriptors we can open ",
>this code utillize the function dup2(), which one with invalid value of
>argument reduces to in crash of the program instead of returning an
>error code.

It was a problem with an out of bounds "new fd".  I've checked in a patch
to fix this.  It will be in the next snapshot and also in the next net release.

Thanks for the bug report and, most importantly for a relatively simple test
case so that we didn't have to guess about what was wrong.

cgf

>Piece of this code:
>
>#include "confdefs.h"
>
>#include <stdio.h>
>#include <unistd.h>
>#include <sys/time.h>   /* needed on FreeBSD */
>#include <sys/param.h>
>#include <sys/resource.h>
>main() {
>        FILE *fp;
>        int i,j;
>#if __CYGWIN32__
>    /* getrlimit and sysconf returns bogous values on cygwin32.
>     * Number of fds is virtually unlimited in cygwin (sys/param.h)
>     */
>    i = NOFILE;
>#elif HAVE_SETRLIMIT
>    struct rlimit rl;
>#if defined(RLIMIT_NOFILE)
>    if (getrlimit(RLIMIT_NOFILE, &rl) < 0) {
>        perror("getrlimit: RLIMIT_NOFILE");
>    } else {
>        rl.rlim_cur = rl.rlim_max;      /* set it to the max */
>        if (setrlimit(RLIMIT_NOFILE, &rl) < 0) {
>            perror("setrlimit: RLIMIT_NOFILE");
>        }
>    }
>#elif defined(RLIMIT_OFILE)
>    if (getrlimit(RLIMIT_OFILE, &rl) < 0) {
>        perror("getrlimit: RLIMIT_OFILE");
>    } else {
>        rl.rlim_cur = rl.rlim_max;      /* set it to the max */
>        if (setrlimit(RLIMIT_OFILE, &rl) < 0) {
>            perror("setrlimit: RLIMIT_OFILE");
>        }
>    }
>#endif /* RLIMIT_NOFILE */
>#endif /* HAVE_SETRLIMIT */
>        /* by starting at 2^14, we will never get higher
>        than 2^15 for SQUID_MAXFD */
>        i = j = 1<<14;
>        while (j) {
>                j >>= 1;
>                if (dup2(0, i) < 0) {
>                        i -= j;
>                } else {
>                        close(i);
>                        i += j;
>                }
>        }
>        i++;
>        fp = fopen("conftestval", "w");
>        fprintf (fp, "%d\n", i);
>        exit(0);
>}
>
>
>
>
>The elementary test routine resulting in to the same result (under
>Borland 5.02 all is correct - " Ret val =-1, errno=0 "):
>
>
>test.c:
>-------
>#include <stdio.h>
>#include <io.h>
>#include <errno.h>
>
>void main(void)
>{
>        printf("Ret val=%d, errno=%d", dup2(0, 1<<14), errno);
>}
>
>
>
>bash-2.04$ cd /usr/src/squid-2.3.STABLE3
>bash-2.04$ gcc test.c -o test.exe
>test.c: In function `main':
>test.c:6: warning: return type of `main' is not `int'
>bash-2.04$ ./test.exe
>      0 [main] test 1008 handle_exceptions: Exception:
>STATUS_ACCESS_VIOLATION
>   1392 [main] test 1008 stackdump: Dumping stack trace to
>test.exe.stackdump
>bash-2.04$
>
>
>test.exe.stackdump:
>-------------------
>Exception: STATUS_ACCESS_VIOLATION at eip=6101F19A
>eax=0A040E08 ebx=FFFFFFFF ecx=7FFDE000 edx=61084BE8 esi=00004000
>edi=0A0416B8
>ebp=0246FE5C esp=0246FE40
>program=c:\CygWIN\usr\src\squid-2.3.STABLE3\test.exe
>cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023
>Stack trace:
>Frame     Function  Args
>0246FE5C  6102F23B  (61084BE8, 00000000, 00004000, 0247273B)
>0246FE7C  6102F23B  (00000000, 00004000, 0246FEC8, 0246FEA4)
>0246FEA4  0040107F  (00000001, 0A041688, 0A040008, 00000000)
>0246FF00  61002385  (7FFDF000, 00000000, 0247DF10, 77F9D0E8)
>0246FF60  610027D5  (00403010, C0059000, 0246FF90, 004011BA)
>0246FF90  004011C7  (00401058, 815C04C0, 00000246, 801174E1)
>0246FFC0  0040103B  (0247DF10, 00000000, 7FFDF000, 7FFDF000)
>0246FFF0  77F1B9EA  (00401000, 00000000, 000000B0, 00000100)
>End of stack trace
>

-- 
cgf AT cygnus DOT com                        Cygnus Solutions, a Red Hat company
http://sourceware.cygnus.com/         http://www.redhat.com/

--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe AT sourceware DOT cygnus DOT com

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019