[#107765] [Ruby master Bug#18605] Fails to run on (newer) 32bit Windows with ucrt — "lazka (Christoph Reiter)" <noreply@...>

Issue #18605 has been reported by lazka (Christoph Reiter).

8 messages 2022/03/03

[#107769] [Ruby master Misc#18609] keyword decomposition in enumerable (question/guidance) — "Ethan (Ethan -)" <noreply@...>

Issue #18609 has been reported by Ethan (Ethan -).

10 messages 2022/03/04

[#107784] [Ruby master Feature#18611] Promote best practice for combining multiple values into a hash code — "chrisseaton (Chris Seaton)" <noreply@...>

Issue #18611 has been reported by chrisseaton (Chris Seaton).

12 messages 2022/03/07

[#107791] [Ruby master Bug#18614] Error (busy loop) inTestGemCommandsSetupCommand#test_destdir_flag_does_not_try_to_write_to_the_default_gem_home — duerst <noreply@...>

Issue #18614 has been reported by duerst (Martin D端rst).

7 messages 2022/03/08

[#107794] [Ruby master Feature#18615] Use -Werror=implicit-function-declaration by deault for building C extensions — "Eregon (Benoit Daloze)" <noreply@...>

Issue #18615 has been reported by Eregon (Benoit Daloze).

11 messages 2022/03/08

[#107832] [Ruby master Bug#18622] const_get still looks in Object, while lexical constant lookup no longer does — "Eregon (Benoit Daloze)" <noreply@...>

Issue #18622 has been reported by Eregon (Benoit Daloze).

16 messages 2022/03/10

[#107847] [Ruby master Bug#18625] ruby2_keywords does not unmark the hash if the receiving method has a *rest parameter — "Eregon (Benoit Daloze)" <noreply@...>

Issue #18625 has been reported by Eregon (Benoit Daloze).

13 messages 2022/03/11

[#107886] [Ruby master Feature#18630] Introduce general `IO#timeout` and `IO#timeout=`for all (non-)blocking operations. — "ioquatix (Samuel Williams)" <noreply@...>

Issue #18630 has been reported by ioquatix (Samuel Williams).

28 messages 2022/03/14

[#108026] [Ruby master Feature#18654] Enhancements to prettyprint — "kddeisz (Kevin Newton)" <noreply@...>

Issue #18654 has been reported by kddeisz (Kevin Newton).

9 messages 2022/03/22

[#108039] [Ruby master Feature#18655] Merge `IO#wait_readable` and `IO#wait_writable` into core — "byroot (Jean Boussier)" <noreply@...>

Issue #18655 has been reported by byroot (Jean Boussier).

10 messages 2022/03/23

[#108056] [Ruby master Bug#18658] Need openssl 3 support for Ubuntu 22.04 (Ruby 2.7.x and 3.0.x) — "schneems (Richard Schneeman)" <noreply@...>

Issue #18658 has been reported by schneems (Richard Schneeman).

19 messages 2022/03/24

[#108075] [Ruby master Bug#18663] Autoload doesn't work with fiber context switch. — "ioquatix (Samuel Williams)" <noreply@...>

Issue #18663 has been reported by ioquatix (Samuel Williams).

10 messages 2022/03/25

[#108117] [Ruby master Feature#18668] Merge `io-nonblock` gems into core — "Eregon (Benoit Daloze)" <noreply@...>

Issue #18668 has been reported by Eregon (Benoit Daloze).

22 messages 2022/03/30

[ruby-core:107871] [Ruby master Bug#18388] IO.copy_stream incompatibility between Ruby 2 and Ruby 3

From: "nagachika (Tomoyuki Chikanaga)" <noreply@...>
Date: 2022-03-13 06:42:50 UTC
List: ruby-core #107871
Issue #18388 has been updated by nagachika (Tomoyuki Chikanaga).

Backport changed from 2.6: DONTNEED, 2.7: REQUIRED, 3.0: REQUIRED to 2.6: DONTNEED, 2.7: REQUIRED, 3.0: DONE

ruby_3_0 f4f0c793f6eb427b0a85445bff49fdc6b73447ae merged revision(s) b555e659c4974acc423083b71b1bd5ec6a926046.

----------------------------------------
Bug #18388: IO.copy_stream incompatibility between Ruby 2 and Ruby 3
https://bugs.ruby-lang.org/issues/18388#change-96812

* Author: yaojingguo (Jingguo Yao)
* Status: Closed
* Priority: Normal
* ruby -v: ruby 3.1.0dev (2021-12-04T07:20:30Z hack 4a6ca12904) [x86_64-darwin19]
* Backport: 2.6: DONTNEED, 2.7: REQUIRED, 3.0: DONE
----------------------------------------
Put `test.rb`, `src` and dst in the same directory:

`test.rb` file:
``` ruby
src = "src"
dst = "dst"
File.open(dst, "ab", 0644) do |dst|
  File.open(src, 'rb', 0644) do |src|
    puts "src size: #{src.size()}, dst size: #{dst.size()}"
    count = IO.copy_stream(src, dst)
    puts "count: #{count}"
  end
end
```

`src` file (file size is 3):
```
789
```

`dst` file (file size is 1):
```
2
```

Run `test.rb` with Ruby 2.6, the content of the resulted `dst` is:
```
2789
```
So the content of `src` is appended to `dst` with Ruby 2.6. In other words,
Open mode "a" is honored.

Run `test.rb` with Ruby 3, the content of the resulted `dst` is:
```
278
```
This behavior is different from Ruby 2.6.

The cause of the problem is `IO.copy_stream` uses `fcopyfile` function for Ruby 3.
If the following code from `io.c` is commented out, Ruby 3 has the same behavior
as Ruby 2.6.
```C
#ifdef HAVE_FCOPYFILE
    ret = nogvl_fcopyfile(stp);
    if (ret != 0)
        goto finish; /* error or success */
#endif
```

[copyfile](https://keith.github.io/xcode-man-pages/copyfile.3.html):
```C
int fcopyfile(int from, int to, copyfile_state_t state, copyfile_flags_t flags);
```

`fcopyfile` appends `src` to `to` and then truncates `to` to it's original size.
The following code shows this behavior:

```C
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <copyfile.h>

int main() {
	copyfile_state_t state;
	state = copyfile_state_alloc();

	int to;
	to = open("to", O_APPEND | O_WRONLY, 0644);	
	if (to < 0) {
		perror("open to");
		return 1;
	}

	int from;
	from = open("from", O_RDONLY);
	if (from < 0) {
		perror("open from");
		return 1;
	}

	int ret;
	ret = fcopyfile(from, to, state, COPYFILE_DATA);
	if (ret != 0) {
		perror("fcopyfile");
		return 1;
	}

	off_t copied;
	ret = copyfile_state_get(state, COPYFILE_STATE_COPIED, &copied);
	if (ret != 0) {
		perror("copyfile_state_get");
		return 1;
	}
	printf("copied: %lld\n", copied);

	copyfile_state_free(state);
}

```

The following table summarizes the results after running the above code:

|`from` | `to` | `to` after `fcopyfile`  |
|--|--|--|
| 789 | 2   | 278 |
| 1   | 2   | 2   |
| 1   | 234 | 2   |


If this problem should be fixed, I am willing to do it provided with some
guidance from the community.

 
Here is the detailed version information:

- Ruby 2.6 version: 

```
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin19]
```

- Ruby 3 version

```
ruby 3.1.0dev (2021-12-04T07:20:30Z master 4a6ca12904) [x86_64-darwin19]
```
- OS: macOS 10.15.5




-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next