summaryrefslogtreecommitdiffstats
path: root/ext/socket
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-08-01 09:42:38 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-08-01 09:42:38 +0000
commita544c0bc23352d2c09a02df807c0e5ce2e6e0647 (patch)
tree2e4f554d0934713e09fe4c4cc9ddd3b48a9dee2f /ext/socket
parent2927a4d35e8ba874e543de8a1b4ebfbf9f608226 (diff)
downloadruby-a544c0bc23352d2c09a02df807c0e5ce2e6e0647.tar.gz
ruby-a544c0bc23352d2c09a02df807c0e5ce2e6e0647.tar.xz
ruby-a544c0bc23352d2c09a02df807c0e5ce2e6e0647.zip
* parse.y (tokadd_string): ignore backslashed spaces in %w.
* enum.c (enum_find): do not use rb_eval_cmd(); should not accept a string for if_none. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@2679 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/socket')
-rw-r--r--ext/socket/socket.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index eb99695a9..1e91c38c6 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -434,6 +434,7 @@ s_recvfrom(sock, argc, argv, from)
char buf[1024];
socklen_t alen = sizeof buf;
VALUE len, flg;
+ long slen;
int fd, flags;
rb_scan_args(argc, argv, "11", &len, &flg);
@@ -447,16 +448,16 @@ s_recvfrom(sock, argc, argv, from)
}
fd = fileno(fptr->f);
- str = rb_tainted_str_new(0, NUM2INT(len));
+ slen = NUM2INT(len);
+ str = rb_tainted_str_new(0, slen);
retry:
rb_thread_wait_fd(fd);
TRAP_BEG;
- RSTRING(str)->len = recvfrom(fd, RSTRING(str)->ptr, RSTRING(str)->len, flags,
- (struct sockaddr*)buf, &alen);
+ slen = recvfrom(fd, RSTRING(str)->ptr, slen, flags, (struct sockaddr*)buf, &alen);
TRAP_END;
- if (RSTRING(str)->len < 0) {
+ if (slen < 0) {
switch (errno) {
case EINTR:
rb_thread_schedule();
@@ -464,6 +465,10 @@ s_recvfrom(sock, argc, argv, from)
}
rb_sys_fail("recvfrom(2)");
}
+ if (slen < RSTRING(str)->len) {
+ RSTRING(str)->len = slen;
+ RSTRING(str)->ptr[slen] = '\0';
+ }
rb_obj_taint(str);
switch (from) {
case RECV_RECV: