DKIM-Filter: OpenDKIM Filter v2.11.0 delorie.com 48MI9mYc1294975 Authentication-Results: delorie.com; dkim=pass (1024-bit key, unprotected) header.d=cygwin.com header.i=@cygwin.com header.a=rsa-sha256 header.s=default header.b=or3KjKw9 X-Recipient: archive-cygwin AT delorie DOT com DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BE53A3858D3C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cygwin.com; s=default; t=1727028586; bh=8jaolPDwsYaxk/kCz3T8y0u8xLJOD1XoVqcTEEZ8LHI=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=or3KjKw9HRhrvJv60wAF4AQE2Kl49rAmX3JNYttwQiE/Hx4BT8brT47NB3tCFkWXK PsTN/tIST2fBG7ie5zulJ6U96+SdN+Ay7G+IkJ9SmZ94q1T9GnuUoFtPl/7nWqfokP XeTBwpw8A3IvxIdnds5pKrC0ySwVRYv6l2w/HeSM= X-Original-To: cygwin AT cygwin DOT com Delivered-To: cygwin AT cygwin DOT com DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6E9F13858D20 ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 6E9F13858D20 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1727028564; cv=none; b=i6mbEFsAvfV57klq9MnWig5dClVQc7eoWTt+azuiIHvbWdTP/eNCoEZ43AArT+gg//0FKBdInezFj7jLuw1qvb9WmBTwh77x/fombLVSW0FukefhY2jFLx6xlVvjtyFmcPbpOJQvsp3VkEsbIXcU1/8V2GH/r5b6RsRU4+CZ0kI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1727028564; c=relaxed/simple; bh=tvG3MDNrTe65d932OZ+Udwb8kC6E0ftsIrgqNtKdBrI=; h=To:From:Subject:Message-ID:Date:MIME-Version; b=xqvdMWRSRmW+BzhhUstXHnshuL/0juNeuRd8Qy1PfWlQH3F1suLH4CxVpWaRY23jAfNzgze9MtFoYBC0f+kLvOGOV84U/nmFJOUPjvhvIQ96M1JLf3HhVukazYdKk0lW84lmdS930NqpBKuJ+ZUhnDjJebZK+OjtcZapKzuJyj4= ARC-Authentication-Results: i=1; server2.sourceware.org To: cygwin AT cygwin DOT com Subject: pread()/pwrite() fail with EBADF in child process if already used before fork() Message-ID: <13e3c5b1-3c7b-acc4-469e-0542d50cb6f6@t-online.de> Date: Sun, 22 Sep 2024 20:09:16 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 SeaMonkey/2.53.18.2 MIME-Version: 1.0 X-TOI-EXPURGATEID: 150726::1727028556-4FFFD5E0-4CA0440B/0/0 CLEAN NORMAL X-TOI-MSGID: 5819f59f-4d64-4488-89f1-e4b85a7410d5 X-Spam-Status: No, score=-2.2 required=5.0 tests=BAYES_00, BODY_8BITS, FREEMAIL_FROM, KAM_DMARC_STATUS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: cygwin AT cygwin DOT com X-Mailman-Version: 2.1.30 List-Id: General Cygwin discussions and problem reports List-Archive: List-Post: List-Help: List-Subscribe: , From: Christian Franke via Cygwin Reply-To: cygwin AT cygwin DOT com Cc: Christian Franke Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "Cygwin" Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by delorie.com id 48MI9mYc1294975 Found during test of 'stress-ng --pseek ...' from current upstream stress-ng git HEAD: Testcase: $ uname -r 3.5.4-1.x86_64 $ cat pfail.c #include #include #include #include int main() {   int fd = open("pwrite.tmp", O_RDWR|O_CREAT|O_BINARY, 0666);   if (fd < 0) {     perror("open"); return 1;   }   char c = 42;   if (pwrite(fd, &c, 1, 0) < 0)     perror("pwrite");   if (fork() == 0) {     if (pread(fd, &c, 1, 0) < 0)       perror("pread");     _exit(0);   }   int status;   wait(&status);   return 0; } $ make pfail cc     pfail.c   -o pfail $ ./pfail pread: Bad file descriptor $ strace ./pfail ...   617   75356 [main] pfail 10826 dofork: 10827 = fork()    82   11289 [main] pfail 10827 seterrno_from_nt_status: /usr/src/debug/cygwin-3.5.4-1/winsup/cygwin/fhandler/disk_file.cc:1883 status 0xC0000008 -> windows error 6    80   75436 [main] pfail 10826 wait4: calling proc_subproc, pid -1, options 0    76   11365 [main] pfail 10827 geterrno_from_win_error: windows error 6 == errno 9    78   75514 [main] pfail 10826 proc_subproc: args: 5, -7728    64   11429 [main] pfail 10827 pread: -1 = pread(3, 0x7FFFFCC0B, 1, 0), errno 9 ... The problem does not occur if there is no pread()/pwrite() before the fork(). This suggests that the child process inherits the extra handle value used to keep the original seek position, but not the actual handle. -- Regards, Christian -- Problem reports: https://cygwin.com/problems.html FAQ: https://cygwin.com/faq/ Documentation: https://cygwin.com/docs.html Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple