# Fail to copy argv on Win32?

**URL:** <https://www.ruby-forum.com/t/fail-to-copy-argv-on-win32/89964>\
**Category:** Development\
**Created:** [March 24, 2007, 6:59am UTC](https://www.ruby-forum.com/t/fail-to-copy-argv-on-win32/89964 "2007-03-24T06:59:26Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [March 24, 2007, 6:59am UTC](https://www.ruby-forum.com/t/fail-to-copy-argv-on-win32/89964/1 "2007-03-24T06:59:26Z")

</div>

e$B%o%J%Y$G$9!#e(B

trunke$B$Ne(Brev.12125e$B$re(Bmingw32e$B4D6-$G;n$7$?$H$3$m!"e(Bruby -e  
‘p “1”’ e$B$Ge(B  
unterminated string meets end of file e$B$H8@$o$l$F$7$^$$$^$7$?!#e(B  
e$B0l1~e(Brev.12124  
e$B$r;29M$K%Q%C%A$r=q$$$F$\_$?$N$G$9$,!"F0:n$rA4A3M}2r$G$-$F$$$J$$$N$Ge(B  
e$B$\*$+$7$J$3$H$r$7$F$$$k$+$b$7$l$^$;$s!#e(B

# Index: win32.c

— win32.c (revision 12125)  
+++ win32.c (working copy)  
@@ -1373,7 +1373,7 @@  
ptr = buffer + (elements+1) \* sizeof(char \*);

```
 while (curr = cmdhead) {

```

- strlcpy(ptr, curr-\>str, len - (elements + 1));

- strlcpy(ptr, curr-\>str, curr-\>len + 1);  
\*vptr++ = ptr;  
ptr += curr-\>len + 1;  
cmdhead = curr-\>next;

---

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [March 24, 2007, 4:50pm UTC](https://www.ruby-forum.com/t/fail-to-copy-argv-on-win32/89964/2 "2007-03-24T16:50:54Z")

</div>

e$B$J$+$@$G$9!#e(B

At Sat, 24 Mar 2007 14:58:36 +0900,  
wanabe wrote in [ruby-dev:30672]:

> trunke$B$Ne(Brev.12125e$B$re(Bmingw32e$B4D6-$G;n$7$?$H$3$m!"e(Bruby -e ‘p “1”’ e$B$Ge(B  
> unterminated string meets end of file e$B$H8@$o$l$F$7$^$$$^$7$?!#e(B  
> e$B0l1~e(Brev.12124 e$B$r;29M$K%Q%C%A$r=q$$$F$\_$?$N$G$9$,!"F0:n$rA4A3M}2r$G$-$F$$$J$$$N$Ge(B  
> e$B$\*$+$7$J$3$H$r$7$F$$$k$+$b$7$l$^$;$s!#e(B

e$B%Q%C%A\<+BN$O@5$7$$$H;W$$$^$9$,!"e(Bstrlcpy()e$B$de(Bstrlcat()e$B$r;H$&$Y$-e(B  
e$B$J$N$O!"LZB\<$5$s$NF|5-$+$i%j%s%/$5$l$F$$$k!Ve(BPythone$B$b4m$J$$e(B…e$B!We(B  
[1]e$B$G$b=q$+$l$F$$$k$H$\*$j!“8GDj%P%C%U%!$N\>l9g$G$9!#e(Bwin32.ce$B$N$he(B  
e$B$&$K!”%3%T!\<85$ND9$5$G%P%C%U%!$r3NJ]$7$F$=$ND9$5$G%3%T!\<$9$k$he(B  
e$B$&$J\>l9g$O!"e(Bmemcpy()e$B$G==J,$G$O$J$$$+$H;W$$$^$9$7!"e(Bstrdup()e$B$N$[e(B  
e$B$&$,E,@Z$J$3$H$bB?$$$N$G$O$J$$$G$7$g$&$+!#e(B

[1] [http://blog.ohgaki.net/index.php/yohgaki/2007/03/15/pythona\_a\_pa\_oa](http://blog.ohgaki.net/index.php/yohgaki/2007/03/15/pythona_a_pa_oa)

# Index: win32/win32.c

— win32/win32.c (revision 12127)  
+++ win32/win32.c (working copy)  
@@ -402,8 +402,5 @@ init\_env(void)  
return;  
}

- NTLoginName = (char \*)malloc(len+1);
- if (!NTLoginName) return;
- strlcpy(NTLoginName, env, len + 1);
- NTLoginName[len] = ‘\0’;

- NTLoginName = strdup(env);  
}

@@ -1057,8 +1054,7 @@ insert(const char \*path, VALUE vinfo)  
MEMZERO(tmpcurr, NtCmdLineElement, 1);  
tmpcurr-\>len = strlen(path);

- tmpcurr-\>str = (char \*)malloc(tmpcurr-\>len + 1);

- tmpcurr-\>str = strdup(path);  
if (!tmpcurr-\>str) return -1;  
tmpcurr-\>flags |= NTMALLOC;

- strlcpy(tmpcurr-\>str, path, tmpcurr-\>len + 1);  
\*\*tail = tmpcurr;  
\*tail = &tmpcurr-\>next;  
@@ -1085,5 +1081,5 @@ cmdglob(NtCmdLineElement \*patt, NtCmdLin  
if (!(buf = malloc(patt-\>len + 1))) return 0;

- strlcpy(buf, patt-\>str, patt-\>len + 1);

- memcpy(buf, patt-\>str, patt-\>len + 1);  
buf[patt-\>len] = ‘\0’;  
for (p = buf; \*p; p = CharNext(p))  
@@ -1374,5 +1370,5 @@ rb\_w32\_cmdvector(const char \*cmd, char \*

- strlcpy(ptr, curr-\>str, len - (elements + 1));

- memcpy(ptr, curr-\>str, curr-\>len + 1);  
\*vptr++ = ptr;  
ptr += curr-\>len + 1;  
@@ -1437,15 +1433,15 @@ rb\_w32\_opendir(const char \*filename)  
// Create the search pattern  
//

- len = strlen(filename) + 2 + 1;
- if (!(scanname = malloc(len))) {

- len = strlen(filename);
- if (!(scanname = malloc(len + 2 + 1))) {  
free(p);  
return NULL;  
}

- strlcpy(scanname, filename, len);

- memcpy(scanname, filename, len + 1);

- if (index(“/\:”, \*CharPrev(scanname, scanname + strlen(scanname)))  
== NULL)
- strlcat(scanname, “/\*”, len);

- if (index(“/\:”, \*CharPrev(scanname, scanname + len)) == NULL)
- memcpy(scanname + len, “/\*”, 2 + 1);  
else

- strlcat(scanname, “\*”, len);

- memcpy(scanname + len, “\*”, 1 + 1);

- strlcpy(p-\>start, fd.cFileName, idx);

- memcpy(p-\>start, fd.cFileName, idx);  
p-\>bits[0] = 0;  
if (fd.dwFileAttributes & FILE\_ATTRIBUTE\_DIRECTORY)  
@@ -1497,5 +1493,5 @@ rb\_w32\_opendir(const char \*filename)  
goto error;  
p-\>start = tmp;

- strlcpy(&p-\>start[idx], fd.cFileName, len);

- memcpy(&p-\>start[idx], fd.cFileName, len);

- strlcpy(dirp-\>dirstr.d\_name, dirp-\>curr, dirp-\>dirstr.d\_namlen + 1);

- memcpy(dirp-\>dirstr.d\_name, dirp-\>curr, dirp-\>dirstr.d\_namlen + 1);

- 

```
   buffer, 512, NULL) == 0)

```

- 

```
   buffer, sizeof(buffer), NULL) == 0)
 strlcpy(buffer, "Unknown Error", sizeof(buffer));

```

}  
@@ -3459,8 +3455,8 @@ rb\_w32\_stati64(const char \*path, struct  
\*end = ‘\0’;  
else if (\*end != ‘\’)

- 

```
 strlcat(buf1, "\\", size);

```

- 

```
 memcpy(buf1 + len, "\\", 2);

```

}  
else if (\*end == ‘\’ || (buf1 + 1 == end && \*end == ‘:’))

- strlcat(buf1, “.”, size);

- memcpy(buf1 + len, “.”, 2);

- 

```
 int len = strlen(env) + 1;

```

- 

```
 if (!(*myenv = (char *)malloc(len))) {

```

- 

```
 if (!(*myenv = strdup(env))) {

```

break;  
}

- 

```
 strlcpy(*myenv, env, len);
 myenv++;

```

}
