From: Roumen Petrov <bugtrack@roumenpetrov.info>
To: cygwin@cygwin.com
Subject: program exit code, "at exit" handler and explicit close of shared objects
Date: Sat, 26 Oct 2019 15:07:00 -0000 [thread overview]
Message-ID: <a24efbf6-872e-1e5b-017a-b14c59d84550@roumenpetrov.info> (raw)
[-- Attachment #1: Type: text/plain, Size: 1372 bytes --]
Hello Cygwin developers,
This email is mainly for issue with exist code for a program.
It is inspired from openssl issue #10107 - "test_ssl_old freezes on
cygwin". Actually after one or another work-around "unfreeze" test and
this shows that one of subtests fail. This failure is main topic of this
email.
More about failed test "testing connection with weak DH, expecting
failure". So failure is expected and program code try to exit with 1.
Unfortunately OS returns zero exit code.
Since version 1.1 OpenSSL uses "at exit handler" to clean-up allocated
resources. Removing registered handler restores program exit code. So
something in handler triggers issue.
After additional tests (research) I was able to isolate issues to simple
test case. Please find attached "test-dlclose.c" and "Makefile".
First test is as is:
$ make
cc -g -Wall -Wextra test-dlclose.c -o test-dlclose
./test-dlclose
exit with code 33
make: [Makefile:4: all] Error 33 (ignored)
For next test change test-dlclose.c to define DLCLOSE_ATEXIT ( s/#if 0/#if 1/ ):
$ make
cc -g -Wall -Wextra test-dlclose.c -o test-dlclose
./test-dlclose
exit with code 33
As is visible make does not report error, i.e. program exit code is zero.
Is there a way to bypass issue?
For protocol:
$ uname -srvm -> CYGWIN_NT-10.0 3.0.7(0.338/5/3) 2019-04-30 18:08 x86_64
Regards,
Roumen Petrov
[-- Attachment #2: test-dlclose.c --]
[-- Type: text/x-csrc, Size: 701 bytes --]
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
void *handle = NULL;
#if 0
# define DLCLOSE_ATEXIT 1
#endif
#ifdef DLCLOSE_ATEXIT
static void
dlclose_atexit(void) {
if (dlclose(handle) != 0) {
fprintf(stderr, "dlclose fail : %s\n", dlerror());
}
}
#endif
int
main() {
handle = dlopen("libz.so", RTLD_LAZY | RTLD_NOW);
if (handle == NULL) {
fprintf(stderr, "dlopen fail : %s\n", dlerror());
return 1;
}
#ifndef DLCLOSE_ATEXIT
if (dlclose(handle) != 0) {
fprintf(stderr, "dlclose fail : %s\n", dlerror());
return 2;
}
#else
if (atexit(dlclose_atexit) != 0) {
fprintf(stderr, "atexit fail\n");
return 3;
}
#endif
printf("exit with code 33\n");
return 33;
}
[-- Attachment #3: Makefile --]
[-- Type: text/plain, Size: 62 bytes --]
CFLAGS = -g -Wall -Wextra
all: test-dlclose
-./test-dlclose
[-- Attachment #4: Type: text/plain, Size: 219 bytes --]
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
next reply other threads:[~2019-10-26 15:07 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-26 15:07 Roumen Petrov [this message]
2019-10-29 14:53 ` Ken Brown
2019-10-29 15:31 ` Ken Brown
2019-11-05 19:32 ` Roumen Petrov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a24efbf6-872e-1e5b-017a-b14c59d84550@roumenpetrov.info \
--to=bugtrack@roumenpetrov.info \
--cc=cygwin@cygwin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).